我可以在bash shell脚本中使用正则表达式

时间:2015-03-13 19:04:59

标签: regex linux bash shell

我是计算机技术专业的第一年学生,之前从未实际使用过Linux。我很快掌握了脚本的基础知识,并且正在尝试编写一个脚本,为每个作业创建一个目录和一个软链接。看到我们平均每周两次任务,我认为这会有所帮助。

我无法让我的脚本只接受数字作为变量。我主要是使用3个case语句来工作(主要是),但是如果可以的话,宁愿使用带有if语句的基本正则表达式。

if [ $# != 1 ]; then

    red='\033[0;31m'
    NC='\033[0m'
    blue='\033[1;34m'
    NC='\033[0m'
    echo 1>&2 "${blue}ERROR:${NC} $0 :${red}expecting only one variable, you gave $#($*)${NC}"
    echo 1>&2 "${blue}Usage:${NC} $0 :${red}number of assignment.${NC}"
    exit 2

fi


case $1 in

    [[:punct:]]*) echo 1>&2 "Numeric Values Only"
    exit 2
    ;;
    [[:alpha:]]*) echo 1>&2 "Numeric Values Only"
    exit 2
    ;;
    [[:space:]]*) echo 1>&2 "Numeric Values Only"
    exit 2
    ;;
esac

然后脚本生成目录并为标记脚本(如果已发布)创建软链接,并结束。任何人都可以帮我缩短/消除案例陈述

1 个答案:

答案 0 :(得分:1)

您不能在便携式shell脚本中使用正则表达式(可在任何符合POSIX标准的shell上运行的脚本)。通常,shell中的模式是globs,而不是正则表达式。

也就是说,还有其他一些选择。如果你专门使用Bash,你有两个选择;你可以使用扩展的globs,它可以为你提供一些类似于regex的功能:

shopt -s extglob

case $1 in
    +([[:digit:]]) ) echo "digits" ;;
    *) echo "not digits" ;;
esac

另一种选择是Bash在[[ ]] conditional construct中有=~运算符来匹配正则表达式的字符串;这不适用于case语句,但适用于if

if [[ $1 =~ [0-9]+ ]]
then
    echo "digits"
fi

最后,如果你想要进行可移植的正则表达式匹配(因此它将在其他POSIX shell中运行,如ashdashkshzsh等) ,你可以呼叫grep;如果您通过-q,它将对匹配保持沉默但返回成功或失败,具体取决于输入是否匹配:

if echo "$1" | grep -qE "[0-9]+"
then
    echo "digits"
fi