我使用的bash版本是4.3.11,我使用'mcedit'作为我的脚本编写者。我想检查变量是否包含至少一个字母字符,以便'harry33'和'a1111'被认为有效。
我在我的脚本中尝试了下面的代码,但是返回了一个错误,指出'[:'
出错了解决
#name = "test123"
read -p "Enter you name: " name
until [[ "$name" =~ [A-Za-z] ]]; do
read -p "Please enter a valid name: " name
done
答案 0 :(得分:3)
你写的代码有几个空格问题(一个你已经在[[
之后纠正过),并且相等的空格应该不:
name="test123"
if [[ "$name" =~ [A-Za-z] ]]; then
echo "Please enter valid input: "
fi
在这种情况下,行将打印:“请输入有效输入:”
由于$name
包含a-z
范围内的多个值。
如果变量包含字符在范围内
,也许您想要的是相反的,即打印的行。name="test"
if [[ "$name" =~ [^A-Za-z] ]]; then
echo "The input contains characters outside the a-z or A-Z range."
fi
但在这种情况下,接受的字符可能包括重音(国际)字符,如é
,è
或ë
。几个语言整理序列中的in-range
。
[^[:alpha:]]
也会发生这种情况。
要么完全国际化,要么限制自己使用旧的ASCII:
name="test"
LC_COLLATE=C
if [[ "$name" =~ [^A-Za-z] ]]; then
echo "The input contains characters outside the a-z or A-Z range."
fi
如果您希望使用Alpha和数字作为有效名称,则有两个选项。一个非常严格的(旧的ASCII范围):
name="harry33"
LC_COLLATE=C
if [[ "$name" =~ ^[0-9A-Za-z]+$ ]]; then
echo "The input only contains digits and alpha."
fi
另一个选项还允许é
,ß
或đ
等(对国际化名称来说完全没问题),范围由变量LC_COLLATE定义或者在环境中设置的LC_ALL。
name="harry33"
if [[ "$name" =~ ^[[:alnum:]]+$ ]]; then
echo "The input only contains digits and alpha."
fi
此选项会拒绝$%&()
及类似内容。
答案 1 :(得分:1)
没有像 $html = '<h1>HTML Example</h1>
<h2>List</h2>
Some special characters: € è ù à \\ \\\
';
// output the HTML content
$pdf->writeHTML(utf8_encode($html), true, false, true, false, '');
//Close and output PDF document
$pdf->Output('example_006.pdf', 'I');
这样的基本原理的便携式解决方案将是
[[
答案 2 :(得分:1)
首先,Bash对间距很挑剔,所以在你的测试括号之后有一个空格[[和]]另外,如果你正在寻找用户名,我认为你希望它以字母开头,并且如果没有,请回复你的提示。
if [[ ! $var =~ ^[[:alpha:]] ]]; then
echo -n "Please enter valid input: "
read response
fi