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


11

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

VotePedro="Vote for Pedro"

我需要数组:

Vote
For
Pedro

然后,我应该可以将其迭代为:

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

Answers:


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

您能解释一下括号和括号吗?我是BASH的新手,想了解为什么这行得通。
farid99

1
通常使用括号声明数组。例如votePedroArray=("Vote" "For" "Pedro"),将给您一个长度为3的数组。与此上下文${VotePedro}相同$VotePedro。要访问单个数组元素,可以使用类似于问题中for循环的括号。例如,${votePedroArray[0]}是数组中的第一个元素(在此示例中为“ Vote”)
airfishey 2015年

感谢您的回答。我会投票赞成,但我没有足够的声誉。
farid99

2
并对其进行迭代:在$ {votePedroArray [@]}中进行投票;做回声$ vote; 完成
尼尔·麦吉尔

4

当您不引用变量扩展名时,例如$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

0

除了分解它$IFS,您还可以根据自己的喜好分解它:

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

...这将允许使用空格分隔空字段,甚至。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.