그래서 저는 매개변수가 있는 옵션과 매개변수가 없는 옵션을 혼합하는 스크립트를 작성하고 있습니다. 연구를 통해 나는 getopts가 이를 수행하는 가장 좋은 방법이라는 것을 알았으며 지금까지는 파악하고 설정하기가 쉽습니다. 내가 겪고 있는 문제는 옵션이나 인수를 제공하지 않고 별도의 명령 집합을 실행하도록 설정하는 방법을 알아내는 것입니다. 이것이 내가 가진 것입니다:
while getopts ":n:h" opt; do
case $opt in
n)
CODEBLOCK >&2
;;
h)
echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
exit 1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
인수를 잡기 위해 코드 상단에 다음과 같은 것을 추가하려고 시도했지만 옵션과 인수가 제공되어도 동일한 코드가 실행됩니다(여기서는 구문에 문제가 있을 수 있습니다).
[[ -n "$1" ]] || {
CODEBLOCK1
}
while getopts ":n:h" opt; do
case $opt in
n)
CODEBLOCK2 >&2
;;
h)
echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
exit 1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
getopts에 대한 매뉴얼 페이지는 거의 없으며, 검색에서 getopts의 다양한 기능은 물론이고 이에 대한 통찰력을 제공하는 예제도 상대적으로 거의 발견하지 못했습니다.
답변1
$1
비어 있으면 다음 중 하나를 사용하여 명령을 실행할 수 있습니다.
[[ ! $1 ]] && { COMMANDS; }
[[ $1 ]] || { COMMANDS; }
[[ -z $1 ]] && { COMMANDS; }
[[ -n $1 ]] || { COMMANDS; }
또한 이 특정 예에서는 단어 분리가 수행되지 않으므로 확장을 인용할 필요가 없습니다.
하지만 매개변수가 있는지 확인하고 싶다면 를 사용하는 것이 좋습니다 (( $# ))
.
귀하의 의도를 이해한다면 귀하의 코드는 다음과 같이 작성될 수 있습니다 getopts
.
#!/bin/bash
(( $# )) || printf '%s\n' 'No arguments'
while getopts ':n:h' opt; do
case "$opt" in
n)
[[ $OPTARG ]] && printf '%s\n' "Commands were run, option $OPTARG, so let's do what that says."
[[ ! $OPTARG ]] && printf '%s\n' "Commands were run, there was no option, so let's run some stuff."
;;
h) printf '%s\n' 'Help printed' ;;
*) printf '%s\n' "I don't know what that argument is!" ;;
esac
done