BASH中"$ {1#* - }"的含义是什么?

rɑː*_*dʒɑ 3 bash

有一个if条件如下

if [ "${1#*-}" = "$1" ]; then
   echo "Do something"
fi
Run Code Online (Sandbox Code Playgroud)

但是有人可以解释一下是什么意思${1#*-}吗?

Ken*_*ent 7

${1#*-}删除变量中*-类似glob的模式的最短匹配$1.

例如abcdef-xyz-foo- >xyz-foo

您的if支票实际上是:

if $1 does not contain '-'
Run Code Online (Sandbox Code Playgroud)


Jho*_*tan 6

此测试是否"-"在参数 1 中没有

看到这个:

test=jhonatan
if [ "${test#*-}" = "$test" ]; then 
    echo "yes" ; 
else 
    echo "no" ;
fi
Run Code Online (Sandbox Code Playgroud)

这个打印是因为"-"在字符串测试中没有

有了这个

test=jhonatan-piffer
Run Code Online (Sandbox Code Playgroud)

相同的脚本打印没有。

${variable#pattern} 删除字符串的前缀模式。

在最后一种情况下,开始到之间的所有字符串 "-"

echo ${test#*-}
Run Code Online (Sandbox Code Playgroud)

导致:

"piffer"
Run Code Online (Sandbox Code Playgroud)

并且"piffer"不同于"jhonatan-piffer"

阅读更多信息:https : //www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion


che*_*ner 5

*-是匹配(可能为空)字符串后跟a的模式-.该#运营商下降到最短前缀匹配*-,从扩张$1.一个例子:

$ foo="123-456"
$ echo "${foo#*-}"
456
$ foo="123-456-789"
456-789
Run Code Online (Sandbox Code Playgroud)

我强调最短,因为有一个伴随运算符##丢弃最长的匹配前缀.

$ echo "${foo##*-}"
789
Run Code Online (Sandbox Code Playgroud)