而未定义变量时的循环

时间:2015-11-17 22:15:43

标签: regex bash shell loops while-loop

方案即可。我有这个代码:

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 ,它会起作用,例如:

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

现在,如何在没有设置变量 var 的情况下运行该代码?

3 个答案:

答案 0 :(得分:2)

如果符合条件,您可以使用while true循环和break

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

    # Check regex and break if it matches
    [[ "$var" =~ $regexp ]] && break
done
顺便说一句,正则表达式应该是:

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

答案 1 :(得分: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:-#}#的{​​{1}}返回null或取消设置,否则返回变量的值。

答案 2 :(得分: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