关于if语句格式的问题

关于if语句格式的问题

无论我输入什么数字,以下代码都会打印“Odd”,为什么当给定偶数作为参数时它不打印“Even”?

if [[ 'echo "$1%2" | bc' =~ 0 ]]
then
        echo "Even"
else
        echo "Odd"
fi

答案1

您正在将正则表达式0细绳 echo "$1%2" | bc。该字符串不包含 a 0,因此else采用分支。

要测试是$1奇数还是偶数,请使用算术测试:

if (( $1 % 2 == 0 )); then
    echo even
else
    echo odd
fi

(( ... ))位是算术评估。它将计算内部表达式,其值将是该表达式的结果。然后该if语句可以对结果采取行动。

bc按照您的意图使用:

if [ "$( printf '%s %% 2\n' "$1" | bc )" -eq 0 ]; then
    echo even
else
    echo odd
fi

也就是说,使用命令替换(位$(...))将运行命令的结果插入其中,然后使用-eq(用于算术比较)将其与零进行比较。

如果使用printf感觉很有趣,那么使用

if [ "$( echo "$1 % 2" | bc )" -eq 0 ]; then
    echo even
else
    echo odd
fi

但请看“为什么 printf 比 echo 更好?”。

答案2

单引号可防止 $1 被替换。尝试引用该陈述的部分内容以获得您想要的结果。

答案3

尽管您可以使用一种更简单且独立的解决方案(仅使用bash,因为这bc也取决于),但您的尝试几乎是正确的;只需改变'为了`(反引号):

if [[ `echo "$1%2" | bc` =~ 0 ]]
then
        echo "Even"
else
        echo "Odd"
fi 

你尝试过什么:

'echo "$1%2" | bc'

你的意思是:

`echo "$1%2" | bc`

另一方面,您正在使用=~:

还可以使用附加二元运算符“=~”,其优先级与“==”和“!=”相同。使用时,运算符右侧的字符串被视为 POSIX 扩展正则表达式并进行相应匹配(如 regex3))。

大概,这个不是你想要什么,但是在这种特殊情况下,会很好地工作:n%2无论自然数n是什么,总是会给你011(当数字是odd) 与正则表达式不匹配0,所以,你是安全的...但是,请注意:在另一种情况下这可能是错误的:正则表达式0将匹配0, but 10, 707, 2.71828182845905, 或任何带有 a 的0内容。在这种情况下,您需要使用=, 而不是=~

另请注意,它$(...)优于反引号。

相关内容