我的代码
FOO="aaa;bbb;ccc"
echo ${FOO##*;} # Result: ccc
echo ${FOO%%;*} # Result: aaa
如何从var FOO获得“bbb”?
echo ${FOO???*} # Result: bbb
谢谢
答案 0 :(得分:1)
没有明确的操作员。此外,您无法嵌套这些运算符(请参阅Nested Shell Parameter Expansion)
所以你应该为这份工作使用一些临时变量:
FOO="aaa;bbb;ccc"
tmp=${FOO%;*}
tmp=${tmp#*;}
echo $tmp
或者您应该将其转换为数组。
编辑归档,感谢您的评论。
答案 1 :(得分:1)
根据jejese's answer,您可以使用#
和%
字拆分构造。
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
答案 2 :(得分: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
答案 3 :(得分:0)
另一种方式。将$ FOO分配给位置参数:
IFS=';'
set -- $FOO
echo "$2"