全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
楼主: maxkvm

shell根据数组元素获取下标

[复制链接]
发表于 2023-3-31 22:35:08 | 显示全部楼层
遍历再判断一下呗,没有好的方法
 楼主| 发表于 2023-3-31 22:39:26 | 显示全部楼层
gundam06ms 发表于 2023-3-31 22:29
你说的不清不楚,会重复吗?是大小排列好的么?

不必大小排列,就是我说的自定义排列
 楼主| 发表于 2023-3-31 22:40:45 | 显示全部楼层
yanzhiling2002 发表于 2023-3-31 22:25
不好意思,没看清楚要求

我能想到的就是键值对用shell操作比较麻烦

所以根据元素求下标是没有这种操作吗?
 楼主| 发表于 2023-3-31 22:42:30 | 显示全部楼层
yanzhiling2002 发表于 2023-3-31 22:28
我给你问了一下chatgpt

在shell中,可以使用数组来存储元素,并使用循环结构来查找元素对应的下标。 例如 ...

chatgpt完全帮不上忙,它说的还是根据下标求元素,这个不用它来回答,反过来根据元素求下标呢?
发表于 2023-3-31 23:15:41 | 显示全部楼层
maxkvm 发表于 2023-3-31 22:42
chatgpt完全帮不上忙,它说的还是根据下标求元素,这个不用它来回答,反过来根据元素求下标呢? ...

shell里已知数组为a=(14 25 39 46 52),那么如何获取元素39的数组下标?
在bash shell中,您可以使用以下脚本找到数组中特定值的索引:

a=(14 25 39 46 52)
value=39
index=-1

for i in "${!a[@]}"; do
    if [ "${a}" -eq "$value" ]; then
        index=$i
        break
    fi
done

echo "Index of $value is $index"

这个脚本首先定义了一个数组a和一个要查找的值value。我们将index初始化为-1,表示尚未找到该值。然后,我们用for循环遍历数组,并使用${!a[@]}获取数组的所有索引。当找到等于value的元素时,我们将index设置为当前索引并退出循环。最后,我们输出找到的索引。在这个例子中,它将输出Index of 39 is 2,因为39位于数组的第2个位置(索引从0开始)。

答案跟上边类似的,就是先把元素遍历出来然后再依次去比较,没想到还挺麻烦的,shell里的编程根本懒得记,以后都去问chatgpt好了
发表于 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处理了。
发表于 2023-4-1 10:14:35 | 显示全部楼层
本帖最后由 coolloves 于 2023-4-1 10:20 编辑

a=(14 25 39 46 46 52)
target=46

declare -A map
for i in "${!a[@]}"; do
  if [ ${map[${a[$i]}]+_} ]; then
    map["${a[$i]}"]="${map[${a[$i]}]},$i"
  else
    map["${a[$i]}"]=$i
  fi
done

if [ ${map[$target]+_} ]; then
  echo "Target $target found at index ${map[$target]}"
else
  echo "Target $target not found in array"
fi


先转成字典.之后查询字典即可.
为了考虑a中有重复数值,做个判断,把这个值的所有位置汇总下


    遍历一次是不可避免的,多次判断才有意义

                                            本人专属,你瞅啥?  
    发表于 2023-4-1 10:55:29 | 显示全部楼层
    本帖最后由 dvbhack 于 2023-4-1 10:56 编辑
    1. #!/bin/bash

    2. function get_index {
    3.     local a=("$@")
    4.     local input=$1
    5.     local indices=()

    6.     for i in "${!a[@]}"; do
    7.         if [[ "${a[i]}" == "$input" ]]; then
    8.             indices+=("$i")
    9.         fi
    10.     done

    11.     if [[ ${#indices[@]} -eq 0 ]]; then
    12.         echo "-1"
    13.     else
    14.         echo "${indices[*]}"
    15.     fi
    16. }

    17. # Example usage:
    18. a=(1 2 3 4 5 3 4)
    19. idx=$(get_index "${a[@]}" 3)
    20. echo "Indices: $idx"
    复制代码


    单个元素的,例如查询 "2",返回 "1"
    多个相同元素的,例如查询 "3",返回 "2,5"
     楼主| 发表于 2023-4-1 12:18:20 | 显示全部楼层
    irony 发表于 2023-3-31 23:15
    shell里已知数组为a=(14 25 39 46 52),那么如何获取元素39的数组下标?
    在bash shell中,您可以使用以下脚 ...

    非常感谢你使用chatgpt获取到了解答方案,不过chatgpt只能提供一个解决问题的思路,chatgpt给出的脚本有两个错误,index不需预先赋值,"${a}"是错误写法,应该是"${a[$i]}",正确的脚本如下

    #!/bin/bash
    #
    a=(14 25 39 46 52)
    value=39
    for i in ${!a[@]}
    do
        #if [[ ${a[$i]} -eq $value ]]
        if ((${a[$i]}==$value))
        then
            break
        fi
    done
    echo "Index of $value is $i"
     楼主| 发表于 2023-4-1 12:28:01 | 显示全部楼层
    dvbhack 发表于 2023-4-1 10:55
    单个元素的,例如查询 "2",返回 "1"
    多个相同元素的,例如查询 "3",返回 "2,5" ...

    你的脚本真的很有大佬风范,又是函数又是传递变量参数,不过有一个最简洁明了的写法,可以同时输出相同元素的不同下标值,如下

    #!/bin/bash
    #
    a=(1 2 3 4 5 3 4)
    value=4
    #value=3
    for i in ${!a[@]}
    do
        #if [[ ${a[$i]} -eq $value ]]
        if ((${a[$i]}==$value))
        then
            echo "Index of $value is $i"
        fi
    done
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

    GMT+8, 2024-5-16 03:22 , Processed in 0.096962 second(s), 8 queries , Gzip On, MemCache On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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