【发布时间】:2018-06-06 09:34:16
【问题描述】:
我有一个不是从 0 开始索引的数组:
arr=([2]=aaa bbb ccc ddd)
我需要获取数组的第一个索引。我尝试了很多方法并且效果很好:
for index in "${!arr[@]}"; do
first_index=$index
break
done
first_index=$(awk '{ print $1 }' <<< "${!arr[@]}")
first_index=$(cut -d' ' -f1 <<< "${!arr[@]}")
first_index=${!arr[@]}
first_index=${first_index%% *}
ind=("${!arr[@]}")
first_index=${ind[@]:0:1}
我真正想做的工作:
${!arr[@]:0:1}
鉴于此语法非常适用于数组 ${arr[@]:0:1} 并且非常简洁:
- 在没有外部工具、临时数组、临时变量、循环等的情况下,是否有一种类似的、更简洁的方法来对索引执行此操作?我的尝试似乎使如此简单的任务过于复杂
-
${!arr[@]:0:1}中实际发生了什么?
【问题讨论】:
-
循环是我使用的方法,顺便说一句。它很冗长,但比使用外部命令的尝试更有效率。如果您必须使用
first_index=${!arr[@]}方法,请将其改为[*],这样您就可以明确地请求字符串,而不是请求数组并将其强制转换为字符串。无论哪种情况,您都需要确保 IFS 的值是已知的。 -
...
index也不需要,for first_index in "${!arr[@]}"; do break; done -
(坦率地说,虽然——对“首选语法发生了什么?”这个问题的一个很好的答案需要跟踪
subst.c的一些非常多毛的部分;最好的人有能力在 bug-bash@gnu.org 上直播...虽然询问语法的问题应该首先通过 help-bash@gnu.org)。 -
arr=([2]=aaa bbb ccc ddd); index=(${!arr[@]}); echo ${index[0]}?