如何将字符串分成shell参数?

eve*_*_jr 3 shell zsh

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

test_str='echo "a \" b c"'
Run Code Online (Sandbox Code Playgroud)

我想把它解析成两个字符串的数组("echo" "a \" b c").

即读取test_strshell本身会给我一些参数.

请注意,我不打算拆分白色空间或类似的东西.这实际上是将任意复杂的字符串解析为shell参数.

ZyX*_*ZyX 7

Zsh有(z)修饰符:

ARGS=( ${(z)test_str} )
Run Code Online (Sandbox Code Playgroud)

.但这将产生,echo并且"a \" b c"它不会取消引用字符串.要取消引用,您必须使用Q修饰符:

ARGS=( ${(Q)${(z)test_str}} )
Run Code Online (Sandbox Code Playgroud)

:导致拥有echoa " b c$ARGS数组中.无论是将在执行代码$(…),但(z)会分裂$(false true)成一个参数.

也就是说:

% testfoo=${(z):-'blah $(false true)'}; echo $testfoo[2]
$(false true)
Run Code Online (Sandbox Code Playgroud)


Wil*_*ell 5

问题的措辞暗示了一个更简单的(?)答案.要设置shell参数,请使用set:

#!/bin/sh

test_str='echo "a \" b"'
eval set $test_str
for i; do echo $i; done
Run Code Online (Sandbox Code Playgroud)

这台$1echo$2a " b. eval肯定有风险,但这是便携式的sh.当然,它不会分配给数组,但您可以$@以正常方式使用.

  • 不确定是否可移植,但在bash中,`eval set - $ test_str`会阻止$ test_str中的任何内容被解释为`set`的常用args (2认同)