bash script parameters
本问题已经有最佳答案,请猛点这里访问。
我需要编写一个bash脚本,并希望它解析格式的无序参数:
1 | scriptname --param1 <string> --param2 <string> --param3 <date> |
有没有一个简单的方法可以做到这一点,或者我是被1美元,2美元,3美元卡住了?
你要的是getopts。
1 2 3 4 5 6 7 8 9 10 11 12 13 | while [[ $1 = -* ]]; do arg=$1; shift # shift the found arg away. case $arg in --foo) do_foo"$1" shift # foo takes an arg, needs an extra shift ;; --bar) do_bar # bar takes no arg, doesn't need an extra shift ;; esac done |
mcurl是一个很好的例子,它说明了如何并行实现短和长的交换机:
http://www.goforlinux.de/scripts/mcurl/
正如前面提到的,bash有一个getops函数,可以解决您的问题。
如果您需要更复杂的东西,bash还支持位置参数(订购$1…9美元,然后10美元。$n),您必须想出自己的逻辑来处理这个输入。一个简单的方法是在for循环中放置一个开关/案例,迭代参数。您可以使用处理输入的两个特殊bash变量之一:$*或$@。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #!/bin/bash # Parse the command-line arguments while ["$#" -gt"0" ]; do case"$1" in -p1|--param1) PARAM1="$2" shift 2 ;; -p2|--param2) PARAM2="$2" shift 2 ;; -p3|--param3) PARAM3="$2" shift 2 ;; -*|--*) # Unknown option found echo"Unknown option $1." exit 1 ;; *) CMD="$1" break ;; esac done echo"param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD" |
当我执行此操作时:
1 | ./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command |
它输出您所期望的:
1 | param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command |