在常量字符串上应用bash字符串运算符

时间:2012-02-03 14:04:46

标签: string bash

我正在尝试在常量字符串上使用bash字符串运算符。例如,您可以对变量$ foo执行以下操作:

$ foo=a:b:c; echo ${foo##*:}
c

现在,如果“a:b:c”字符串是常量,我希望有一个更简洁的解决方案,如:

echo ${"a:b:c"##*:}

但是,这不是有效的bash语法。有没有办法执行此操作?

[我需要这样做的原因(而不是硬编码替换的结果,即“c”这里)是因为我有一个命令模板,其中“%h”占位符在运行命令之前被某些东西替换;取代的结果被bash视为常数。]

3 个答案:

答案 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]}"

但为什么不能将模板替换为变量赋值,然后在参数扩展中使用变量?