【问题标题】:Argument parsing in bash [duplicate]bash中的参数解析[重复]
【发布时间】:2012-12-18 15:07:19
【问题描述】:

我是 bash 新手。需要对以下问题提出建议。

所以我想这样执行脚本

./myscript --bootstrap bootstrap.exe --vmmount ./vmmount --image /dev/sdb2 --target-exe installer.exe [--internal-exe] param1 param2 param3 ...

我已经完成的参数解析器:

VMMOUNT=""
BOOTSTRAP=""
IMAGE_FILE=""
TARGET_EXE=""
INTERNAL_EXE=""
while : ; do
if [ "$1" = "--vmmount" ] ; then
    [ -n "${VMMOUNT}" ] && usage
    VMMOUNT="$2"
    shift
    shift
elif [ "$1" = "--bootstrap" ] ; then
    [ -n "${BOOTSTRAP}" ] && usage
    BOOTSTRAP="$2"
    shift
    shift
elif [ "$1" = "--image" ] ; then
    [ -n "${IMAGE_FILE}" ] && usage
    IMAGE_FILE="$2"
    shift
    shift       
elif [ "$1" = "--target-exe" ] ; then
    [ -n "${TARGET_EXE}" ] && usage
    TARGET_EXE="$2"
    shift
    shift
elif [ "$1" = "--internal-exe" ] ; then
    [ -n "${INTERNAL_EXE}" ] && usage
    INTERNAL_EXE="true"
    shift
    shift
else
    break
fi
done
my_method "${IMAGE_FILE}" "${VMMOUNT}" "${BOOTSTRAP}" "${TARGET_EXE}" "${INTERNAL_EXE}" 

现在我在解析参数 param1 和 param2 等时感到困惑。如何解析它们?我可以使用$@ 将参数作为数组或任何其他有效方式吗?

【问题讨论】:

  • case代替所有那些elif语句。

标签: bash shell


【解决方案1】:
VMMOUNT=""
BOOTSTRAP=""
IMAGE_FILE=""
TARGET_EXE=""
INTERNAL_EXE=""
while : ; do
  case "$1" in 
    --vmmount)
       [ -n "${VMMOUNT}" ] && usage
       VMMOUNT="$2"
       shift 2 ;;
    --bootstrap)
       [ -n "${BOOTSTRAP}" ] && usage
       BOOTSTRAP="$2"
       shift 2 ;;
    --image)
       [ -n "${IMAGE_FILE}" ] && usage
       IMAGE_FILE="$2"
       shift 2 ;;    
    --target-exe)
       [ -n "${TARGET_EXE}" ] && usage
       TARGET_EXE="$2"
       shift 2 ;;
    --internal-exe)
       [ -n "${INTERNAL_EXE}" ] && usage
       INTERNAL_EXE="true"
       shift ;;
    *)
       break ;;
  esac
done
my_method "${IMAGE_FILE}" "${VMMOUNT}" "${BOOTSTRAP}" "${TARGET_EXE}" "${INTERNAL_EXE}" "$@"

别忘了用双引号将$@ 括起来。

【讨论】:

  • @Barmar 谢谢!它正在工作:)
【解决方案2】:

我建议您使用getopt 来解析您的命令行参数,而不是手动编码。它应该可以节省很多时间。

也显示在How do I parse command line arguments in Bash?

【讨论】:

  • 不要使用getopt,而是使用getopts
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2017-06-02
  • 2013-08-21
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多