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

问题描述 投票:1回答:1

我有一个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

这一切都很好,到目前为止,这么好......

但是现在我想将它扩展到许多选项的列表,所以不是写出一个长的case语句,能够以某种方式循环选项列表并自动将选项传递给变量真的很好,沿着这些方向

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”...我看不到明显的方法,但是我敢肯定有一个。

bash command-line getopt getopts
1个回答
1
投票

我意识到我仍然将case命令放在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
© www.soinside.com 2019 - 2024. All rights reserved.