我尝试检查字符串的第一个或最后一个字符是否是x
,但却收到一条错误消息:
./test.sh:2:错误替换
这里有什么问题?
string="2x3"
if [[ "${-n $string | head -c 1}" == "x" ]]; then
echo "first character is x"
elif [[ "${-n $string | tail -c 1}" == "x" ]]; then
echo "last character is x"
fi
我尝试检查字符串的第一个或最后一个字符是否是x
,但却收到一条错误消息:
./test.sh:2:错误替换
这里有什么问题?
string="2x3"
if [[ "${-n $string | head -c 1}" == "x" ]]; then
echo "first character is x"
elif [[ "${-n $string | tail -c 1}" == "x" ]]; then
echo "last character is x"
fi
在任何 POSIXy shell 中,该
case
语句提供模式匹配(无需运行任何外部工具):(按顺序检查模式,因此
x*x
必须在其他模式之前,并且*
位于最后。)它还支持一个分支中的替代方案,因此您可以这样做:
您的扩展
${ .. }
不会运行任何代码:它只会生成一个文本字符串,而该文本字符串本身甚至不是一个有效的命令(它需要一个echo
, 以及圆括号)。Bash 扩展可以生成子字符串,而不需要任何外部命令。
正如 @juliethefox 所说,是
=
文本比较,是==
模式比较。如果您想合并测试,那么这是正确的。频繁使用外部命令会对 Bash 性能产生很大影响。
解决您的“这里的问题是什么?”问题:
${x}
是参数扩展,即将变量扩展为其值。显然
-n $string | head -c 1
是一个无效的变量名。您很可能正在寻找
$(...)
命令替换,但-n
它不是一个命令。替代解决方案,可能更具可读性,但使用更多命令:
或者按照@terdon的建议在Bash中
请注意,这会同时执行两项检查,因此示例字符串将打印这两条消息。
elif
如果您愿意,可以随意添加。