比如说,我有一个字符串x
,它有多个使用命令分隔符链接的bash命令。例如
x="cmd1 2&>1 && cmd2 || cmd3 ; cmd4 | cmd5"
有没有一种方法可以轻松地将x
拆分为一个字符串数组y
,其中包含所有单独的bash命令和命令分隔符?echo ${y[0]}
--> cmd1 2&>1
echo ${y[1]}
--> &&
echo ${y[2]}
--> cmd2
echo ${y[3]}
--> ||
echo ${y[4]}
--> cmd3
echo ${y[5]}
--> ;
echo ${y[6]}
--> cmd4
echo ${y[7]}
--> |
echo ${y[8]}
--> cmd5
注意,cmd 1、cmd 2等可以是任意bash命令,例如./test.sh arg1 arg2
或/bin/bash -c '...'
我尝试使用IFS拆分方法来分离字符串。但是,当我设置IFS='&&'
时,它也会在一个&
上分裂。示例如下:
> bash -c 'echo $(hostname)' 1>/dev/null 2>&1 && echo hello
hello
> x="bash -c 'echo \$(hostname)' 1>/dev/null 2>&1 && echo hello"
> echo $x
bash -c 'echo $(hostname)' 1>/dev/null 2>&1 && echo hello
> IFS='&&'
> cmds=($x)
> unset IFS
> echo ${cmds[0]}
bash -c 'echo $(hostname)' 1>/dev/null 2>
> echo ${cmds[1]}
1
> echo ${cmds[2]}
> echo ${cmds[3]}
echo hello
> echo ${cmds[@]}
bash -c 'echo $(hostname)' 1>/dev/null 2> 1 echo hello
正如您在上面看到的,当分隔符是多个字符时,IFS不起作用。
有什么想法吗?谢谢!
1条答案
按热度按时间rbpvctlc1#
有没有一种方法可以很容易地将x分割成一个字符串数组y,其中包含所有单独的bash命令和命令分隔符?
没有
有什么想法吗
注意:与你的程序完全无关,当你想将一个命令或命令链存储在可以执行或序列化的东西中时,你应该使用一个函数。如果你想在变量中存储命令参数,你应该使用bash数组。相关:https://mywiki.wooledge.org/BashFAQ/050。