将getopts选项自动解析为bash中同名的动态变量

时间:2019-02-13 12:04:47

标签: bash command-line getopt getopts

我有一个bash脚本,上面写着3个命令行选项,bib,bob和boo ...,我想在用户选项中读入一个同名的bash变量,具体操作如下:

PARSED_OPTIONS=$(getopt -n $0  --long "bib:,bob:,boo:"  -- "$@")

eval set -- "$PARSED_OPTIONS";

while true; do
  case "$1" in

  --bib)
  bib=$2
  shift 2;;

  --bob)
  bob=$2
  shift 2;;

  --boo)
  boo=$2
  shift 2 ;;

  --)
  shift
  break;;

  esac
done

到目前为止一切正常,很好...

但是现在我想将其扩展到许多选项的列表中,因此与其写出一个长案例语句,不如以某种方式循环遍历选项列表并自动传递选项,将是非常不错的选择变量,沿着这些方向

opts="bib:,bob:,boo:," 

PARSED_OPTIONS=$(getopt -n $0  --long $opts -- "$@")

for arg in `echo $opts | tr , " "` ; do 
  eval set -- "$PARSED_OPTIONS";
  while true; do

    case "$1" in
      --${arg})
      declare $arg=$2
      shift 2
      ;;
      --)
      shift
      break;;
    esac
  done
done

我正在使用声明语句将参数放入同名的动态变量中(请参见Dynamic variable names in Bash第二个解决方案),该解决方案用于循环用逗号分隔的列表Loop through a comma-separated shell variable,但是我在这里陷入无限循环。我认为是因为2个未使用的选项是允许的,因为它们在PARSED_OPTIONS列表中,但是由于没有查找“ arg”,所以它们没有在循环中被切掉……我看不出一种明显的解决方法,但是我确定有一个。

1 个答案:

答案 0 :(得分:1)

我意识到我仍然将shift命令放在case语句中,所以这就是为什么它没有退出的原因。我还需要从参数中删除冒号:,所以这是我的自动bash脚本参数检索:

# specify an arbitrary list of arguments:

opts=bib:,bob:,boo:

PARSED_OPTIONS=$(getopt -n $0  --long "${opts}"  -- "$@")

for arg in ${opts//,/ } ; do 
  var=${arg//:} # remove the colon
  eval set -- "$PARSED_OPTIONS";
  while true ; do
    case "$1" in
      --${var})
      declare ${var}=$2
      ;;
    --)
      break
      ;;
    esac
    shift 2
  done
done

因此,如果您尝试使用test_script --boo 3 --bib hello --bob lkkfrfrfr

echo $bib $bob $boo

应提供

hello lkkfrfrfr 3