方案即可。我有这个代码:
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 的情况下运行该代码?
答案 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