【问题标题】:While loop when variable is not defined未定义变量时的while循环
【发布时间】:2016-02-19 11:34:32
【问题描述】:

场景。我有这个代码:

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不应在while语句之前设置(未设置);

目标

仅当变量具有字母数字值时才保留 while 语句。


但是如果我尝试运行它就不起作用。如果我设置变量 var,它就可以工作,例如:

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

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

【问题讨论】:

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

标签: regex bash shell loops while-loop


【解决方案1】:

您可以使用默认变量值

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 为 null 或未设置,否则返回变量的值。

【解决方案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

【讨论】:

  • 对不起,但不工作。尝试使用单词“test”和“_test”。用 test 退出 while 语句,用 _test 退出 while 语句……但只有用 test 才能退出 while 语句。
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 抱歉,如果我使用这个解决方案,我会丢失对话工具的退出代码。
  • 对不起,但不起作用:无限循环。尝试使用单词 test 和 _test
  • 我做到了。 test 是有效的,意味着它会打破 lop。 _test 不是。你在使用我发布的正则表达式吗?
  • 您可以在var=... 行之后使用status=$? 保存dialog 的退出状态。
  • 抱歉,无限循环。但它运行正确,删除了“检查正则表达式并在匹配时中断”中的双引号,例如使用这个 LOC:[[ $var =~ $regexp ]] && break。为什么?有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2016-01-12
  • 2015-05-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多