无论我输入什么数字,以下代码都会打印“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
是什么,总是会给你0
或1
。1
(当数字是odd
) 与正则表达式不匹配0
,所以,你是安全的...但是,请注意:在另一种情况下这可能是错误的:正则表达式0
将匹配0
, but 10
, 707
, 2.71828182845905
, 或任何带有 a 的0
内容。在这种情况下,您需要使用=
, 而不是=~
。
另请注意,它$(...)
优于反引号。