if 语句中的意外运算符

Unexpected operator in if statement

在下面两行中我得到这个错误?

怎么了?

Debian Buster

my.sh: 101: [: !=: unexpected operator

my.sh: 103: [: !=: unexpected operator

if [ $CONTINUE != "y" ] && [ "$CONTINUE" != "n" ]; then

elif [ $CONTINUE = "n" ]; then

更新

echo "\nContinue downloading? [y/n]"
read CONTINUE

#   Error: Invalid argument
if [ $CONTINUE != "y" ] && [ $CONTINUE != "n" ]; then
    error "Invalid argument"
elif [ $CONTINUE = "n" ]; then
    echo "\nDonwload terminated!"
    exit
fi

您发布的脚本存在各种问题,这些问题由 ShellCheck 突出显示:

Line 1:
echo "\nContinue downloading? [y/n]"
     ^-- SC2028: echo may not expand escape sequences. Use printf.

Line 2:
read CONTINUE
^-- SC2162: read without -r will mangle backslashes.

Line 5:
if [ $CONTINUE != "y" ] && [ $CONTINUE != "n" ]; then
     ^-- SC2086: Double quote to prevent globbing and word splitting.
                             ^-- SC2086: Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
if [ "$CONTINUE" != "y" ] && [ "$CONTINUE" != "n" ]; then

Line 7:
elif [ $CONTINUE = "n" ]; then
       ^-- SC2086: Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
elif [ "$CONTINUE" = "n" ]; then

Line 8:
    echo "\nDonwload terminated!"
         ^-- SC2028: echo may not expand escape sequences. Use printf.

但尽管存在这些问题 脚本实际上 按预期工作 在 Debian (Buster) 的默认 shell (即 dash)。您可能 运行 是非默认 shell。因此,解决您的问题的最简单方法是

  • 声明有效 shebang line
  • 解决上面突出显示的问题。

这给我们留下了这个:

#!/bin/sh

printf "\nContinue downloading? [y/n] "
read -r CONTINUE

error() {
    printf >&2 '%s\n' "$@"
    exit 1
}

if [ "$CONTINUE" != y ] && [ "$CONTINUE" != n ]; then
    error "Invalid argument"
elif [ "$CONTINUE" = n ]; then
    printf "\nDownload terminated!\n"
    exit
fi

(这也为未定义的 error 调用添加了一个定义;酌情替换。)