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

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

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

VotePedro="Vote for Pedro"

我需要数组:

Vote
For
Pedro

然后我应该能够迭代为:

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done

答案1

VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})

解释:

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

答案2

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

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

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

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

使用时可直接拆分;即使在诸如 sh 之类没有数组的 shell 中,这也可以工作:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
done
set +f

答案3

除了将其打破之外$IFS,您还可以将其打破在您喜欢的任何地方:

set ''
while case $var in
      (* *) ;; (*)
      ! a=("$var$@")
      esac
do    set '' "${var##* }$@"
      var=${var% "$2"}
done

...甚至允许空白分隔的空字段。

相关内容