use*_*369 53 arrays indexing bash
我有什么bash
样
myArray=('red' 'orange' 'green')
Run Code Online (Sandbox Code Playgroud)
我想做点什么
echo ${myArray['green']}
Run Code Online (Sandbox Code Playgroud)
在这种情况下会输出2
.这可以实现吗?
Ste*_*lsh 74
这样做:
#!/bin/bash
my_array=(red orange green)
value='green'
for i in "${!my_array[@]}"; do
if [[ "${my_array[$i]}" = "${value}" ]]; then
echo "${i}";
fi
done
Run Code Online (Sandbox Code Playgroud)
显然,如果你把它变成一个函数(例如get_index()) - 你可以把它变成通用的
Ola*_*che 29
您必须在使用之前声明您的阵列
declare -A myArray
myArray=([red]=1 [orange]=2 [green]=3)
echo ${myArray['orange']}
Run Code Online (Sandbox Code Playgroud)
che*_*ner 13
不可以.您只能使用整数索引一个简单数组bash
.关联数组(在bash
4中引入)可以用字符串索引.但是,它们没有提供您要求的反向查找类型,没有特殊构造的关联数组.
$ declare -A myArray
$ myArray=([red]=0 [orange]=1 [green]=2)
$ echo ${myArray[green]}
2
Run Code Online (Sandbox Code Playgroud)
小智 10
还有一个棘手的方法:
echo ${myArray[@]/green//} | cut -d/ -f1 | wc -w | tr -d ' '
Run Code Online (Sandbox Code Playgroud)
你得到2 这里是参考
另一个棘手的台词:
index=$((-1 + 10#0$(IFS=$'\n' echo "${my_array[*]}" | grep --line-number --fixed-strings -- "$value" | cut -f1 -d:)))
Run Code Online (Sandbox Code Playgroud)
特征:
-1
未找到时返回注意事项:
value
非空按执行顺序分解进行解释:
IFS=$'\n' echo "${my_array[*]}"
Run Code Online (Sandbox Code Playgroud)
将数组扩展分隔符 ( IFS
) 设置为新行字符并扩展数组
grep --line-number --fixed-strings -- "$value"
Run Code Online (Sandbox Code Playgroud)
grep 匹配:
--line-number
或-n
)--fixed-strings
或-F
;禁用正则表达式)允许以-
( --
)开头的元素
切-f1-d:
仅提取行号(格式为<line_num>:<matched line>
)
$((-1 + 10#0$(...)))
Run Code Online (Sandbox Code Playgroud)
减去 1,因为行号的索引为 1,数组的索引为 0
如果$(...)
不匹配:
0
没有返回任何内容并且使用默认值( 10#0
)$(...)
匹配:
10#0
; 即10#02
、、、等10#09
10#014
10#
强制以 10 为基数/十进制数字而不是八进制使用, &awk
代替bash 算术:grep
cut
IFS=$'\n'; awk "\$0 == \"${value//\"/\\\"}\" {print NR-1}" <<< "${my_array[*]}"
Run Code Online (Sandbox Code Playgroud)
特征:
注意事项:
未找到时返回按执行顺序分解进行解释:
IFS=$'\n' [...] <<< "${my_array[*]}"
Run Code Online (Sandbox Code Playgroud)
将数组扩展分隔符 ( IFS
) 设置为新行字符并扩展数组
awk "\$0 == \"${value//\"/\\\"}\" {print NR-1}"
Run Code Online (Sandbox Code Playgroud)
匹配整行并打印 0 索引的行号
${value//\"/\\\"}
$value
用转义版本替换双引号更简洁一点,适用于 Bash 3.x:
my_array=(red orange green)
value='green'
for i in "${!my_array[@]}"; do
[[ "${my_array[$i]}" = "${value}" ]] && break
done
echo $i
Run Code Online (Sandbox Code Playgroud)