我在ZSH中有这个测试变量:
test_str='echo "a \" b c"'
我想把它解析成两个字符串("echo" "a \" b c")
的数组。
即。读取test_str
作为shell本身会给我一个数组
参数。
请注意,我不打算拆分白色空间或类似的东西。这实际上是将任意复杂的字符串解析为shell参数。
答案 0 :(得分:6)
Zsh有(z)
修饰符:
ARGS=( ${(z)test_str} )
。但这会产生echo
和"a \" b c"
,它不会取消引用字符串。要取消引用,您必须使用Q
修饰符:
ARGS=( ${(Q)${(z)test_str}} )
:导致echo
数组中包含a " b c
和$ARGS
。也不会在
或…
…
中执行代码,但$(…)
会将(z)
分成一个参数。
也就是说:
$(false true)
答案 1 :(得分:5)
问题的措辞暗示了一个更简单的(?)答案。要设置shell参数,请使用set
:
#!/bin/sh
test_str='echo "a \" b"'
eval set $test_str
for i; do echo $i; done
这会将$1
设置为echo
,将$2
设置为a " b
。 eval
肯定存在风险,但这是可移植的sh
。当然,它不会分配给数组,但您可以正常方式使用$@
。