使用正则表达式进行Bash参数验证

3

我不知道如何在bash中正确使用正则表达式,尝试用以下方法时出错了,请问这个正则表达式有什么问题?

#!/bin/bash

if [ ! $# -eq 1 ]; then
        echo "Error: wrong parameters"
else
        if [ $1 =~ "[a-z]" ]; then
                echo "$1: word"
        elif [ $1 =~ "[0-9]" ]; then
                echo "$1: number"
        else
                echo "$1: invalid parameter"
        fi
fi

对于像这样的简单检查,请考虑使用 casecase $1 in *[!A-Za-z0-9]*) echo invalid;; *[A-za-z]*) echo word;; '') echo empty;; *) echo number;; esac - tripleee
3个回答

15

我修改了你的脚本,并使用以下代码得到了预期的结果:

  #!/bin/bash                                                                                                                                                                                      
  if [ ! $# -eq 1 ]; then
    echo "Error: wrong parameters"
  else
    if [[ $1 =~ ^[a-z]+$ ]]; then
      echo "$1: word"
    elif [[ $1 =~ ^[0-9]+$ ]]; then
      echo "$1: number"
    else
      echo "$1: invalid parameter"
    fi
  fi

您不需要在正则表达式中加引号。


3
除非是为了把正则表达式的某一部分强制匹配成字符串,否则您不应该引用正则表达式。这是从man页面中得出的结论。 - glenn jackman

6
不要引用正则表达式并使用双方括号:

不要引用正则表达式,并使用双方括号:

[[ "$1" =~ [a-z] ]]

在这种特定情况下,引用变量并不是必须的,但这样做没有坏处,并且总是引用包含变量的字符串是一种良好的习惯,因为与单词分割相关的陷阱非常多。


谢谢l0b0,这个方法可行,你能解释一下为什么要用两个括号吗? - Ramon Saraiva
2
双括号表示Bash特定的条件结构,实现了正则表达式匹配运算符=~ - glenn jackman

-1
使用两个括号:
if [[ "$1" =~ [a-z] ]] ; then

我仍然收到“无效参数”的错误。 - Ramon Saraiva
1
该模式仅检查是否有一个字母字符,而不是没有非字母字符。其他答案已经提供了完整的解决方案。 - tripleee
@tripleee,问题是要求在bash中使用正则表达式的正确机制,而不是匹配“单词”的正则表达式模式的正确性(尽管我现在看到这实际上是Ramon试图做的)。 - asf107

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接