如何将字符串分隔为shell参数?

如何将字符串分隔为shell参数?,shell,zsh,Shell,Zsh,我在ZSH中有一个测试变量: test_str='echo "a \" b c"' 我想将其解析为两个字符串的数组(“echo”a \“b c”) i、 e.阅读test\u str,就像外壳本身一样,然后给我一个数组 争论 请注意,我不想在空白或类似的地方拆分。这实际上是将任意复杂的字符串解析为shell参数。Zsh有: 。但这将产生回音和a\“b c”,它不会取消字符串的引号。要取消报价,必须使用Q修饰符: ARGS=( ${(Q)${(z)test_str}} ) :导致在$ARGS数

我在ZSH中有一个测试变量:

test_str='echo "a \" b c"'
我想将其解析为两个字符串的数组
(“echo”a \“b c”)

i、 e.阅读
test\u str
,就像外壳本身一样,然后给我一个数组 争论

请注意,我不想在空白或类似的地方拆分。这实际上是将任意复杂的字符串解析为shell参数。

Zsh有:

。但这将产生
回音
a\“b c”
,它不会取消字符串的引号。要取消报价,必须使用
Q
修饰符:

ARGS=( ${(Q)${(z)test_str}} )
:导致在
$ARGS
数组中有
echo
a“bc
。两者都不会在
..
$(…)
中执行代码,但
(z)
$(假真)
拆分为一个参数

也就是说:

% testfoo=${(z):-'blah $(false true)'}; echo $testfoo[2]
$(false true)
问题的措辞暗示了一个更简单的(?)答案。要设置shell参数,请使用
set

#!/bin/sh

test_str='echo "a \" b"'
eval set $test_str
for i; do echo $i; done

这将
$1
设置为
echo
$2
设置为
a“b
<代码>评估肯定有风险,但这是可移植的
sh
。当然,它不会分配给数组,但您可以以正常方式使用
$@

(z)
是关键。谢谢我还添加了一个我认为你的最后一点是什么意思的示例。我很好奇你为什么决定使用
$(假真)
作为示例?这是常规命令还是任意命令/因为缺少更好的命令?这是少数几个没有副作用的命令之一(除了可能改变执行流的返回代码),并且不管参数如何都不会产生任何结果(
false
即使在
false--help
的情况下,zsh中的
false
也是静默的,它也不会像binutils中的
/bin/false--help
那样产生帮助)。这不是我所知道的惯例,但使用带有任何参数的
false
true
命令是安全的,另外,特别是
false
命令可能会使脚本失败,具体取决于设置(如
set-e
)。不确定是否可移植,但在bash中,
eval set-$test\u str
将阻止$test\u str中的任何内容被解释为
set
#!/bin/sh

test_str='echo "a \" b"'
eval set $test_str
for i; do echo $i; done