分析shell脚本参数
有很多的方式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 = [email protected]
样品运行的样子:
$ ./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}
...
@Zac很好的接收,谢谢。 – 2011-02-03 03:58:56
请注意,`getopts`是一个Bash内建函数,而`getopt`是一个外部实用程序。前者只适用于较短的选项(例如`-e`),而后者也适用于较长的选项(例如`-foo`)。请注意,有一些[问题](http://mywiki.wooledge.org/BashFAQ/035),必须解决后者(后续版本的`getopt`问题较少)。 – 2014-03-14 00:50:59
这里有一个简单的方法来处理长期和短期的选项:在这种格式
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
从How can I handle command-line arguments (options) to my script easily?
我采用上面威廉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
难道有人知道更短的代码来解析参数比这上面?
考虑不选择选项,而是通过环境传递值:例如“host = hostname user = me myscript.sh” – 2011-02-03 17:25:11
http://*.com/questions/192249/how-do-i-parse-command -bash-arguments-in-bash,它比较纯粹的bash switch,getopts(POSIX shell内置)和getopt(非推荐,除非它是util-linux版本,并且你使用它非POSIX功能,以避免与空参数问题,等等。) – 2015-09-05 04:35:15