我的代码
FOO="aaa;bbb;ccc"
echo ${FOO##*;} # Result: ccc
echo ${FOO%%;*} # Result: aaa
如何从 var FOO 获取“bbb”?
echo ${FOO???*} # Result: bbb
谢谢你
我的代码
FOO="aaa;bbb;ccc"
echo ${FOO##*;} # Result: ccc
echo ${FOO%%;*} # Result: aaa
如何从 var FOO 获取“bbb”?
echo ${FOO???*} # Result: bbb
谢谢你
没有明确的运算符。此外,您不能嵌套这些运算符(请参阅嵌套外壳参数扩展)
所以你应该使用一些临时变量来完成这项工作:
FOO="aaa;bbb;ccc"
tmp=${FOO%;*}
tmp=${tmp#*;}
echo $tmp
或者您应该将其转换为数组。
为存档编辑,感谢您的评论。
根据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
另一种方式。将 $FOO 分配给位置参数:
IFS=';'
set -- $FOO
echo "$2"
这并不能很好地概括,但是;
可以通过以下方式提取 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