繁体   English   中英

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

[英]can i use regex in a bash shell script

我是计算机技术员一年级的学生,在此之前从未真正使用过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

然后,脚本创建目录并为标记脚本创建软链接(如果已发布),然后结束。 谁能帮助我缩短/消除案件陈述

您不能在可移植外壳脚本(将在任何POSIX兼容外壳上运行的脚本)中使用正则表达式。 通常,shell中的模式是glob ,而不是正则表达式。

也就是说,还有其他一些选择。 如果您专门使用Bash,则有两种选择。 您可以使用扩展的glob,从而为您提供一些正则表达式之类的功能:

shopt -s extglob

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

另一种选择是Bash在[[ ]]条件结构中具有=~运算符,以将字符串与正则表达式进行匹配; 这在case语句中不起作用,但是在if起作用:

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

最后,如果您想方便地进行正则表达式匹配(因此它将在ashdashkshzsh等其他POSIX shell中运行),则可以调用grep 如果传递-q ,则将-q匹配,但根据输入是否匹配返回成功或失败:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM