if [`read -n1 -s`='y']
导致
./ bzfsctl.sh:line 17:[= y]:找不到命令
即使
if [1=1]
产生
./ bzfsctl.sh:line 17:[1 = 1]:找不到命令
编辑正确添加空格后
./ bzfsctl.sh:16行:[: - eq:一元运算符预期
与
if [ `read -n1 -s` = 'y' ]
then
echo 'killing process ...'
else
echo 'Aborted'
fi
答案 0 :(得分:2)
您需要小心命令中的空格。
if [ 1 = 1 ]; then echo Ok ; fi
^ ^ ^ ^
所有这四个空间都是必要的。
如果你想读一个字符并测试它:
read -n1 input
if [ $input = "y" ] ; then echo Got a Yes ; fi
当您编写if something ; then ...
时,shell会执行something
,然后根据该命令的返回代码执行操作。
[
不是“语法”,它是一个程序(或内置shell),也称为test
。
所以:
if [ $a = $b ] ; then ...
实际上使用参数[
,$a
,=
和$b
运行可执行文件(或内置)]
。
如果你没有放括号,你需要if
和;
之间的东西成为常规可执行命令,成功时返回0。
答案 1 :(得分:0)
应该是这样的
if [ 1 = 1 ]; then
echo "equal";
else
echo "not-equal";
fi
如果您写为if[1=1]
,则shell interpreter
会将1
视为command
,因此您必须提供space after [ and before ]
喜欢if [ 1 = 1 ]
答案 2 :(得分:0)
如果搜索bash手册页,则read命令会显示其返回值。
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
If no names are supplied, the line read is assigned to the variable REPLY. The return code
is zero, unless end-of-file is encountered, read times out (in which case the return code is
greater than 128), or an invalid file descriptor is supplied as the argument to -u.
所以它没有给你任何东西来测试。你可以传递这样的名字:
read -n 1 YesNo
if [ $YesNo = 'Y' ] ; then
echo 'Yes'
else
echo 'No'
fi
或者你可以使用内置的REPLY变量。