我需要从一个字符串到一个数组,其中每个条目都是该字符串上的每个单词。例如,从以下内容开始:
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
,将执行以下步骤:
- 查找变量的值。
- 将每个空白块处的值拆分为字符串列表。更一般地,分隔符是变量值中的字符
IFS
;默认情况下是空格、制表符和换行符。 - 将列表中的每个元素解释为通配符模式;对于每个元素,如果模式与某些文件匹配,则用匹配文件名列表替换该元素。
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
...甚至允许空白分隔的空字段。