我正在尝试在常量字符串上使用bash字符串运算符。例如,您可以对变量$ foo执行以下操作:
$ foo=a:b:c; echo ${foo##*:}
c
现在,如果“a:b:c”字符串是常量,我希望有一个更简洁的解决方案,如:
echo ${"a:b:c"##*:}
但是,这不是有效的bash语法。有没有办法执行此操作?
[我需要这样做的原因(而不是硬编码替换的结果,即“c”这里)是因为我有一个命令模板,其中“%h”占位符在运行命令之前被某些东西替换;取代的结果被bash视为常数。]
答案 0 :(得分:4)
使用参数扩展是不可能的。
您可以使用其他命令,例如sed / awk / expr。
但我没有看到这个要求。 你可以这么做:
tmp=%h
echo ${tmp##*:}
或者如果速度不是问题,并且您不希望使用不需要的变量来混乱当前环境:
(tmp=%h; echo ${tmp##*:})
无论如何,你最好使用命令模板进行字符串操作或使用像cut这样简单的东西:
# get third filed delimited by :
$ cut -d: -f3<<<'a:b:c'
c
或者像awk或sed更复杂:
#get last field separated by ':'
$ awk -F: '{print $NF}'<<<'a:b:c'
c
$ sed 's/.*:\([^:]*\)/\1/'<<<'a:b:c'
c
取决于您的需求。
答案 1 :(得分:2)
您可以使用expr
获得类似的结果:
$ expr match "a:b:c" '.*:\(.*\)'
c
答案 2 :(得分:1)
您可以使用Bash正则表达式匹配:
pattern='.*:([^:]+)$'
[[ "a:b:c" =~ $pattern ]]
echo "${BASH_REMATCH[1]}"
但为什么不能将模板替换为变量赋值,然后在参数扩展中使用变量?