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
, --warning
및 입니다 --help
( --version
문에 철자 오류가 있어 --
앞의 , 가 누락되어 인식되지만 실행할 수 없습니다). 두 개의 인수를 사용하여 호출하면 유틸리티는 문자열에 알 수 없는 옵션이 포함되어 있다고 불평합니다.version
case
-d DIR
--directory=DIR
getopt
옵션이 아닌 인수를 전달하는 일반적인 방법은 다음과 같습니다.바라보다--
옵션과 마찬가지로 유틸리티나 함수의 경우 실제 옵션과 옵션이 아닌 인수를 구분하기 위해 ("이중 대시")가 사용됩니다.
printfm -- "-d DIR" "--directory=DIR"
이는 코드에서 올바르게 처리될 수 있으며 printfm
해당 지점에서 옵션 구문 분석이 중지 --
되고 대시로 시작하더라도 두 개의 문자열을 옵션이 아닌 인수로 수신할 수 있습니다.
관련된: