printf無効なオプション - 'd'

printf無効なオプション - 'd'

printf '%s\n' "$@"関数を使用して呼び出しています。

pfm "-d DIR" "--directory=DIR"

次のエラーが発生します。

bash: invalid option -- 'd'
bash: invalid option -- ' '
bash: invalid option -- 'D'
bash: invalid option -- 'I'
bash: invalid option -- 'R'
bash: unrecognized option '--directory=DIR'

関連コードです

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

  opts=$(getopt -o "$shortopts" -l "$longopts"  \
        -n "$(basename $0)" -- "$@")
  if [ $? -eq 0 ]; then
    eval "set -- ${opts}"
    while [ $# -gt 0 ]; do
      case "$1" in
        -V|version)
          printf "V01 Jul 2021 Wk27"
          printf ""
          ;;
        -h|-\?|--help)
          help=1
          printf "Prints two text strings on two lines.\n"
          printf "\$@ TEXT  Sentences to print en new lines.\n"
          shift
      local -r f=0
      break
      ;;
          # ......................................................
        -w|--warning)
      case "$2" in
             "1") local -r warn="first";  shift 2  ;;
             *)   local -r warn="all";    shift 2  ;;
          esac
      local -r f=1
      ;;
        --)
          shift;  break  ;;
      esac
    done
  else
    shorthelp=1 # getopt returned (and reported) an error.
  fi

  red=$(tput setaf 9)  
  rgl=$(tput sgr0)

  local f=1
  if (( f == 1 )); then

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

    # print multi-line warnings
    if [[ -n warn && "$warn" == "first" ]]; then
      printf '%s\n' ${red}"$1"${rgl}  # first line red
      printf '%s\n' "${@:2}"          # remaining, uncoloured
    elif [[ -n warn && "$warn" == "all" ]]; then
      printf '%s\n' ${red}"$@"${rgl}  # all lines red
    fi

  fi
  return 0
}

alias pfm=printfm 

ベストアンサー1

ここに関連する問題はありませんprintf

関数printfmは引数を受け入れ、独自のオプション解析を実行します。必要なオプションは-V、、、、、およびです(文にスペルエラーがあり、-h前の-?、が欠け-wて認識されますが実行できません)。 2つの引数を使用して呼び出すと、ユーティリティは文字列に不明なオプションが含まれていると文句を言います。--warning--help--version--versioncase-d DIR--directory=DIRgetopt

オプションではなく引数を渡す一般的な方法は次のとおりです。バラより--オプションと同様に、ユーティリティや関数では、実際のオプションとオプションではなく引数を区別するために(「二重ダッシュ」)が使用されます。

printfm -- "-d DIR" "--directory=DIR"

これはコードで正しく処理され、printfmその時点でオプションの解析が停止さ--れ、ダッシュで始まっても、2つの文字列をオプションではなく引数として受け取ることができます。

関連:

おすすめ記事