全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1942|回复: 24
打印 上一主题 下一主题

shell根据数组元素获取下标

[复制链接]
1#
发表于 2023-3-31 22:29:42 | 显示全部楼层
你说的不清不楚,会重复吗?是大小排列好的么?
2#
发表于 2023-4-1 06:07:03 | 显示全部楼层
本帖最后由 gundam06ms 于 2023-4-1 06:21 编辑
maxkvm 发表于 2023-3-31 22:42
chatgpt完全帮不上忙,它说的还是根据下标求元素,这个不用它来回答,反过来根据元素求下标呢? ...


chatgpt给的答案没问题的,你再仔细看看,一时间也只能想到遍历一遍。
  1. #!/bin/bash

  2. #声明数组
  3. foo=("apple" "banana" "orange" "pear" "peach" "orange")
  4. #查找叫做"orange"的元素(遍历数组,如果元素第一次出现即返回结果)
  5. element="orange"
  6. #found为1说明没找到,found为0说明找到了
  7. found=1
  8. for i in "${!foo[@]}"; do
  9.         #$i 是数组下标
  10.         #${foo[i]} 是foo[i]对应元素
  11.         if [[ "${foo[$i]}" = "${element}" ]]; then
  12.                 echo "元素 ${element} 的下标为 ${i}" && found=0 && break
  13.         fi
  14. done
  15. if [[ "${found}" -ne 0 ]]; then echo "没有找到元素 ${element}"; fi
复制代码


不同的shell和版本语法有不同的地方,更复杂的任务建议用python处理了。
3#
发表于 2023-4-1 18:22:40 | 显示全部楼层
本帖最后由 gundam06ms 于 2023-4-1 18:25 编辑
maxkvm 发表于 2023-4-1 13:56
谢谢给出参考脚本,不过,你的脚本中的break命令直接中断了再次判断指定元素的下一次循环,因此只能判断 ...


看不太懂你写的,不过你的需求可以这样改。高版本的bash和其他shell(zsh、fish)有更复杂的功能。如果你不是一次性查找,可以使用map结构记录不然效率太差了,虽然对于shell高手来说小菜一碟,不过考虑兼容性还是建议找个python之类的语言处理...       
  1. #!/bin/bash
  2. #版本: bash 4+

  3. #声明数组foo
  4. foo=("apple" "banana" "orange" "pear" "peach" "orange"\
  5.     "melon" "coconut" "orange" "orange" "melon" "orange")
  6. #查找元素,并将所有符合的元素对应下表放入result数组
  7. element="orange"
  8. #element="pineapple"
  9. declare -a result=()

  10. for i in "${!foo[@]}"; do
  11.         if [ "${foo[$i]}" = "${element}" ]; then
  12.                 #echo "元素 ${element} 命中下标 ${i}"
  13.                 result+=(${i})
  14.         fi
  15. done

  16. if [ ${#result[@]} -eq 0 ]; then
  17.     echo "没有符合元素的下标!"
  18. else
  19.     #result[@]会把数组里所有元素展开成参数
  20.     #printf格式化打印自行百度
  21.     printf '元素 %s 命中了下标:' "${element}"
  22.     printf '%s ' "${result[@]}"
  23.     printf '\n'
  24. fi
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-16 10:19 , Processed in 0.063727 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表