如何检查变量在Bash中是否包含至少一个字母字符?

时间:2016-03-30 13:40:05

标签: bash

我使用的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

3 个答案:

答案 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