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
--
version
case
-d DIR
--directory=DIR
getopt
オプションではなく引数を渡す一般的な方法は次のとおりです。バラより--
オプションと同様に、ユーティリティや関数では、実際のオプションとオプションではなく引数を区別するために(「二重ダッシュ」)が使用されます。
printfm -- "-d DIR" "--directory=DIR"
これはコードで正しく処理され、printfm
その時点でオプションの解析が停止さ--
れ、ダッシュで始まっても、2つの文字列をオプションではなく引数として受け取ることができます。
関連: