我正在用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。
帮助?
答案 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