bash 脚本检查输入是否为“y”、“n”或其他 - 不起作用

bash 脚本检查输入是否为“y”、“n”或其他 - 不起作用

我编写了这个 bash 脚本,用于检查您的输入以看它是否是yn或者其他东西(这将是一个更大项目的一部分):

#!/bin/bash

echo "Have you updated the PATH variable in your .bashrc file yet? [y/n]"
read response

        if [$response = "y"]; then
                echo "Checkpoint passed"
                set $checkpoint = "t"
        elif [$response = "n"]; then
                echo "Please set the PATH variable in your .bashrc file before running this script."
                set $checkpoint = "f"
        else            
                echo "Please only use 'y' and 'n'."
                set $checkpoint = "f"
        fi

但每次运行它时,无论我输入什么,都会出现类似这样的错误:

Have you updated the PATH variable in your .bashrc file yet? [y/n]
y
./snbjdkhome: line 6: [y: command not found
./snbjdkhome: line 9: [y: command not found
Please only use 'y' and 'n'.

那么我的代码有什么问题?(我对 Shell 脚本还很陌生。)

答案1

这会让你清楚(检查空格):

$ var=c

$ ["$var" == "c"] && echo "OK"
[c: command not found

$ ["$var" == "c" ] && echo "OK"
[c: command not found

$ [ "$var" == "c"] && echo "OK"
bash: [: missing `]'

$ [ "$var" == "c" ] && echo "OK"
OK

test因此,使用( [ ]) 命令时,需要在条件前后添加空格。

答案2

第 6 行和第 9 行有一个简单的错误。第6 行的[$response之间应该有空格if [$response = "y"]then; 。同样,第 9 行的[和 也应该有空格。$response

另外,您必须加上双引号,$response以避免用户输入带有空格的输入时出现错误。

答案3

此外,该set命令比您想象的更奇特。您不能使用该set命令来设置变量。

你知道,当你使用参数调用 shell 脚本时,它们会被分配给 $1$2$3…… 对吧?好吧, 该命令执行的操作之一set是设置 $1, $2, $3, …当前的 (交互式)shell。例如,

% set checkpoint="y"
% echo "$checkpoint"
                                (nothing)
% echo "arg1 = '$1', arg2 = '$2', arg3 = '$3'"
arg1 = 'checkpoint=y', arg2 = '', arg3 = ''
% set checkpoint = "y"
% echo "$checkpoint"
                                (nothing)
% echo "arg1 = '$1', arg2 = '$2', arg3 = '$3'"
arg1 = 'checkpoint', arg2 = '=', arg3 = 'y'

这不是你想要的。

你还有另一个问题。正确的语法是

checkpoint="t"

如果你说

$checkpoint="t"

并且$checkpoint未设置,此命令简化为

="t"

=t它会查找名为(可能不存在)的程序。同样,

$checkpoint = "t"

简化为

= "t"

它会查找名为 的程序=。更糟糕的是,如果$checkpoint已经设置为"t",你会说

$checkpoint="f"

那么这被解释为

t="f"

从而设置变量t(即$t)。

答案4

Bash 会将$response 其无法找到的命令解释为 as 命令。将它们像要比较的字符串一样括在双引号中,它应该可以按预期工作。

相关内容