쉘 스크립트에서 케이스 매개변수 뒤에 다른 매개변수가 오는 방법은 무엇입니까?

쉘 스크립트에서 케이스 매개변수 뒤에 다른 매개변수가 오는 방법은 무엇입니까?

사용자 입력 -s뒤에 숫자가 오기를 원합니다(예 -s 3: ). 하지만 기존 변수 옆에 다른 변수를 전달할 수 없는 것 같습니다 -s. 이것은 내 코드입니다.

echo choose
read choice 
       case $choice in 
       -a) echo you chose a 
        ;;
       -s $num) echo you chose the number $num #this is the -s number (e.g. -s 3) choice.
        ;;
      esac
exit 0

답변1

현재 수행 중인 작업을 처리하는 더 좋은 방법이 거의 확실합니다. 우선, 사용자에게 입력을 요구하는 것을 피하고 대신 프로그램을 실행할 때 명령줄에 인수를 제공하도록 해야 합니다. 단, 작동하도록 코드를 수정해야 합니다.

read -rp 'choose: ' choice 
case $choice in 
    -a) echo 'you chose a';;
    -s\ [1-4]) "echo you chose the number ${choice#"-s "}";;
esac

변수 num가 설정된 것 같지 않으므로 null로 확장되어 사례 패턴이 단순해지고 일치하지 않습니다. -s )왜냐하면 -s 4... -s )음, 동일하지 않기 때문입니다. 그래서 -s\ [1-4])뒤에 숫자( )가 붙도록 수정해야 합니다 . 그런 다음 매개변수 확장을 사용하여 를 제거합니다 -s.


내가 처리하는 방법은 getopts다음과 같은 것을 사용하는 것입니다.

#!/bin/bash

while getopts as: opt; do
    case $opt in
        a) printf '%s\n' 'You have chosen: a';;
        s) n=$OPTARG; printf '%s: %d\n' 'You have chosen s with an argument of' "$n";;
    esac
done

이를 통해 다음과 같은 매개변수를 지정하여 명령줄에서 실행할 수 있습니다.

./script.sh -s 4

관련 정보