bash如果带有字符串的语句始终求值为true

时间:2018-11-15 23:39:00

标签: bash if-statement

我正在开始使用bash,并且在if语句方面遇到麻烦。 为什么使用以下脚本:

#!/bin/bash
read C
if  (( $C == 'Y' )) ; then
    echo "YES"
elif (( $C == 'N' )) ; then
    echo "NO"
fi

无论YES取什么值,似乎都可以打印$C

3 个答案:

答案 0 :(得分:3)

算术语句((...))中的字符串将递归扩展,直到获得整数值(对于未定义的参数包括0)或导致语法错误的字符串。一些例子:

# x expands to y, and y expands to 3
$ x=y y=3
$ (( x == 3 )) && echo true
true

$ x="foo bar"
$ (( x == 3 ))
bash: ((: foo bar: syntax error in expression (error token is "bar")

# An undefined parameter expands to 0
$ unset x
$ (( x == 0 )) && echo true
true

在您的情况下,$C扩展为一些未定义的参数名称,并且它和Y均扩展为0,并且0 == 0。

要进行字符串比较,请改用[[ ... ]]

if [[ $C == Y ]]; then

答案 1 :(得分:1)

是的,正如@larsks所提到的,您需要方括号。试试这个完整版本:

#!/bin/bash

read C
if [[ ${C} == 'Y' ]]; then
    echo "YES"
elif [[ ${C} == 'N' ]]; then
    echo "NO"
fi

答案 2 :(得分:1)

这是正确的格式。

#!/bin/bash
read C
if  [[ $C == 'Y' ]]
then
    echo "YES"
elif [[ $C == 'N' ]]
then
    echo "NO"
fi