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

标签 regex linux bash shell

我是一年级计算机技术专业的学生,​​之前从未真正使用过 linux。我很快就掌握了脚本编写的基础知识,并且正在尝试编写一个脚本来为每个作业创建一个目录和一个软链接(soft link)。看到我们平均每周完成两次作业,我认为这会有所帮助。

我无法让我的脚本只接受数字作为变量。我主要(主要)使用 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

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

最佳答案

您不能在可移植的 shell 脚本(将在任何 POSIX 兼容的 shell 上运行的脚本)中使用正则表达式。一般来说,shell 中的模式是 globs ,不是正则表达式。

也就是说,还有其他一些选择。如果您专门使用 Bash,则有两种选择;你可以使用扩展的 globs,它给你一些类似正则表达式的功能:

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 中运行,如 ashdashksh , zsh 等), 你可以调用grep;如果你传递 -q,它将对匹配保持沉默,但根据输入是否匹配返回成功或失败:

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

关于regex - 我可以在 bash shell 脚本中使用正则表达式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040069/

相关文章:

linux - 如何在模式前将一个文件的内容插入到另一个文件中

java - 为什么下面的程序会出现PatternSyntaxException?

javascript - 有没有更好的方法来匹配 JavaScript 中 URL 路径名的一部分?

linux - Apache-CGI-Bash 应用程序中的安全性或其他陷阱?

linux - 如何使用 scrapy 命令动态创建 Feed Export 的文件名

linux - 用于重新启动程序的 Bash 函数

linux - 从 bash 脚本调用时,Makefile 删除参数后的空白值

linux - 获取 Linux 接口(interface)上传入/传出带宽速度的快照?

html - 使用 R 提取 html 标签中的内容

python re.findall 奇怪的行为