加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash getopts:读取可选标志的$OPTARG?

发布时间:2020-12-15 18:51:39 所属栏目:安全 来源:网络整理
导读:我希望能够在我的脚本中接受强制和可选标志.这是我到目前为止. #!bin/bashwhile getopts ":a:b:cdef" opt; do case $opt in a ) APPLE="$OPTARG";; b ) BANANA="$OPTARG";; c ) CHERRY="$OPTARG";; d ) DFRUIT="$OPTARG";; e ) EGGPLANT="$OPTARG";; f ) FIG
我希望能够在我的脚本中接受强制和可选标志.这是我到目前为止.
#!bin/bash

while getopts ":a:b:cdef" opt; do
      case $opt in
        a ) APPLE="$OPTARG";;
        b ) BANANA="$OPTARG";;
        c ) CHERRY="$OPTARG";;
        d ) DFRUIT="$OPTARG";;
        e ) EGGPLANT="$OPTARG";;
        f ) FIG="$OPTARG";;
        ?) echo "Invalid option: -"$OPTARG"" >&2
            exit 1;;
        : ) echo "Option -"$OPTARG" requires an argument." >&2
            exit 1;;
      esac
    done
echo "Apple is "$APPLE""
echo "Banana is "$BANANA""
echo "Cherry is "$CHERRY""
echo "Dfruit is "$DFRUIT""
echo "Eggplant is "$EGGPLANT""
echo "Fig is "$FIG""

但是,输出如下:

bash script.sh -a apple -b banana -c cherry -d dfruit -e eggplant -f fig

…输出:

Apple is apple
Banana is banana
Cherry is 
Dfruit is 
Eggplant is 
Fig is

你可以看到,可选标志并没有使用$OPTARG牵引参数,因为它与所需的标志一样.有没有办法读取$OPTARG在可选标志,而不会摆脱整洁的“:)”错误处理?

=======================================

编辑:我按照吉尔伯特的建议,清理下来.这是我做的:

#!/bin/bash

  if [[ "$1" =~ ^((-{1,2})([Hh]$|[Hh][Ee][Ll][Pp])|)$]]; then
    print_usage; exit 1
  else
    while [[ $# -gt 0 ]]; do
      opt="$1"
      shift;
      current_arg="$1"
      if [[ "$current_arg" =~ ^-{1,2}.* ]]; then
        echo "WARNING: You may have left an argument blank. Double check your command." 
      fi
      case "$opt" in
        "-a"|"--apple"      ) APPLE="$1"; shift;;
        "-b"|"--banana"     ) BANANA="$1"; shift;;
        "-c"|"--cherry"     ) CHERRY="$1"; shift;;
        "-d"|"--dfruit"     ) DFRUIT="$1"; shift;;
        "-e"|"--eggplant"   ) EGGPLANT="$1"; shift;;
        "-f"|"--fig"        ) FIG="$1"; shift;;
        *                   ) echo "ERROR: Invalid option: ""$opt""" >&2
                              exit 1;;
      esac
    done
  fi

  if [[ "$APPLE" == "" || "$BANANA" == "" ]]; then
    echo "ERROR: Options -a and -b require arguments." >&2
    exit 1
  fi

非常感谢大家.到目前为止这完美无瑕.

大多数shell getopts一直在烦恼我很长时间,包括缺乏可选参数的支持.

但是,如果您愿意使用“–posix”样式参数,请访问bash argument case for args in $@

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读