将数组传递给shell脚本的选项不起作用

时间:2018-02-12 15:41:00

标签: bash shell

我正在执行名为./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
多尼船
科利

2 个答案:

答案 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作为主体参数。