我最近得到了这个脚本来匹配命令行aguments中的字符串:
if [[ "$@" == "${@#foo}" ]]; then echo "not found" ; else echo "found"; fi
看起来像是负面搜索。 @#
到底是什么意思?
答案 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