0

我的代码

FOO="aaa;bbb;ccc"

echo ${FOO##*;} # Result: ccc
echo ${FOO%%;*} # Result: aaa

如何从 var FOO 获取“bbb”?

echo ${FOO???*} # Result: bbb

谢谢你

4

4 回答 4

1

没有明确的运算符。此外,您不能嵌套这些运算符(请参阅嵌套外壳参数扩展

所以你应该使用一些临时变量来完成这项工作:

FOO="aaa;bbb;ccc"
tmp=${FOO%;*}
tmp=${tmp#*;}
echo $tmp

或者您应该将其转换为数组。

为存档编辑,感谢您的评论。

于 2013-03-12T01:18:18.313 回答
1

根据jejese的回答,您可以使用#and%分词结构。

FOO="aaa;bbb;ccc"
split=${FOO%;*}
final=${split#*;}
echo $final

产生:

bbb

或者,您可以使用IFS设置为分号的 bash 字段分隔符变量来根据字段拆分输入。这可能更易于使用,并允许您使用单行代码获取第二个字段的值。

FOO="aaa;bbb;ccc"
IFS=";" read field1 field2 field3 <<< "$FOO"
echo $field1 $field2 $field3

产生:

aaa bbb ccc
于 2013-03-12T01:45:25.590 回答
0

另一种方式。将 $FOO 分配给位置参数:

IFS=';'
set -- $FOO
echo  "$2"
于 2013-03-12T08:26:00.243 回答
0

这并不能很好地概括,但是;可以通过以下方式提取 3 分隔字段的中间部分:

$ shopt -s extglob
$ FOO=aaa;bbb;ccc
$ echo ${FOO//+(${FOO##*;}|${FOO%%;*}|;)}
bbb

将其分解为步骤可以更容易地了解它是如何工作的:

$ C=${FOO##*;}     # ccc
$ A=${FOO%%;*}     # aaa
$ echo ${FOO//+($A|$C|;)}  # Removes every occurance of $A, $C, or ; from FOO
于 2013-03-12T01:49:22.773 回答