我的shell脚本接受一组输入变量,其中一些是可选的。输入应遵循以下签名。
myscript.sh var1 var2 [-x var3] [-y var4]`。
-x和-y是可选输入,这些选项可以在任何位置发生(在var1和var2之间或在开始时),但var3总是在var4之前。 var1也将在var 2之前。
如果有其他检查来覆盖所有概率,我所做的脚本会做很多。 像这样的东西
if [ $1 == "-x" ]; then
## Then check if $3 == "-y"
## Assign values to VAR1 , VAR2, VAR3, VAR4
## else check for other possibilities
fi
我想知道是否有更好的方法来执行此操作并将值分配给变量?
答案 0 :(得分:3)
看看getopts
man getopts
如果您想要长GNU样式切换,请参阅
和
答案 1 :(得分:2)
足够简单,甚至不需要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
答案 2 :(得分:1)
正如查尔斯所说:这只适用于bash(&gt; 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")
答案 3 :(得分:1)
通过测试确保选项参数(如果提供)仅提供一次。
#!/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")