Bash中的命令行参数

Pas*_*cal 73 bash command-line-arguments

我想写一个带有不同参数的bash脚本.它应该像普通的linux控制台程序一样使用:

my_bash_script -p 2 -l 5 -t 20
Run Code Online (Sandbox Code Playgroud)

因此,值2应保存在名为pages的变量中,参数l应保存在名为length的变量中,值20应保存在可变时间内.

做这个的最好方式是什么?

The*_*eke 126

使用getopts内置:
这是一个教程

pages=  length=  time=

while getopts p:l:t: opt; do
  case $opt in
  p)
      pages=$OPTARG
      ;;
  l)
      length=$OPTARG
      ;;
  t)
      time=$OPTARG
      ;;
  esac
done

shift $((OPTIND - 1))
Run Code Online (Sandbox Code Playgroud)

shift $((OPTIND - 1)) 移动命令行参数,以便您可以访问脚本的可能参数,即 $1, $2, ...

  • @Federico令人困惑的`getopt`和`getopts` ...你应该仔细阅读你的引文(请撤回投票).你也可以阅读[这里](http://blog.onetechnical.com/2012/07/16/bash-getopt-versus-getopts/) (9认同)

Jo *_* So 11

有点像

pages=
length=
time=

while test $# -gt 0
do
    case $1 in
        -p)
            pages=$2
            shift
            ;;
        -l)
            length=$2
            shift
            ;;
        -t)
            time=$2
            shift
            ;;
        *)
            echo >&2 "Invalid argument: $1"
            ;;
    esac
    shift
done
Run Code Online (Sandbox Code Playgroud)

  • @StevenMackenzie,......我不确定我是否同意.如果你看一下[BashFAQ#35](http://mywiki.wooledge.org/BashFAQ/035),手动解析的例子(这是进一步的简化)确实是很多东西,只需要*can' T*.因此,这种做法更加灵活. (2认同)
  • @StevenMackenzie,...我们也处在一个人们被GNU主义所破坏的世界,例如能够混合可选和位置参数(除非使用` - `明确表示前者的结束和开头的后者独自).在默认情况下使用这种解析器执行类似`args + =("$ 1")的操作很容易; 使用getopts,"OPTIND"的截止点很难实现. (2认同)