2013-10-31 73 views
0

我想的inputLineNumber將值設置爲20,如果沒有值由用戶給出由我試圖檢查[[-z「$ inputLineNumber」]],然後通過inputLineNumber = 20設定值。該代碼給出了這條消息./t.sh:[-z:找不到作爲控制檯上的消息。如何解決這個問題?這是我的完整腳本。如何在Unix中輸入錯誤/無效輸入時設置默認值?

#!/bin/sh 
cat /dev/null>copy.txt 
echo "Please enter the sentence you want to search:" 
read "inputVar" 
echo "Please enter the name of the file in which you want to search:" 
read "inputFileName" 
echo "Please enter the number of lines you want to copy:" 
read "inputLineNumber" 
[[-z "$inputLineNumber"]] || inputLineNumber=20 
for N in `grep -n $inputVar $inputFileName | cut -d ":" -f1` 
do 
    LIMIT=`expr $N + $inputLineNumber` 
    sed -n $N,${LIMIT}p $inputFileName >> copy.txt 
    echo "-----------------------" >> copy.txt 
done 
cat copy.txt 

從@Kevin建議後改劇本。現在,該錯誤信息./t.sh:在第11行語法錯誤:`$」意外

#!/bin/sh 
truncate copy.txt 
echo "Please enter the sentence you want to search:" 
read inputVar 
echo "Please enter the name of the file in which you want to search:" 
read inputFileName 
echo Please enter the number of lines you want to copy: 
read inputLineNumber 
[ -z "$inputLineNumber" ] || inputLineNumber=20 

for N in $(grep -n $inputVar $inputFileName | cut -d ":" -f1) 
do 
    LIMIT=$((N+inputLineNumber)) 
    sed -n $N,${LIMIT}p $inputFileName >> copy.txt 
    echo "-----------------------" >> copy.txt 
done 
cat copy.txt 

回答

0

嘗試從改變這一行:

[[-z "$inputLineNumber"]] || inputLineNumber=20 

要這樣:

if [[ -z "$inputLineNumber" ]]; then 
    inputLineNumber=20 
fi 

希望這有助於。

+0

這不起作用。同樣的錯誤:( – user2889968

0

從哪裏開始?

您正在運行的/bin/sh但試圖使用[[[[sh不能識別的bash命令。將shebang更改爲/bin/bash(首選)或使用[代替。

您沒有[[-z之間的空間。這會導致bash將其作爲名爲[[-z的命令讀取,這顯然不存在。你需要[[ -z $inputLineNumber ]](注意最後的空格)。在[[內引用並不重要,但如果您更改爲[(請參見上面的內容),則需要保留引號。

你的代碼說[[-z,但你的錯誤說[-z。選一個。

使用$(...)而不是`...`。反引號已被棄用,並且$()可以正確處理引用。

你不需要cat /dev/null >copy.txt,當然不是兩次都沒有寫在它之間。使用truncate copy.txt或只是簡單>copy.txt

您似乎有不一致的引用。引用或轉義(\x)帶有特殊字符(~, `, !, #, $, &, *, ^,(), [], \, <, >, ?, ', ", ;)的任何東西或空格以及任何可能有空格的變量。您不需要引用沒有特殊字符的字符串文字(例如":")。

而不是LIMIT=`expr...`,使用limit=$((N+inputLineNumber))

+0

感謝您對整個腳本的寶貴意見,而不僅僅是手頭上的問題。顯然,正如您可能已經猜到的,我對Unix非常陌生(基本上是我的第一個腳本:))。我所做的更改 - > 1)更改了** [[**到** [** 2]現在引用已修復! 3)/ dev/null被truncate替換。 4)是的,我發佈後,我也注意到了兩倍的部分。儘快糾正它,但你更快!:D沒有做過的變化 - > 1)儘管z之前的空間已經存在於我的代碼中了。雖然不知道如何在粘貼時刪除: – user2889968

+0

關於最後一個** LIMIT **部分,我也改變了你可能在這個問題上有一兩個疑問?這個雙括號在這裏的瞳孔是什麼?如何在沒有$的情況下獲取該變量的值(這是雙括號的目的)? – user2889968

+0

'$((... )''比'expr'更乾淨,是的,你不需要sigil('$')。 – Kevin

相關問題