我正在建立一个电影数据库,我需要找到评级的中位数。 我真的很喜欢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.为什么会这样?
答案 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