【问题标题】:can i use regex in a bash shell script我可以在 bash shell 脚本中使用正则表达式吗
【发布时间】:2015-03-13 19:04:59
【问题描述】:

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

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

【问题讨论】:

标签: regex linux bash shell


【解决方案1】:

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

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

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 等),您可以调用 @987654333 @;如果你通过-q,它将对匹配保持沉默,但根据输入是否匹配返回成功或失败:

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

【讨论】:

  • 所有选项都产生了更多的错误消息,但使用了更多的 case 语句,脚本现在只接受数值。
  • @DanielPeregrym 如果您显示您使用的确切代码以及您收到的确切错误消息(使用更新的信息编辑您的问题),我可能会帮助您修复这些错误。在发布这些示例之前,我对它们中的每一个都进行了测试,因此我知道它们有效;我很想知道他们为什么不适合你。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 2010-12-10
  • 1970-01-01
  • 2015-03-23
  • 2011-11-01
  • 2021-12-05
  • 2010-09-29
相关资源
最近更新 更多