如何在BASH中获取字符串的一部分

如何在BASH中获取字符串的一部分,bash,Bash,我的代码 如何从var FOO获得“bbb” FOO="aaa;bbb;ccc" echo ${FOO##*;} # Result: ccc echo ${FOO%%;*} # Result: aaa 谢谢没有明确的运算符。此外,不能嵌套这些运算符(请参见) 因此,您应该为作业使用一些临时变量: echo ${FOO???*} # Result: bbb 或者您应该将其转换为数组 为存档编辑,感谢您的评论。根据,您可以使用和%分词结构 FOO="aaa;bbb;ccc" tmp=${FOO

我的代码

如何从var FOO获得“bbb”

FOO="aaa;bbb;ccc"

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

谢谢

没有明确的运算符。此外,不能嵌套这些运算符(请参见)

因此,您应该为作业使用一些临时变量:

echo ${FOO???*} # Result: bbb
或者您应该将其转换为数组

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

根据,您可以使用
%
分词结构

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

FOO="aaa;bbb;ccc"
split=${FOO%;*}
final=${split#*;}
echo $final
FOO="aaa;bbb;ccc"
IFS=";" read field1 field2 field3 <<< "$FOO"
echo $field1 $field2 $field3
或者,可以使用设置为分号的
IFS
bash字段分隔符变量根据字段分割输入。这可能更易于使用,并允许您使用一行代码获取第二个字段的值

bbb

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

aaa bbb ccc
将其分解为多个步骤可以更容易地了解其工作原理:

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

另一种方式。将$FOO指定给位置参数:

$ C=${FOO##*;}     # ccc
$ A=${FOO%%;*}     # aaa
$ echo ${FOO//+($A|$C|;)}  # Removes every occurance of $A, $C, or ; from FOO

您必须通过bash参数扩展来完成吗,或者使用awk是否可以接受?请不要使用awk,bash纯语言。谢谢,这会根据需要打印
aaa
,而不是
bbb
。使用单个
%
代替
%
IFS=';'
set -- $FOO
echo  "$2"