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

时间:2012-12-31 06:34:33

标签: shell zsh

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

test_str='echo "a \" b c"'

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

即。读取test_str作为shell本身会给我一个数组 参数。

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

2 个答案:

答案 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 " beval肯定存在风险,但这是可移植的sh。当然,它不会分配给数组,但您可以正常方式使用$@