Bash - 如何根据命令行参数改变case语句中的位置参数?

时间:2015-08-07 23:40:09

标签: linux bash shell user-input case-statement

tl; dr summary:在Bash中,根据用户输入处理具有不同位置的多个命令行参数的最佳方法是什么?

我有一个包含多个case语句的脚本来处理多个参数。但是,每个参数的位置可能会根据用户输入而有所不同。我有这样的事情:

case $1 in 
-a) 
    this lists all package tracking info
    ;;
-u)
    this lists only the most recent update
    ;;
-d)
    this runs -u in a loop of intervals of n (secs, mins, or hours)
    ;;
...
esac

case $2 in
-f)
    this parses $file (default or user-defined)
    ;;
    ...
esac

这里棘手的部分是,当用户传递参数-d时,他们可以选择指定daemon()运行它的循环的时间间隔,例如{{ 1}}。我还想让用户能够指定要解析的文件(-d 2h标志)。当用户指定-f时,没有问题,但是当他们指定时间和文件-d -f时,则-d 2h -f file.txt = $2和{{1 }} = 2h导致$3稍后在脚本中被解释为其他内容(包跟踪号)。

因此,我尝试在case语句1和2之间使用条件来更改第二个case语句中的-f。类似的东西:

-f

但是,这似乎不起作用。当我在命令行输入$2时,if [[ "$2" =~ ^.[h,m,s] ]]; then last_flag="/$3" else last_flag="/$2" fi case $last_flag in -f) check_flag ;; esac = -d 2h -f按预期方式,但echo $last_flag未在案例陈述中被替换。我也不认为逃脱的$是问题(我没试过也试过)。

  • 我在这里做错了什么?
  • 有没有更好的方法来处理Bash中不同位置的多个输入参数?

我认为最简单的方法就是简单地改变标志的顺序,将$3留在最后,因此用户是否指定时间间隔并不重要。但是,在其他情况下,输入参数将被移位,例如,如果用户通过$last_flag但没有提供文件名(在这种情况下,选择默认文件)。所以无论哪种方式,我都要面对这个问题。我怀疑它需要重写脚本的一般流程,但也许不需要。

0 个答案:

没有答案