
저는 bash 스크립트를 작업 중이고 "옵션"을 구현해야 합니다. Bash로 어떻게 할 수 있나요?
내 목표는 다음과 같은 방법으로 스크립트를 실행하는 것입니다.
/myscript.sh -d "/var/log/" -c "test"
내가 시도한 것 :
while shift; do
case $1 in
-d)
shift&&DIR="$1"||die
;;
-c)
shift&&COMMAND="$1"||die
;;
esac
done
echo "$DIR"
echo "$COMMAND"
답변1
@choroba의 답변을 확장하기 위해 사용 방법에 대한 예는 다음과 같습니다 getopts
.
# parse the flag options (and their arguments)
while getopts c:d: OPT; do
case "$OPT" in
d)
DIR="$OPTARG" ;;
c)
COMMAND="$OPTARG" ;;
[?])
# got invalid option
echo "Usage: $0 [-d directory] [-c command]" >&2
exit 1 ;;
esac
done
# get rid of the just-finished flag arguments
shift $(($OPTIND-1))
플래그 인수를 이동한 후에도 "일반" 인수는 그대로 유지됩니다. 따라서 그 시점에서 당신은 그것들을 처리할 수 있거나(예: ... for arg in "$@"; do ...
) 스크립트가 그것들을 받아들이지 않는다면 당신이 어떤 것( if [ $# -gt 0 ]; then echo "Usage ...
)을 얻으면 그냥 불평할 수 있습니다.
답변2
당신의 실수는 루프의 맨 위에서 이동하여 검사하기 전에 첫 번째 인수를 던지는 것입니다. 내 생각엔 아마도 다음과 같은 의미일 것입니다.
#!/bin/bash
while (( "$#" )); do
case $1 in
-d)
shift&&DIR="$1"||die
;;
-c)
shift&&COMMAND="$1"||die
;;
esac
shift
done
echo "$DIR"
echo "$COMMAND"
답변3
초로바가 이미 말했듯이,getopts더 나은 접근 방식입니다.
귀하의 경우에는 다음을 사용할 수 있습니다.
getopts c:d: d || die
DIR=$OPTARG
getopts c:d: c || die
COMMAND=$OPTARG
while 루프를 사용하여 수행하려는 작업을 달성합니다.
문자열은 c:d:
가능한 스위치를 지정합니다. 콜론은 스위치에 인수가 필요함을 의미합니다.
접근 방식의 문제점은 shift
첫 번째 인수를 분석하기 전에 호출하여 프로세스에서 이를 삭제한다는 것입니다.
이 문제를 해결하려면 while 루프를 다음과 같이 변경하세요.
while true; do
case $1 in
-d)
shift&&DIR="$1"||die
;;
-c)
shift&&COMMAND="$1"||die
;;
esac
shift || break
done
답변4
일반적인 접근 방식은 getopts
.