'如果'命令没有输出正确答案

时间:2016-04-02 11:23:25

标签: bash if-statement

我正在用bash从零开始制作BBS,但我似乎无法让登录工作:'if'对我说谎。

#!/bin/bash
echo "Enter user id:"
read id
if [ $id > $(cat /bbs/howmanyusers) ]; then
        echo "ERROR: non existant user!"
        exit
fi
#The rest of the script in unimportant in this case.

无论我输入什么,它总是输出“ERROR:不存在的用户!”并退出。 cat / bbs / howmanyusers的输出是2。

帮助?

3 个答案:

答案 0 :(得分:2)

替换'>'与' -gt'。

示例,比较' \>'到' -gt'。

[ 32 \> 212  ]   && echo yes || echo no
yes
[ 32 -gt 212  ] && echo yes || echo no
no

原因是shell脚本中的默认数据格式是ASCII字符串。 ' \>'在shell脚本中,按ASCII值对左侧(' 32')和右侧(' 212')字符串进行排序,并返回' true'如果左侧字符串具有更高的值; ' -gt'比较字符串的整数值。

 man ascii | grep -A 1 062
   062   50    32    2                           162   114   72    r
   063   51    33    3                           163   115   73    s

答案 1 :(得分:1)

当您进行数字比较而不是>时,如果您使用<作为-gt>作为-lt,则<运算符会更好},-ge>=-le<=

所以它变成了:

if [ $id -gt $(cat /bbs/howmanyusers) ]; then
    ... code ...

答案 2 :(得分:1)

除了字符串与整数比较问题之外,实际上还有第二个问题没有人指出:>甚至没有被视为比较运算符,它被视为输出重定向!例如:

$ [ a > z ] && echo yes || echo no
yes
$ ls z
z

[ a > z ]被视为测试命令[ a ],输出重定向到名为“z”的文件。同时,测试命令[ a ]表示“是'非'空字符串?”,答案为“是”。甚至没有接近你想要的东西。

BTW,这意味着你可能在脚本的工作目录中有一个名为“2”的空文件。

进行字符串比较的正确方法是引用或转义>,或使用bash的[[ ]](具有更清晰的语法)而不是旧式[ ]:< / p>

$ [ a '>' z ] && echo yes || echo no
no
$ [[ a > z ]] && echo yes || echo no
no

正如其他人所指出的,对于整数比较,使用[ -gt ]或bash的(( > ))

$ [ 10 -gt 2 ] && echo yes || echo no
yes
$ (( 10 > 2 )) && echo yes || echo no
yes