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!
 
     
    