我正在执行名为./myscript.sh的shell脚本,其中有两个选项,如下面的
./ myscript.sh -d / root / -n“dhoni”“kohli”
第一个选项是-d,值是/ root /
第二个选项是-n,在当前示例中,值为dhoni和kohli
但是每次执行此脚本时,为-names选项传递给此脚本的名称数量可能会有所不同
我为此编写的代码是
EMPNAMES=("$@")
while getopts "d:n:" arg; do
case "$arg" in
d) PATH="$OPTARG"
;;
n) EMPNAMES="$OPTARG"
;;
for arg in "${EMPNAMES[@]}"; do
echo "$arg"
done
它应该打印
多尼船
科利
但它正在印刷
多尼船
/根/
-names
多尼船
科利
答案 0 :(得分:2)
empnames=( "$@" )
没有意义,因为您正在初始化它以包含脚本在启动时传递的每个参数。相反,将其初始化为空,并在每次找到适当的参数时附加到它。
请注意,n:
在-n
之后立即指定一个参数。如果要指定两个名称,请在每个名称前添加-n
,如下所示:
#!/usr/bin/env bash
# set argument list, just as if the script were called with these arguments
set -- -d /root/ -n "dhoni" -n "kohli"
# Initialize your array to start out empty
empnames=( )
while getopts "d:n:" arg; do
case "$arg" in
d) path="$OPTARG" ;;
n) empnames+=( "$OPTARG" ) ;;
esac
done
for arg in "${empnames[@]}"; do
echo "$arg"
done
... properly emits:
dhoni
kohli
答案 1 :(得分:1)
n) EMPNAMES="$OPTARG"
分配给一个数组,在bash中默认为该数组的第一个元素,替换之前的-d
。
getopts
选项只占一个,kohli
作为主体参数。