Say, I have a string x
which has multiple bash commands chained using command separators. E.g.
x="cmd1 2&>1 && cmd2 || cmd3 ; cmd4 | cmd5"
Is there a way I can easily split x
into an array of strings y
that contains all the individual bash commands and the command separators?
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
Note, cmd1, cmd2, etc can be any arbitrary bash command, e.g. ./test.sh arg1 arg2
or /bin/bash -c '...'
I tried using the IFS splitting method to separate the strings. However, when I set IFS='&&'
, it ends up splitting on a single &
too. Example below:
> 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
As you can see above, IFS doesn't work when the separator is multiple characters.
Any ideas? Thanks!