Bash에서 선택적 매개변수 처리

Bash에서 선택적 매개변수 처리

새 줄에 문자열을 쓰는 다음 함수가 있습니다. 경고 옵션이 있으므로 -w사용자가 설정하면 일부 줄이 빨간색으로 변합니다. -w선택적 숫자 인수가 허용됩니다 -wNUM. NUM제공되지 않으면 첫 번째 행만 빨간색으로 warn설정됩니다 .1

명령을 호출하는 데 문제가 있습니다.

printfm -w -- "First line" "second line").

local warn="1"성명 앞에 포함시켰 습니다 case.

  ("-w"|"--warning")
     local warn="1"
     case "$2" in

기능은 여기에 나열되어 있습니다.

printfm ()
{
  # Process command line options
  shortopts="hVw::"
  longopts="help,version,warning::"

  opts=$(getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@")

  if [ $? -ne 0 ]; then
    local shorthelp=1  # getopt returned (and reported) an error.
    return
  fi

  local f=0
  
  if [ $? -eq 0 ]; then
    eval "set -- ${opts}"
    while [ $# -gt 0 ]; do
      case "$1" in
        ("-V"|"--version")
          printf "%s\n" "V01 Jul 2021 Wk27"
          declare -i f=0
          shift
          break
          ;;
        ("-h"|-\?|"--help")
          printf "%s\n" "Print strings."
          declare -i f=0
          shift
          break
          ;;
        # ------------------------------------
        ("-w"|"--warning")
          case "$2" in
            (+([[:digit:]])) 
              local -r warn="$2"
              shift 2
              ;;
            (*) 
              local -r warn="1"
              shift 2
              ;;
            esac
            declare -i local f=1
            ;;
          # ----------------------------------------
          (--)
            declare -i local f=1
            shift
            break
            ;;
        esac
      done
    fi

    red=$(tput setaf 9)  
    rgl=$(tput sgr0)
  
    # Print normal text or warnings
  
    if [[ -v $f ]] && (( f != 0 )); then

      # print normal multi-line text
      [[ ! -v $warn ]] && printf '%s\n' "$@"

      # print multi-line warnings

      rge='^[0-9]+$'
      if [[ -v $warn && "$warn" == "1" ]]; then
        printf '%s\n' ${red}"$1"${rgl}  # first line red
        printf '%s\n' "${@:2}"          # remaining, uncoloured
      elif [[ -v $warn && "$warn" =~ $rge ]]; then
        printf '%s\n' ${red}"$@"${rgl}  # all lines red
      fi

    fi
    return 0
  }

관련 정보