在 Bash 中从字符串到“单词”数组

far*_*d99 15 bash array string shell-script

我需要从一个字符串到一个数组,其中每个条目都是该字符串上的每个单词。例如,从以下开始:

VotePedro="Vote for Pedro"
Run Code Online (Sandbox Code Playgroud)

我需要数组:

Vote
For
Pedro
Run Code Online (Sandbox Code Playgroud)

然后我应该能够迭代为:

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done
Run Code Online (Sandbox Code Playgroud)

air*_*hey 15

VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
Run Code Online (Sandbox Code Playgroud)

解释:

数组通常使用括号声明。例如votePedroArray=("Vote" "For" "Pedro"),会给你一个长度为 3 的数组。${VotePedro}在这种情况下,它与 $VotePedro 相同。要访问单个数组元素,您可以使用类似于问题中 for 循环的括号。例如${votePedroArray[0]}是数组中的第一个元素(本例中的“投票”)

  • 并迭代它们:在 ${votePedroArray[@]} 中投票;做回声 $vote; 完毕 (2认同)

Gil*_*il' 5

bash和大多数其他类似 Bourne 的 shell 中,当您不加引号地保留变量扩展时,例如$VotePedro,将执行以下步骤:

  1. 查找变量的值。
  2. 将每个空白块处的值拆分为字符串列表。更一般地,分隔符是IFS变量值中的字符;默认情况下,这是空格、制表符和换行符。
  3. 将列表的每个元素解释为通配符模式;对于每个元素,如果模式匹配某些文件,则用匹配文件名列表替换该元素。

因此,您可以IFS通过关闭通配符扩展并扩展其值为引号之外的字符串的变量,将字符串拆分为以空格分隔的元素(假设默认值为)。

VotePedro="Vote for Pedro"
set -f
votePedroArray=($VotePedro)
set +f
for i in "${votePedroArray[@]}"; do …
Run Code Online (Sandbox Code Playgroud)

可以直接在使用点进行拆分;这甚至可以在没有数组的 shell 中工作,例如 sh:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  …
done
set +f
Run Code Online (Sandbox Code Playgroud)