Shell下截取字符串的功能非常少,不过有时在判断字符串前缀或是后缀时却非常重要。这里说的Shell不包含Bash和Csh,主要是给Freebsd下sh脚本使用的。例如下面的一个列子:
PRG_INFO_NAME="Make"
MKE_INFO_ACT="/bin/make"
Foo ()
{
var = $1
#如果var是Name属性,则显示该变量,否则执行变量中的行为.
}
Foo "PRG_INFO_NAME"
Foo "MKE_INFO_ACT"
为了实现上面的功能,我们需要字符串截取来判断字符串是包含的"NAME"还是"ACT"来实现我们需要的功能。在Shell中包含了对变量的操作:
${var##*string} 从左往右截取最后一次匹配上string右边的字符串
${var#*string} 从左往右截取第一次匹配上string右边的字符串
${var%%string*} 从右往左截取最后一次匹配上string左边的字符串
${var%string*} 从右往左截取第一次匹配上string左边的字符串
我们现在来实现上面的代码:
PRG_INFO_NAME="Make"
MKE_INFO_ACT="/bin/make"
Foo ()
{
local var = $1
if [ "${var##*_}" = "NAME" ]; then
eval echo $"$var"
elif [ "$var##*_}" = "ACT" ]; then
eval exec $"$var"
fi
}
也可以判断前缀
PRG_INFO_NAME="Make"
MKE_INFO_ACT="/bin/make"
echo {$PRG_INFO_NAME%%_*} # 返回: PRG
echo {$MKE_INFO_ACT%_*} # 返回: MKE_INFO
简单的组合也可以实现复杂的功能。
PRG_INFO_NAME="Make"
MKE_INFO_ACT="/bin/make"
Foo ()
{
var = $1
#如果var是Name属性,则显示该变量,否则执行变量中的行为.
}
Foo "PRG_INFO_NAME"
Foo "MKE_INFO_ACT"
为了实现上面的功能,我们需要字符串截取来判断字符串是包含的"NAME"还是"ACT"来实现我们需要的功能。在Shell中包含了对变量的操作:
${var##*string} 从左往右截取最后一次匹配上string右边的字符串
${var#*string} 从左往右截取第一次匹配上string右边的字符串
${var%%string*} 从右往左截取最后一次匹配上string左边的字符串
${var%string*} 从右往左截取第一次匹配上string左边的字符串
我们现在来实现上面的代码:
PRG_INFO_NAME="Make"
MKE_INFO_ACT="/bin/make"
Foo ()
{
local var = $1
if [ "${var##*_}" = "NAME" ]; then
eval echo $"$var"
elif [ "$var##*_}" = "ACT" ]; then
eval exec $"$var"
fi
}
也可以判断前缀
PRG_INFO_NAME="Make"
MKE_INFO_ACT="/bin/make"
echo {$PRG_INFO_NAME%%_*} # 返回: PRG
echo {$MKE_INFO_ACT%_*} # 返回: MKE_INFO
简单的组合也可以实现复杂的功能。