我的shell脚本需要一组inputvariables,一些是可选的。 input应遵循以下签名。
myscript.sh var1 var2 [-x var3] [-y var4]`。
-x和-y是可选的input,这些选项可以出现在任何位置(在var1和var2之间或在开始处),但是var3总是在var4之前。 另外var1将在var2之前。
我的脚本做了很多,如果其他检查涵盖所有的概率。 像这样的东西
if [ $1 == "-x" ]; then ## Then check if $3 == "-y" ## Assign values to VAR1 , VAR2, VAR3, VAR4 ## else check for other possibilities fi
我想知道是否有一个更好的方法来做到这一点,并赋值给variables?
通过测试来确保可选参数(如果提供)只提供一次。
#!/bin/bash die() { echo >&2 $@ exit 1 } declare -a vars_1_2 var1='' var2='' var3='' var4='' while [ "$1" ];do case $1 in -x ) [ "$var3" ] && die "Argument '-x' provided twice!" shift var3=$1 shift ;; -y ) [ "$var4" ] && die "Argument '-y' provided twice!" shift var4=$1 shift ;; * ) vars_1_2+=($1) ; shift ;; esac done [ ${#vars_1_2[@]} -ne 2 ] && \ die "Needed exactly 2 positional arguments. Got ${#vars_1_2[@]}." var1=${vars_1_2[0]} var2=${vars_1_2[1]} set | grep ^var
使:
$ ./parsargs.sh 12 33 -x 45 -y 67 -x 2 Argument '-x' provided twice! $ ./parsargs.sh 12 -x 45 -y 67 Needed exactly 2 positional arguments. Got 1. $ ./parsargs.sh 12 34 -x 45 -y 67 var1=12 var2=34 var3=45 var4=67 vars_1_2=([0]="12" [1]="34")
看看getopts
man getopts
如果你想要长时间的GNU风格的开关,请参阅
getopts_long_example
和
getopts_long
并建议在任何文件之前阅读文档: http : //mywiki.wooledge.org/BashFAQ/035
很简单,甚至不需要getopt。 请注意,以下内容仅使用bash语法,所以您应该使用#!/bin/bash
启动脚本,而不是#!/bin/sh
。
args=() while (( $# )); do if [[ $1 = -x ]] ; then x_val=$2 shift; shift elif [[ $1 = -y ]] ; then y_val=$2 shift; shift elif (( ${#args[@]} < 2 )); then args+=( "$1" ) shift else printf 'Unhandled argument: %q\n' "$1" >&2 exit 1 fi done if (( ${#args[@]} < 2 )) ; then echo "Needed at least 2 positional arguments; got only ${#args[@]}." >&2 exit 1 fi
另见相关的BashFAQ条目 。
正如查尔斯所说:这个工作只能在bash(> 2;)这个另外一个目的看起来更加紧凑:
#!/bin/bash declare -a vars_1_2 var1='' var2='' var3='' var4='' while [ "$1" ];do case $1 in -x ) shift ; var3=$1 ; shift ;; -y ) shift ; var4=$1 ; shift ;; * ) vars_1_2+=($1) ; shift ;; esac done if [ ${#vars_1_2[@]} -ne 2 ] ;then echo "Needed exactly 2 positional arguments. Got ${#vars_1_2[@]}." >&2 exit 1 fi var1=${vars_1_2[0]} var2=${vars_1_2[1]} set | grep ^var
让我们探讨这个代码:
$ ./parsargs.sh Needed at least 2 positional arguments. Got 0. $ ./parsargs.sh 12 Needed at least 2 positional arguments. Got 1. $ ./parsargs.sh 12 34 var1=12 var2=34 var3= var4= vars_1_2=([0]="12" [1]="34") $ ./parsargs.sh 12 34 56 Needed at least 2 positional arguments. Got 3. $ ./parsargs.sh 12 34 -x 56 var1=12 var2=34 var3=56 var4= vars_1_2=([0]="12" [1]="34") $ ./parsargs.sh 12 34 -x 56 -y 78 var1=12 var2=34 var3=56 var4=78 vars_1_2=([0]="12" [1]="34") $ ./parsargs.sh 12 34 -x 56 -y 78 -z 9 Needed at least 2 positional arguments. Got 4. $ ./parsargs.sh -x 56 12 -y 78 34 var1=12 var2=34 var3=56 var4=78 vars_1_2=([0]="12" [1]="34")