2013-01-05 123 views
1

我的問題是,我不明白爲什麼當我運行腳本,如果我寫「是」或「否」,它總是說我退出腳本。我知道它不承認$reply和「是」相等,但爲什麼? (我是bash編程的新手)。謝謝!如果和別的,不同的變量和相同的結果

#!/bin/bash 
clear 
echo 'This script will install: Firefox 17.0.1 (language: enGB or itIT or enUS) and flash 11 in Firefox17.0.1, continue?' 
read reply 
if (("$reply" = "yes")); then 
    pkill firefox 
    rm -rf /tmp/fox 
    mkdir /tmp/fox 
    cd /tmp/fox 
    rm -rf /opt/firefox/* 
    rm -rf /usr/lib/mozilla/plugins/* 
    rm -f /usr/share/icons/mozicon128.png 
    mkdir /usr/lib/mozilla/plugins 
    mkdir /opt/firefox 
    echo "Enter your language (exmp: it en us)" 
    read reply1 
    if (("$reply1" = "it")); then 
    wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/it-IT/firefox-17.0.1.tar.bz2 
    elif (("$reply1" = "en")); then 
    wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/en-GB/firefox-17.0.1.tar.bz2 
    else 
    wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/en-US/firefox-17.0.1.tar.bz2 
    fi 
    wget http://fpdownload.macromedia.com/get/flashplayer/pdc/11.2.202.258/install_flash_player_11_linux.x86_64.tar.gz 
    wget http://upload.wikimedia.org/wikipedia/commons/7/76/Mozilla_Nightly_icon_2011.png 

    tar -xvf firefox-17.0.1.tar.bz2 
    tar -xvf install_flash_player_11_linux.x86_64.tar.gz 

    cp -R firefox/* /opt/firefox 
    cp libflashplayer.so /usr/lib/mozilla/plugins/ 
    rm -f /opt/firefox/icons/mozicon128.png 
    cp -f Mozilla_Nightly_icon_2011.png /opt/firefox/icons/mozicon128.png 
    echo "Reboot the system to show the new icon?" 
    read response 
    if (("$response" = "yes")); then 
    reboot 
    else 
    echo 'Installation Complete' 
    fi 
else 
    echo "I'm quitting the script..." 
    exit 
fi 
+0

如果你混淆不同類型的括號:http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces – Ixanezis

+1

順便說一句,強制地'/ usr'中的東西很少是一個好主意。爲你的pkatform(RPM?Deb?Gentoo?你不是這麼說)創建一個軟件包並以正常的方式安裝它。 – tripleee

+1

您需要'[[]]'不要(())' - 對於@tripleee也需要+1 - 爲您的系統處理卸載而創建一個package/formula/recipe。 – ocodo

回答

6

您正在使用算術表達式塊(())來比較字符串。混亂將隨之而來。

read -p 'This script will install: Firefox 17.0.1 (language: enGB or itIT or enUS) and flash 11 in Firefox17.0.1, continue?' reply 
if [[ "$reply" = "yes" ]]; then 
    … 
3

雙括號((...)),與if/then構建體中使用時,根據它們揉合整數測試表達式的評估返回一個退出狀態。例如,測試((5 == 5))將評估爲真(即0)。

單機,雙括號允許你使用算術評估像i=$((2+3)),和/或C風格的語法,就像

((i = 1)) #or 
((i++)) #or 
for ((i=0;i<5;i++)); do ...; done 

然而,在你的代碼,而你正試圖評估變量比較表達式,實際上你正在測試一個C風格的作業。 (("$reply" = "yes"))既不會比較整數也不會有任何其他值,只是簡單地將字符串"yes"的數字轉換分配給由$reply的內容標識的變量,並返回指定的值作爲其退出狀態。

yes轉換爲0。在將用戶輸入yes作爲他們的答覆的情況下,效果會分配

yes=0 

鑑於此,該if聲明僅僅測試了一個整型值不爲零,這樣以來在括號中指定的值爲零,它將返回一個1作爲退出代碼,這意味着falsethen塊將不會執行。除非用戶輸入一個非零整數值。

將括號改爲雙括號[[...]],你會沒事的。如果您喜歡使用===作爲操作員在這種情況下無關緊要。

if [[ "$reply" = "yes" ]]; then 

需要進一步的細節時,你會發現this網站有用的答案。

+0

這是怎麼添加任何東西給8分鐘前給出的答案? – axiom

+0

你說得對。如果有的話,它只是添加一個鏈接到一個單一的,但有用的參考。但是,當我開始寫作時,還沒有任何答案。我一定錯過了你的發佈。 –

+1

只因爲它們是重複的,不要downvote正確的答案。沒有什麼可怕的,你可以花費你的觀點。 – ormaaj

0

運行此腳本,它爲我工作沒有任何錯誤,並讓我的Flash播放器工作。

# Prepare Directory's 
pkill firefox 
mkdir /tmp/fox 
cd /tmp/fox 
rm -rf /opt/firefox/* 
rm -rf /usr/lib/mozilla/plugins/* 
rm -f /usr/share/icons/mozicon128.png 
mkdir /usr/lib/mozilla/plugins 
mkdir /opt/firefox 

# Download Resources 
wget http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/en-US/firefox-18.0.tar.bz2 
wget http://fpdownload.macromedia.com/get/flashplayer/pdc/11.2.202.258/install_flash_player_11_linux.x86_64.tar.gz 
wget http://upload.wikimedia.org/wikipedia/commons/7/76/Mozilla_Nightly_icon_2011.png 

# Extract Resources 
tar -xvf firefox-18.0.tar.bz2 
tar -xvf install_flash_player_11_linux.x86_64.tar.gz 

# Install 
cp -R firefox/* /opt/firefox 
cp libflashplayer.so /usr/lib/mozilla/plugins/ 
#Restart Backtrack to reload start menu icon's or goto menu editor and reselect icon 
cp -f Mozilla_Nightly_icon_2011.png /usr/share/icons/mozicon128.png 

# Done 
echo 'Installation Complete'