shell 将一串bash命令拆分为单个命令和命令分隔符的数组

js81xvg6  于 2023-05-29  发布在  Shell
关注(0)|答案(1)|浏览(135)

比如说,我有一个字符串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不起作用。
有什么想法吗?谢谢!

rbpvctlc

rbpvctlc1#

有没有一种方法可以很容易地将x分割成一个字符串数组y,其中包含所有单独的bash命令和命令分隔符?
没有
有什么想法吗

  • 你 * 必须为shell语法编写一个解析器,或者你可以使用现有的解析器。您可能对Bash和busybox ash以及其他shell源代码和shellcheck项目感兴趣。

注意:与你的程序完全无关,当你想将一个命令或命令链存储在可以执行或序列化的东西中时,你应该使用一个函数。如果你想在变量中存储命令参数,你应该使用bash数组。相关:https://mywiki.wooledge.org/BashFAQ/050

相关问题