迭代带引号的字符串列表

dea*_*eef 5 bash quotes

我正在尝试对字符串列表运行 for 循环,其中一些字符串被引用,而其他字符串则不然:

STRING='foo "bar_no_space" "baz with space"'
for item in $STRING; do
    echo "$item"
done
Run Code Online (Sandbox Code Playgroud)

预期结果:

foo
bar_no_space
baz with space
Run Code Online (Sandbox Code Playgroud)

实际结果:

foo
"bar_no_space"
"baz
with
space"
Run Code Online (Sandbox Code Playgroud)

我可以通过运行以下命令来达到预期的结果:

bash -c 'for item in '"$STRING"'; do echo "$item"; done;'
Run Code Online (Sandbox Code Playgroud)

我想在不生成新的 bash 进程或使用的情况下执行此操作,eval因为我不想冒执行随机命令的风险。

请注意,我不控制 STRING 变量的定义,我通过环境变量接收它。所以我不能写这样的东西:

array=(foo "bar_no_space" "baz with space")
for item in "${array[@]}"; do
    echo "$item"
done
Run Code Online (Sandbox Code Playgroud)

如果有帮助,我实际上想做的是将字符串拆分为参数列表,我可以将其传递给另一个命令。

我有:

STRING='foo "bar_no_space" "baz with space"'
Run Code Online (Sandbox Code Playgroud)

我想运行:

my-command --arg foo --arg "bar_no_space" --arg "baz with space"
Run Code Online (Sandbox Code Playgroud)

cod*_*ter 3

使用数组代替普通变量。

arr=(foo "bar_no_space" "baz with space")
Run Code Online (Sandbox Code Playgroud)

要打印值:

print '%s\n' "${arr[@]}"
Run Code Online (Sandbox Code Playgroud)

并调用你的命令:

my-command --arg "${arr[0]}" --arg "${arr[1]}" --arg "{$arr[2]}"
Run Code Online (Sandbox Code Playgroud)

  • @deadbeef 那么,无论谁决定在单个字符串中传递任意字符串列表,都犯了一个错误。设计被破坏了。 (2认同)