$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
有人知道较短的代码来解析参数比上面这个吗?