如何在bash中学习一个值是偶数还是奇数?

时间:2010-08-05 19:19:58

标签: bash rounding median

我正在建立一个电影数据库,我需要找到评级的中位数。 我真的很喜欢bash(这是我的第一个任务)。

我写道:

let evencheck=$"(($Amount_of_movies-$Amount_of_0_movies)%2)"
if [ $evencheck==0 ] 
then
let median="(($Amount_of_movies-$Amount_of_0_movies)/2)"
else
let median="(($Amount_of_movies-$Amount_of_0_movies)/2)+1"
fi

$amount_of_movies = 6$amount_of_0_movies = 1时。我希望中位数为3.但它是2.为什么会这样?

6 个答案:

答案 0 :(得分:4)

#!/bin/bash

if (( $# != 1 )) ; then
    echo "syntax:  `basename $0` number"
    exit 255
else
    _value=$(expr $1 % 2)
    (( $_value == 0 )) && exit 1 || exit 0
fi

答案 1 :(得分:1)

试试这个:

let evencheck="(($Amount_of_movies-$Amount_of_0_movies)%2)"
if [ $evencheck -eq 0  ] 
then
   let median="(($Amount_of_movies-$Amount_of_0_movies)/2)"
else
   let median="(($Amount_of_movies-$Amount_of_0_movies)/2)+1"
fi

删除$,然后测试数字相等。

答案 2 :(得分:0)

在你的if测试中试试这个:

[ "$evencheck" == 0 ]

答案 3 :(得分:0)

中位数是否具有某种默认值?我看到它的方式,它甚至没有进入if。

(6-1) % 2
5 % 2
1, not 0

答案 4 :(得分:0)

您的代码无法解析。要评估Bash中的表达式,请说

let evencheck="$((($Amount_of_movies-$Amount_of_0_movies)%2))"

也就是说,评估像这样的算术:$(( ... ))

那就是说,你的问题是有条件的。请参阅man test

if [ $evencheck = 0 ]; then

你必须用两边的空格包装等号。使用单个等号。

答案 5 :(得分:0)

最外面的括号和所有引号都不是必需的(它们可能在其他情况下)。另外,在let语句中,您可以省略变量名称中的美元符号。

let evencheck=(Amount_of_movies-Amount_of_0_movies)%2
if [ $evencheck == 0 ]  
then
    let median=(Amount_of_movies-Amount_of_0_movies)/2
else
    let median=(Amount_of_movies-Amount_of_0_movies)/2+1
fi

如果您使用(())表单而不是let,则可以使用空格来使公式更具可读性。您也可以在if语句中使用它们:

(( evencheck = ( Amount_of_movies - Amount_of_0_movies ) % 2 ))
if (( evencheck == 0 ))
then
    (( median = ( Amount_of_movies - Amount_of_0_movies ) / 2 ))
else
    (( median = ( Amount_of_movies - Amount_of_0_movies ) / 2 + 1 ))
fi