2013-12-12 95 views
0

我試圖執行一個非常簡單的程序(圓號碼最小整數由15整除),但我得到一個錯誤生成錯誤與sh cache.sh呼籲bash腳本的if語句和變量賦值

我覺得我跟着我學到的語法here但我得到line 9: syntax error: unexpected end of file我在這裏得到了什麼錯?

+0

我認爲在看bash示例時很重要的一件事是*每個單獨的字符*都很重要。特別是空間。而缺乏空間。 – Aesin

回答

0

你的腳本有很多語法問題。在外殼的任務是爲

VAR = 'VAL'

,而不是

是$ var = 'VAL'

而且周圍有=

沒有空間了正確的腳本可以:

min=$(date +"%M") 

if ((min % 15 != 0)) 
then 
    echo "not fully divisible by 15" 
fi 

echo $min 
+0

謝謝,但我得到的錯誤:「行3:語法錯誤附近意外的標記'」 – 1252748

+0

請確保您執行它作爲'bash。/ script.sh' – anubhava

0

它看起來像你轉換這個fr ü一些其他語言。這是一個可用的bash版本。

#!/bin/bash 
min=$(date +"%M") 

if [ $(($min % 15)) != 0 ] ; then 
    min=$((min - min % 1)) 
fi 

echo $min; 

本地輸出:

~/tmp › sh ./test.sh 
34 
+0

是的,完全來自PHP heheh三元。我的代碼片段中出現錯誤「語法錯誤:文件意外結束」。任何想法可能是什麼?謝謝! – 1252748

+0

我在這裏運行沒有問題。你使用的是什麼操作系統/外殼? – Donovan

+0

我怎樣才能找到這些信息? – 1252748

2

該腳本是無效的bash語法。我會首先找到一些工作示例,也許是整個教程。您可以從William Shotts的書開始,該書是available online

你嘗試一些注意事項:

  1. $是使用其值設置爲要求更換可變。它不是變量名稱的一部分,因爲它在Perl或PHP中。所以它不在任務的左側使用。

  2. 該shell主要用於運行其他可執行文件,並通過該鏡頭解釋所有內容。如果命令行看起來像是另一個程序的調用,那麼shell將嘗試運行其他程序,而不是執行任何shell-scripty。因此,命令min = date +"%M"將導致shell尋找名爲min的程序並使用三個命令行參數執行它:=date+%M
    爲了讓作業被識別,=周圍不能有空間。

  3. 但是沒有空格,min=date +"%M"仍然不正確。 shell會暫時將字符串「date」分配給變量min,然後嘗試運行一個名爲+%M的命令。
    如果一個值中有空格,則需要在其周圍有引號。

  4. 即使使用引號,min="date +%M"也會將文字字符串「date +%M」分配給min。如果您確實想要運行命令date +"%M"並將其輸出用作值,則必須使用命令替換語法$(...)來請求它。在這裏,我們的朋友美元符號再次請求動態值替換,但括號使它成爲不同類型的請求;而不是變量的值,該表達式被命令的輸出替換。

  5. 由於上面提到的解析問題,內置的算術運算只能在特定的上下文中使用。創建有效算術語境的兩種方法是(( ... ))特殊格式和let命令。

  6. 最後,即使您的腳本語法上有效,但如果您的目標是向下舍入到最接近的15的倍數,則它在語義上不正確。除以1後的餘數始終爲零,因此腳本以試圖從min減去0,並且無論如何不會對結果做任何處理,因爲沒有任何任務返回到min。如果你想要捨去,你必須減去你剛纔測試的餘數。你可以做這樣的:

    min=$(date +%M) 
    let rem=min%15 
    if ((rem != 0)); then 
        let min-=rem 
    fi 
    echo $min 
    

但你也可以做多一點簡潔:

echo $((min=$(date +%M), min-=min%15)) 

這工作沒有if因爲減去0是無害的。逗號只是讓我們把兩個表達式放在一組((...))之內。第二個表達式min-=min%15是一個修改賦值 - 它意味着與min=min-min%15相同,但爲我們節省了輸入「min」的一個實例。把我們的朋友替換請求$(( ... ))前導致整個表達式被其值替換,以便echo得到某些東西打印出來。表達式列表的值是最後一個表達式的值,並且賦值的值與分配的值相同,所以echo ed的結果與$min的最終值相同:最接近小時後15分鐘的多倍。

在shell的術語中,變量實際上被稱爲「參數」。在閱讀文檔時,請牢記一點。

你居然需要在爲此命令%M周圍引號。 shell中的所有內容都自動成爲一個字符串;你不需要引號來使它成爲一個。但是,它們並沒有受到傷害,並且在事物周圍添加引號是一個很好的習慣,因爲它可以防止代碼被輸入值中意外的特殊字符破壞。

+0

非常感謝,這確實是很多信息。您的第一個代碼片段會產生錯誤「第6行:語法錯誤:文件意外結束」。我真的不明白第二個例子中發生了什麼,但它沒有返回值。 – 1252748

+0

@thomas我剛剛證實,這兩個例子都適合我,從這裏複製並粘貼到我的終端窗口中。不過,我做了一些編輯,所以請仔細檢查。 –

0
min=`date +"%M"`; 

if [ $min%15 != 0 ] 

then 

min=$((min - min%1)) 

fi 

echo $min;