我正在尝试将一个项目附加到存储在变量中的数组中,但是它并没有完全按照我的预期行事。
以下是我要做的事情:
array=()
item_to_add="1 '2 3'"
array+=(${item_to_add})
for item in "${array[@]}"; do
echo "item: ${item}"
done
我希望这会输出以下内容:
item: 1
item: '2 3'
但是我得到了以下输出:
item: 1
item: '2
item: 3'
有没有办法让它像这段代码一样不使用eval
?
array=()
array+=(1 '2 3')
for item in "${array[@]}"; do
echo "item: ${item}"
done
它的输出:
item: 1
item: '2 3'
答案 0 :(得分:5)
xargs
在其输入中解析引号。这通常是一个(规范级别)错误而不是一个功能(它使得带有文字引号的文件名几乎不可能在没有非POSIX扩展的情况下使用,例如-d
或-0
覆盖行为),但是在目前的情况下,它非常方便:
array=()
item_to_add="1 '2 3'"
while IFS= read -r -d '' item; do # read NUL-delimited stream
array+=( "$item" ) # and add each piece to an array
done < <(xargs printf '%s\0' <<<"$item_to_add") # transform string to NUL-delimited stream
printf 'item: %s\n' "${array[@]}"
... ...发射
item: 1
item: 2 3