将数组元素赋值给变量Bash

时间:2018-02-08 20:41:20

标签: bash

我试图将数组元素分配给变量,以便稍后使用。例如:

constraints=("A" "B" "C" "E" "Q" "P" "S")

constraint=A

... a loop ...

rand=$[$RANDOM % ${#constraints[@]}]

let constraint="${constraints[${rand}]}"

echo $constraint

... end of loop ...

如果数组是全数字值,则可以正常工作。但如果它们是字符串,则回声总是输出0.为什么?

2 个答案:

答案 0 :(得分:4)

let仅用于算术运算。您的字符串没有数字值(除非它们命名的变量本身具有数值),因此它们在该上下文中都评估为0

成功:

constraint="${constraints[${rand}]}"

...没有let

在上下文中,这可能如下所示:

constraints=(A B C E Q P S)
rand=$(( RANDOM % ${#constraints[@]} ))
constraint=${constraints[${rand}]}
echo "$constraint"

注意:

  • 有关$[ ]let的讨论,请参阅the bash-hackers' wiki page on obsolete syntax。在现代脚本编写中也不是好形式。
  • 在分配期间明确解析单个单词的项目不需要引用(尽管使用它们是安全的,并且在不确定的情况下这样做是好的做法!)因为字符串拆分和全局扩展都被关闭了在此上下文中默认。
  • 如果值本身或IFS变量的值未知或未受控制,echo $var需要引用 。见BashPitfalls #14

答案 1 :(得分:2)

摆脱“让”。

constraints=("A" "B" "C" "E" "Q" "P" "S")
constraint=A
rand=$[$RANDOM % ${#constraints[@]}]
constraint="${constraints[${rand}]}"
echo $constraint