将带有引号的字符串中指定的元素附加到bash数组

时间:2016-08-04 23:49:39

标签: arrays bash shell

我正在尝试将一个项目附加到存储在变量中的数组中,但是它并没有完全按照我的预期行事。

以下是我要做的事情:

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'

1 个答案:

答案 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