Bourne Shell条件

时间:2011-08-20 08:39:00

标签: bash if-statement

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

3 个答案:

答案 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变量。