【发布时间】:2013-01-13 07:44:25
【问题描述】:
您能告诉我如何遍历列表中的项目可以包含空格吗?
x=("some word", "other word", "third word")
for word in $x ; do
echo -e "$word\n"
done
如何强制输出:
some word
other word
third word
代替:
some
word
(...)
third
word
【问题讨论】:
您能告诉我如何遍历列表中的项目可以包含空格吗?
x=("some word", "other word", "third word")
for word in $x ; do
echo -e "$word\n"
done
如何强制输出:
some word
other word
third word
代替:
some
word
(...)
third
word
【问题讨论】:
要正确循环项目,您需要使用${var[@]}。并且你需要引用它以确保带有空格的项目没有被拆分:"${var[@]}"。
大家一起:
x=("some word" "other word" "third word")
for word in "${x[@]}" ; do
echo -e "$word\n"
done
或者,更理智的 (thanks Charles Duffy) 和 printf:
x=("some word" "other word" "third word")
for word in "${x[@]}" ; do
printf '%s\n\n' "$word"
done
【讨论】:
set -f 关闭通配。请看wiki.bash-hackers.org/commands/builtin/set
echo -e?如果 OP 真正想要的是最后一个额外的换行符,printf '%s\n\n' 会更明智。
两种可能的解决方案,一种类似于 fedorqui 的解决方案,没有额外的 ',',另一种使用数组索引:
x=( 'some word' 'other word' 'third word')
# Use array indexing
let len=${#x[@]}-1
for i in $(seq 0 $len); do
echo -e "${x[i]}"
done
# Use array expansion
for word in "${x[@]}" ; do
echo -e "$word"
done
输出:
some word
other word
third word
some word
other word
third word
编辑:修复了cravoori指出的索引解决方案的问题
【讨论】:
seq 放入command substitution。另外,从 0 而不是 1 开始