为什么这个bash脚本在比较之前添加了一个字母?

时间:2014-09-22 11:12:53

标签: bash

我这里有一个包含此代码段的脚本:

read -p ">" DEPLOY_CONFIRM
if [ "xy" != "x$DEPLOY_CONFIRM" ] ; then
  .. snip ..
fi

在进行比较之前添加x是否重要?我的猜测是防止用户输入以有趣角色开头的东西。

2 个答案:

答案 0 :(得分:4)

使用已知的常量文字x为每个变量和文字加上前缀是在旧的shell脚本中完成的,同时使用未加引号的变量再次保护unary operator expected之类的错误。

只要你使用引用变量,你就不需要这个前缀为x的技巧。

所以你可以在BASH中很好地使用它:

read -p ">" DEPLOY_CONFIRM
if [[ "$DEPLOY_CONFIRM" == [Yy] ]]; then
  .. snip ..
fi

要生成此错误,请使用以下代码段:

unset s
[ "y" = $s ] && echo "matched"
-bash: [: y: unary operator expected

然后看到使用x前缀改进的行为:

[ "xy" = x$s ] && echo "matched"

答案 1 :(得分:0)

在比较始终不会出现语法错误的字符串时,您始终可以使用双引号。

[ "y" = "$s" ] && echo "matched"