使用BASH变量参数根据字符拆分字符串

时间:2018-06-10 21:08:43

标签: string bash

假设我有一个由命令序列组成的字符串:

s1="c1|c2|c3>c4"

s2="c1>c2|c3|c4"

我想将这些字符串拆分为两个字符串。第一个字符串将是第一个命令c1。第二个字符串将是剩余的命令(以及管道和重定向)。

我可以轻松获得第一个命令:

echo ${s1%%[>|]*} c1

echo ${s2%%[>|]*} c1

但是获得第二个字符串并不是那么简单:

我得到了什么:

echo ${s1#*[>|]} c2|c3>c4 echo ${s2#*[>|]} c2|c3>c4

我想要的是什么:

|c2|c3>c4

>c2|c3>c4

总而言之,如果我有一个复合命令,其中一个命令通过管道传输或重定向到其他命令,我想将第一个命令拆分为一个字符串,将剩余的命令拆分为另一个字符串。包括所有管道和重定向。

1 个答案:

答案 0 :(得分:0)

捕获" c1"然后,从原始字符串的开头部分变量,删除捕获的文本:

$ cmd=${s1%%[>|]*}; echo "$cmd"; echo "${s1#"$cmd"}"
c1
|c2|c3>c4

$ cmd=${s2%%[>|]*}; echo "$cmd"; echo "${s2#"$cmd"}"
c1
>c2|c3|c4

当字符串包含glob字符时,这甚至可以工作:

$ s2="c1*>c2|c3|c4"
$ cmd=${s2%%[>|]*}; echo "$cmd"; echo "${s2#"$cmd"}"
c1*
>c2|c3|c4