2013-05-02 75 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