2

我正在建立一个电影数据库,我需要找到收视率的中位数。我对 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。这是为什么呢?

4

6 回答 6

4
#!/bin/bash

如果 (( $# != 1 )) ; 然后
    echo "语法:`basename $0` number"
    255号出口
别的
    _value=$(expr $1 % 2)
    (( $_value == 0 )) && 退出 1 || 出口 0
菲
于 2012-12-05T19:34:43.313 回答
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

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

于 2010-08-05T19:34:12.777 回答
0

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

[ "$evencheck" == 0 ]
于 2010-08-05T19:28:32.633 回答
0

中位数是否有某种默认值?在我看来,它甚至没有进入 if。

(6-1) % 2
5 % 2
1, not 0
于 2010-08-05T19:32:03.593 回答
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
于 2010-08-05T22:14:13.500 回答
0

您的代码无法解析。要在 Bash 中计算表达式,你说

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

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

也就是说,你的问题是有条件的。见man test

if [ $evencheck = 0 ]; then

您必须在两边都用空格包裹等号。使用单个等号。

于 2010-08-05T19:39:42.327 回答