2013-05-02 72 views
3

我使用腳本壓縮文件。我想做一個'直到循環'直到變量的內容與模式匹配。劇本使用zenity。這是主要的部分:如何grep一個字符串直到循環在bash中?

part="0" 
pattern="^([0-9]{1}[0-9]*([km])$" 
until `grep -E "$pattern" "$part"` ; do 
    part=$(zenity --entry \ 
    --title="Zip the file" \ 
    --text "Choose the size of divided parts: 
(0 = no division, *m = *mb, *k = *kb)" \ 
    --entry-text "0"); 

    if grep -E "$pattern" "$part" ; then 
     zenity --warning --text "Wrong text entry, try again." --no-cancel; 
    fi 
done 

我希望它接受包含字符串的數字與「k」或「M」(而不是他們兩個)結束,不接受字符串開始與「0」。

模式是否正常?

+0

等一下,問題只是模式是否正常?或者你對整個腳本有問題?如果你只關心模式,你可以大大簡化問題,刪除非重要的部分。 – Shahbaz 2013-05-02 15:21:03

回答

5
$ grep -w '^[1-9][0-9]*[km]$' <<< 45k 
45k 
$ grep -w '^[1-9][0-9]*[km]$' <<< 001023m 
$ grep -w '^[1-9][0-9]*[km]$' <<< 1023m 
1023m 

不要忘了在表達<<<,你不grep'ing一個文件,而是一個字符串。要更符合POSIX標準,您還可以使用:

echo 1023m | grep -w '^[1-9][0-9]*[km]$' 

但它有點醜陋。

編輯

更長的例子:

initmessage="Choose the size of divided parts:\n(0 = no division, *m = *mb, *k = *kb)" 
errmessage="Wrong input. Please re-read carefully the following:\n\n$initmessage" 

message="$initmessage" 

while true ; do 
    part=$(zenity --entry \ 
     --title="Zip the file" \ 
     --text "$message") 
    if grep -qw '^[1-9][0-9]*[km]$' <<< "$part" ; then 
     zenity --info --text 'Thank you !' 
     break 
    else 
     message="$errmessage" 
    fi 
done 

而且,這是沒有直接關係的問題,但你可能想看看Yad,這確實基本上是相同的東西Zenity的確如此,但有更多選擇。當我必須編寫Bash腳本時,我使用了它,並發現它比Zenity更有用。

+0

謝謝。我必須使用zenity(它是項目的指令)。 我有一個模式問題。我希望它接受上面說的和'0'(如果沒有劃分)。 – Nojas 2013-05-02 17:20:38

+0

@Nojas:我想你想要這個:'grep -E'(^ 0 $ |^[1-9] [0-9] * [km] $)' – michaelmeyer 2013-05-02 19:13:19

+0

它不適用於0也不適用其餘的模式。 – Nojas 2013-05-02 20:25:47

3

你不想在until行中使用反引號。你可能會這樣寫:

until grep -E "$pattern" "$part" 
do 
    ...body of loop... 
done 

或者您可以添加參數grep抑制輸出(或輸出發送到/dev/null)。正如所寫,腳本試圖執行grep命令的輸出,並使用該命令的成功/失敗狀態(而不是grep本身)作爲是否繼續循環的指示。

此外,您的模式需要一些工作。它是:

pattern="^([0-9]{1}[0-9]*([km])$" 

那裏有一個無與倫比的左括號。它也看起來好像它試圖讓一個前導零。你可能想要:

pattern='^[1-9][0-9]*[km]$' 

單引號通常比雙引號比正則表達式更安全。


我只是想檢查我的變量稱爲part是Zenity輸入對話框中寫入之後良好的。我剛剛意識到grep需要一個文件,但我的part是在此腳本中初始化的變量。如何相處?

bash,你可以使用<<<操作員從字符串重定向:

until grep -E "$pattern" <<< "$part" 

在大多數其他炮彈,你會寫:

until echo "$part" | grep -E "$pattern" 

這也適用於bash , 當然。

+0

Thanks.I只是想檢查我的變量被稱爲'部分'是否在將它寫入到zenity輸入對話框中之後形成的。我只是意識到grep需要一個文件,但我的'部分'是在這個腳本中初始化的變量。如何相處? – Nojas 2013-05-02 15:31:47