2015-11-17 139 views
1

场景。我有这样的代码:
While循环变量未定义时

regexp="[^0-9A-Za-z]+" 
while [[ $var =~ $regexp ]] 
do 
{ 
    var=$(dialog --inputbox "File name (number and letters only): " 12 60 --stdout) 
} 
done 
echo $var 

条件

变量VAR不应之前语句设置(未设置);

目标

离开只有当变量有字母数字值的语句。


但是,如果我尝试运行它不工作。它的工作原理,如果我设置了可变VAR,e.g:

regexp="[^0-9A-Za-z]+" 
var="_" 
while [[ $var =~ $regexp ]] 
do 
{ 
    ... 

现在,如何运行,而不设置变量VAR代码?

+0

有一个在你的逻辑在这里的错误:你必须在'while'之前初始化'var'或者将'while'放入'while while; ...完成。匹配1个或更多字母数字字符的正则表达式是'[0-9A-Za-z] +'。 –

回答

2

您可以使用while true环和break如果条件得到满足:

while true; do 
    # Read variable 
    var=$(dialog ...) 

    # Check regex and break if it matches 
    [[ "$var" =~ $regexp ]] && break 
done 

顺便说一下,正则表达式应该是:

regexp="^[[:alnum:]]+$" 
+0

对不起,但如果我使用这个解决方案,我会失去对话工具的退出代码。 – mikilinux

+0

你为什么失去退出代码? – hek2mgl

+0

对不起,但不行:无限循环。尝试使用单词test和_test – mikilinux

2

您可以使用默认变量值

regexp="[^0-9A-Za-z]+" 
while [[ ${var:-#} =~ $regexp ]]; do 
    var=$(dialog --inputbox "File name (number and letters only): " 12 60 --stdout) 
done 
echo "$var" 

${var:-#}将返回#var为空或未设置,否则它返回变量的值。

+1

好!布拉沃! 它的工作原理!非常感谢! – mikilinux

+1

很高兴知道它解决了问题,[您可以点击答案左上角的勾号**标记答案](http://meta.stackexchange.com/a/5235/160242) – anubhava

2

代替检查var是否与非法值匹配,请检查是否与匹配的是合法值。

# Drop the^from the beginning of the character class 
regexp="[0-9A-Za-z]+" 
# Negate the condition with ! 
while [[ ! $var =~ ^$regexp$ ]] 
do 
    var=$(dialog --inputbox "File name (number and letters only): " 12 60 --stdout) 
done 
echo $var 

也有小看出until命令(以及包括字母和数字,同时尊重当前区域设置预先定义的字符类):

until [[ $var =~ ^[[:alnum:]]+$ ]]; do 
+0

对不起,但不工作。尝试使用“测试”和“_test”字样。随着测试摆脱while语句,使用_test离开while语句......但只有在测试时应该在语句之外。 – mikilinux

+1

我忘了把比赛停下来;看到更新。 – chepner

+0

宾果!好样的! 它的工作原理! – mikilinux