如何将字符串分隔为shell参数?
我在ZSH中有一个测试变量:如何将字符串分隔为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数
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