在bash脚本上使用regex来识别选项参数

时间:2017-05-31 14:54:21

标签: regex bash shell parameters sh

我对这个话题相当新,如果这个问题无关紧要,我道歉。我彻底搜索了网站,但没有找到答案。

我正在为大学项目制作这个shell脚本,我们使用rsync和crontab来同步文件夹。我正在尝试向用户提供自定义rsync和crontab参数的可能性,如下所示:

rsync接受-auvn。我尝试在我的.sh文件中制作folling正则表达式:

#!/bin/bash

#(...) lots of previous code

if [[ $1 =~ ^-a?u?v?n? ]]; then
    if [ $1 != "-" ]; then

但它接受诸如“-x”之类的参数。你可以看到第二个 if 表明我不知道我在做什么!

crontab接受五个参数:

  • min,[0,59]或* if any;
  • 小时,[0,23]或*如果有的话;
  • 星期几,[周一,周二,......,太阳]或*如果有的话;
  • 月,[Jan,Feb,...,Dec]或*如果有的话;
  • 年,2017年及前进,或*如果有的话;

我并不担心crontab正则表达式(现在),但我正在努力使rsync正则表达式工作。我下载了rsync源代码以了解它们如何处理它们的选项参数,但是大多数脚本都是用C语言编写的,它超出了这个项目的范围。我也可以将用户请求的任何内容发送到rsync选项并观看它爆炸,但我想先给它一些处理。

谢谢!

1 个答案:

答案 0 :(得分:1)

[[ $1 =~ ^-[auvn]+$ ]]

即,检查减号,然后多次检查任何“auvn”字母,直到结束。如何在命令行中进行测试:

$ [[ '-auvn' =~ ^-[auvn]+$ ]] && echo yes || echo no
yes
$ [[ '-a' =~ ^-[auvn]+$ ]] && echo yes || echo no
yes
$ [[ '-x' =~ ^-[auvn]+$ ]] && echo yes || echo no
no