2010-08-05 88 views
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.爲什麼是這樣?

+0

標籤問題是功課吧。 – wilhelmtell 2010-08-05 19:21:37

回答

0

你如果測試試試這個:

[ "$evencheck" == 0 ] 
+0

它工作!天才:) 非常感謝你,你們所有人。 – Gal 2010-08-05 19:37:34

+0

接受答案... – 2010-08-05 20:41:12

0

中位數是否有某種默認值嗎?我看到它的方式,它甚至不在if裏面。

(6-1) % 2 
5 % 2 
1, not 0 
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 

刪除$,然後數字相等性測試。

0

您的代碼不解析。要猛砸計算表達式,你說

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

也就是說,評估像這樣算術:$((...))

這就是說,你的問題是在有條件的。請參閱man test

if [ $evencheck = 0 ]; then 

您必須在兩邊都用空格包住等號。使用一個等號。

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 
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 
相關問題