分析shell脚本参数

$myscript.sh -host blah -user blah -pass blah 

我想把论据传递给它。

我习惯做$1$2$3 ….但我想开始命名它们

有很多方法来解析sh中的参数。 Getopt很好。 这里有一个简单的脚本来手工分析:

 #!/bin/sh while echo $1 | grep -q ^-; do eval $( echo $1 | sed 's/^-//' )=$2 shift shift done echo host = $host echo user = $user echo pass = $pass echo args = $@ 

示例运行如下所示:

 $ ./a.sh -host foo -user me -pass secret some args host = foo user = me pass = secret args = some args 

请注意,由于脚本eval是由用户构造的字符串,因此它甚至不具有远程健壮性并且对安全漏洞大量开放。 这仅仅是为了做一个可能的做事方式的例子。 更简单的方法是要求用户在环境中传递数据。 在bourne shell(即,不在csh系列中的任何东西)中:

 $ host=blah user=blah pass=blah myscript.sh 

很好地工作,变量$host$user$pass将在脚本中可用。

 #!/bin/sh echo host = ${host:?host empty or unset} echo user = ${user?user not set} ... 

男人getopt

这是一个简单的方法来处理多头和空头的选择:

 while [[ $1 == -* ]]; do case "$1" in -h|--help|-\?) show_help; exit 0;; -v|--verbose) verbose=1; shift;; -f) if (($# > 1)); then output_file=$2; shift 2 else echo "-f requires an argument" 1>&2 exit 1 fi ;; --) shift; break;; -*) echo "invalid option: $1" 1>&2; show_help; exit 1;; esac done 

从哪里可以轻松处理命令行参数(选项)到我的脚本?

我采用以上威廉Pursell例子(与丹尼斯威廉姆森的建议)的参数在这种格式:script -param1 = value1 -param2 = value2 …

这是带有单行参数解析器的代码(保存在文件“脚本”中):

 #!/bin/bash while echo $1 | grep ^- > /dev/null; do declare $( echo $1 | sed 's/-//g' | sed 's/=.*//g' | tr -d '\012')=$( echo $1 | sed 's/.*=//g' | tr -d '\012'); shift; done echo host = $host echo user = $user echo pass = $pass 

你这样称呼:

script -host=aaa -user=bbb -pass=ccc

结果是

 host = aaa user = bbb pass = ccc 

有人知道较短的代码来解析参数比上面这个吗?