String 对常量字符串应用bash字符串运算符

String 对常量字符串应用bash字符串运算符,string,bash,String,Bash,我试图对常量字符串使用bash字符串运算符。例如,您可以对变量$foo执行以下操作: $ foo=a:b:c; echo ${foo##*:} c 现在,如果“a:b:c”字符串是常量,我希望有一个更简洁的解决方案,如: echo ${"a:b:c"##*:} 但是,这不是有效的bash语法。有没有办法做到这一点 [我需要这样做的原因(而不是硬编码替换结果,即此处的“c”)是因为我有一个命令模板,其中“%h”占位符在运行命令之前被某个内容替换;bash将替换结果视为常量。]您可以使用该模板获

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

$ foo=a:b:c; echo ${foo##*:}
c
现在,如果“a:b:c”字符串是常量,我希望有一个更简洁的解决方案,如:

echo ${"a:b:c"##*:}
但是,这不是有效的bash语法。有没有办法做到这一点

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

您可以使用该模板获得类似的结果:

$ expr match "a:b:c" '.*:\(.*\)'
c

使用参数展开是不可能的

您可以为此使用其他命令,如sed/awk/expr

但我看不出这方面的要求。 你可以这样做:

tmp=%h
echo ${tmp##*:}
或者,如果速度不是问题,并且您不想用不必要的变量扰乱当前环境:

(tmp=%h; echo ${tmp##*:})
无论如何,您最好使用命令模板来执行字符串操作,或者使用一些简单的方法,如剪切:

# get third filed delimited by :
$ cut -d: -f3<<<'a:b:c'
c
#获取由以下内容分隔的第三个字段:

$cut-d:-f3您可以使用Bash正则表达式匹配:

pattern='.*:([^:]+)$'
[[ "a:b:c" =~ $pattern ]]
echo "${BASH_REMATCH[1]}"

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

如果字符串用常量分隔符分隔,那么为什么不使用
awk
sed
?是的,这也是一个有效的选项,我只是好奇如何使用bash字符串运算符来完成,在我看来,它稍微优雅一些。很酷,我不知道这个实用程序。我不喜欢基于
cut
-
awk
-
sed
的解决方案的主要原因是它们稍微长一点,我不喜欢中间变量的解决方案的原因是,这是一个命令模板,它将被替换和
exec
'd,如果我想添加一个变量定义,这迫使我将命令包装在
bash-c
调用中。但是,如果没有办法用字符串运算符实现我的目的,我可以用其他的方法。谢谢你的回答!谢谢你的回答!如果可能的话,我宁愿避免使用中间变量赋值的原因是因为命令被传递给
exec
,因此变量赋值迫使我将其包装到另一个shell中。此外,我很想知道是否可以避免中间任务。
pattern='.*:([^:]+)$'
[[ "a:b:c" =~ $pattern ]]
echo "${BASH_REMATCH[1]}"