Bash 스크립트를 작성했지만 독학으로 bash를 배운 초보이기 때문에 주어진 인수를 더 효율적으로 확인할 수 있는지 묻고 싶었습니다. 나도 이 문제를 구글링해서 여기에서 주제를 확인했지만, 지금까지 본 예제는 너무 복잡하다. Python3에는 훨씬 간단한 방법이 있지만 bash에서는 좀 더 복잡할 것 같습니다.
#!/bin/bash
ERR_MSG="You did not give the argument required"
if [[ ${1?$ERR_MSG} == "a" ]]; then
echo "ABC"
elif [[ ${1?$ERR_MSG} == "b" ]]; then
echo "123"
elif [[ ${1?$ERR_MSG} == "c" ]]; then
echo ".*?"
else
echo "You did not provide the argument correctly"
exit 1
fi
답변1
a
, b
또는 다음과 같은 단일 매개변수만 허용하는 스크립트입니다 c
.
#!/bin/bash
if [[ $# -ne 1 ]]; then
echo 'Too many/few arguments, expecting one' >&2
exit 1
fi
case $1 in
a|b|c) # Ok
;;
*)
# The wrong first argument.
echo 'Expected "a", "b", or "c"' >&2
exit 1
esac
# rest of code here
올바른 옵션 구문 분석을 원하고 인수가 있는 옵션뿐만 아니라 인수가 없는 옵션으로 -a
, -b
또는 을 허용하려는 경우 .-c
-d
#!/bin/bash
# Default values:
opt_a=false
opt_b=false
opt_c=false
opt_d='no value given'
# It's the : after d that signifies that it takes an option argument.
while getopts abcd: opt; do
case $opt in
a) opt_a=true ;;
b) opt_b=true ;;
c) opt_c=true ;;
d) opt_d=$OPTARG ;;
*) echo 'error in command line parsing' >&2
exit 1
esac
done
shift "$(( OPTIND - 1 ))"
# Command line parsing is done now.
# The code below acts on the used options.
# This code would typically do sanity checks,
# like emitting errors for incompatible options,
# missing options etc.
"$opt_a" && echo 'Got the -a option'
"$opt_b" && echo 'Got the -b option'
"$opt_c" && echo 'Got the -c option'
printf 'Option -d: %s\n' "$opt_d"
if [[ $# -gt 0 ]]; then
echo 'Further operands:'
printf '\t%s\n' "$@"
fi
# The rest of your code goes here.
시험:
$ ./script -d 'hello bumblebee' -ac
Got the -a option
Got the -c option
Option -d: hello bumblebee
$ ./script
Option -d: no value given
$ ./script -q
script: illegal option -- q
error in command line parsing
$ ./script -adboo 1 2 3
Got the -a option
Option -d: boo
Further operands:
1
2
3
옵션 구문 분석은 옵션이 아닌 첫 번째 인수에서 종료됩니다 --
. -d
매개변수는 필수 이므로 -a
다음 예에서는 해당 매개변수로 처리됩니다.
$ ./script -d -a -- -c -b
Option -d: -a
Further operands:
-c
-b
답변2
이 코드를 파일에 복사하세요. (잊지 마세요 chmod +x
) 이것이 당신이 필요로 하는 일을 할 것입니다.
#!/bin/bash
VERSION="0.0.1"
ACCEPTED_SERVER="server"
ACCEPTED_USER="user"
usage()
{
echo " $(basename $0) [-v] [-h] -u user -s server"
exit
}
version()
{
echo "Current version: $VERSION"
}
get_opts()
{
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-u|--user)
shift
USER="$1"
shift
;;
-s|--server)
shift
SERVER="$1"
shift
;;
-h|--help)
usage
exit
;;
-v|--version)
version
exit
;;
esac
done
}
# echo " arguments: $#"
get_opts $*
if [ $# -gt 4 ] || [ $# -lt 1 ]; then
usage
fi
echo "$SERVER -- $ACCEPTED_SERVER"
if ! [ "$SERVER" = "$ACCEPTED_SERVER" ]; then
echo "Wrong server: $SERVER"
echo "Try with user: $ACCEPTED_SERVER"
usage
else
echo "Correct server: $SERVER"
fi
if ! [ "$USER" = "$ACCEPTED_USER" ]; then
echo "Wrong user: $USER"
echo "Try with user: $ACCEPTED_USER"
usage
else
echo "Correct user: $USER"
fi
echo "Correct! - Server: $SERVER - User: $USER"
그런 다음 기능 사용, 버전 등을 추가할 수 있습니다.
usage()
{
echo "[-v] [-h] [-u user] [-s server] task"
}