shell中@#的含义

时间:2016-09-10 00:20:28

标签: shell

我最近得到了这个脚本来匹配命令行aguments中的字符串:

if [[ "$@" == "${@#foo}" ]]; then echo "not found" ; else echo "found"; fi

看起来像是负面搜索。 @#到底是什么意思?

1 个答案:

答案 0 :(得分:2)

来自man bash下的Parameter Expansion

${parameter#word}
${parameter##word}
     

删除匹配的前缀模式。扩展单词以生成模式,就像在路径名扩展中一样。如果模式   匹配参数的值的开头,然后扩展的结果是具有最短匹配模式(#情况)的参数的扩展值或删除了最长的匹配模式(##个案例)。如果参数@*,则应用模式删除操作   每个位置参数依次,扩展是结果列表。如果参数是使用@*下标的数组变量,则为模式   清除操作是                 依次应用于数组的每个成员,扩展是结果列表。

$@被扩展为脚本参数列表,每个参数都包含在引号中:

"$1" "$2" "$3"...

因此"${@#foo}"会扩展为带引号的前缀foo的引用脚本参数列表,如果此类前缀存在于任何扩展字符串中,即脚本test

#!/bin/bash
echo "${@#foo}" 

调用为:

./test abc foodef

输出

abc def