-h
속성이 쉘 스크립트로 전달 되었는지 어떻게 확인 합니까? 사용자가 전화를 걸 때 도움말 메시지를 표시하고 싶습니다 myscript.sh -h
.
답변
bash의 예는 다음과 같습니다.
usage="$(basename "$0") [-h] [-s n] -- program to calculate the answer to life, the universe and everything
where:
-h show this help text
-s set the seed value (default: 42)"
seed=42
while getopts ':hs:' option; do
case "$option" in
h) echo "$usage"
exit
;;
s) seed=$OPTARG
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done
shift $((OPTIND - 1))
함수 안에서 이것을 사용하려면 :
"$FUNCNAME"
대신에 사용$(basename "$0")
local OPTIND OPTARG
전화하기 전에 추가getopts
답변
쉘 스크립트에 대한 첫 번째 인수는 변수로 사용할 수 $1
있으므로 가장 간단한 구현은 다음과 같습니다.
if [ "$1" == "-h" ]; then
echo "Usage: `basename $0` [somestuff]"
exit 0
fi
그러나 아누 바바가 말한 것.
답변
여기 내가 VNC 서버를 시작하는 데 사용하는 부분입니다
#!/bin/bash
start() {
echo "Starting vnc server with $resolution on Display $display"
#your execute command here mine is below
#vncserver :$display -geometry $resolution
}
stop() {
echo "Killing vncserver on display $display"
#vncserver -kill :$display
}
#########################
# The command line help #
#########################
display_help() {
echo "Usage: $0 [option...] {start|stop|restart}" >&2
echo
echo " -r, --resolution run with the given resolution WxH"
echo " -d, --display Set on which display to host on "
echo
# echo some stuff here for the -a or --add-options
exit 1
}
################################
# Check if parameters options #
# are given on the commandline #
################################
while :
do
case "$1" in
-r | --resolution)
if [ $# -ne 0 ]; then
resolution="$2" # You may want to check validity of $2
fi
shift 2
;;
-h | --help)
display_help # Call your function
exit 0
;;
-d | --display)
display="$2"
shift 2
;;
-a | --add-options)
# do something here call function
# and write it in your help function display_help()
shift 2
;;
--) # End of all options
shift
break
;;
-*)
echo "Error: Unknown option: $1" >&2
## or call function display_help
exit 1
;;
*) # No more options
break
;;
esac
done
######################
# Check if parameter #
# is set too execute #
######################
case "$1" in
start)
start # calling function start()
;;
stop)
stop # calling function stop()
;;
restart)
stop # calling function stop()
start # calling function start()
;;
*)
# echo "Usage: $0 {start|stop|restart}" >&2
display_help
exit 1
;;
esac
별도의 경우에 시작 중지 다시 시작을 배치 한 것이 조금 이상하지만 작동해야합니다.
답변
빠른 단일 옵션 솔루션을 사용하려면 if
확인할 단일 옵션 만 있고 항상 첫 번째 옵션 ( $1
) 인 경우 가장 간단한 해결책은 if
테스트 ( [
)입니다. 예를 들면 다음과 같습니다.
if [ "$1" == "-h" ] ; then
echo "Usage: `basename $0` [-h]"
exit 0
fi
posix 호환성 =
은 다음과 같이 작동 ==
합니다.
왜 인용 $1
?
$1
따옴표로 묶어야 하는 이유는 $1
셸 이 없으면 쉘이 실행을 시도 if [ == "-h" ]
하고 실패 하려고하기 때문입니다 ==
.
$ [ == "-h" ]
bash: [: ==: unary operator expected
더 복잡한 용도 getopt
또는getopts
으로 제안 하여 다른 인수를 받아들이는 당신의 옵션을 하나의 간단한 옵션보다 더 많은, 또는 필요한 경우, 당신은 확실히 사용하는 여분의 복잡성 가야한다 getopts
.
빠른 참조로 60 초 getopts tutorial을 좋아 합니다. †
getopt
내장 쉘 대신 프로그램 을 고려할 수도 있습니다 getopts
. 긴 옵션과 옵션 이 아닌 인수 뒤에 옵션을 사용할 수 있습니다 (예 : foo a b c --verbose
그냥 foo -v a b c
). 이 Stackoverflow 답변 은 GNU 사용법을 설명합니다 getopt
.
† jeffbyrnes 는 원본 링크가 죽었지 만 고맙게도 기계 가 그것을 보관 하는 방식에 대해 언급 했습니다.
답변
bash의 getopt 기능을 사용하는 것이 좋습니다. 자세한 도움말은이 Q & A를 참조하십시오. bash 쉘 스크립트에서 getopts를 사용하여 길고 짧은 명령 행 옵션 가져 오기
답변
나는 당신이 이것을 사용할 수 있다고 생각합니다 …
case $1 in
-h) echo $usage ;;
h) echo $usage ;;
help) echo $usage ;;
esac