我编写了这个 bash 脚本,用于检查您的输入以看它是否是y
,n
或者其他东西(这将是一个更大项目的一部分):
#!/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 命令。将它们像要比较的字符串一样括在双引号中,它应该可以按预期工作。