Bash: 교대 중에 사용하는 방법; do..case $1 in

Bash: 교대 중에 사용하는 방법; do..case $1 in

저는 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.

관련 정보