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

Arrays 将带引号的字符串中指定的元素追加到bash数组,arrays,bash,shell,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' 有没有什么

我试图将一个项附加到一个存储在变量中的数组中,但是它并没有完全按照我所期望的方式工作

以下是我想做的:

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'

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[@]}"

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[@]}"

您希望如何在不返回到解析引号的解析阶段的情况下解析引号?…这里真正的用例是什么?例如,如果您试图从文件中读取参数列表,有一种更好的方法。(缩写:将内容以NUL分隔的形式放入文件中,可以直接表示为一个shell数组,而无需任何形式的解析)。为什么不首先让
item\u添加一个数组呢?如果没有
eval
,就无法执行此操作。展开变量时不处理引号。我不会说“不行”。例如,您可以使用知道如何解析引号的外部程序--
xargs
。事实上,让我写一个答案,这样做…你希望如何解析引号而不返回到解析引号的解析阶段?…这里真正的用例是什么?例如,如果您试图从文件中读取参数列表,有一种更好的方法。(缩写:将内容以NUL分隔的形式放入文件中,可以直接表示为一个shell数组,而无需任何形式的解析)。为什么不首先让
item\u添加一个数组呢?如果没有
eval
,就无法执行此操作。展开变量时不处理引号。我不会说“不行”。例如,您可以使用知道如何解析引号的外部程序--
xargs
。事实上,让我写一个答案,这样做…这可以简化。请看我的答案。我强烈反对以正确性为代价的“简化”。这是可以简化的。请看我的答案。我强烈反对以正确性为代价的“简化”。