Bash 사용자의 예 / 아니요 응답 처리


11

이것은 매우 어리석은 일입니다. Bash 스크립트 내에서 예 / 아니요, True / False 응답을 수락하고 싶습니다.

test.sh

#!/bin/bash

ARGUMENT=$1

echo User passed in $ARGUMENT

OPTARG=${ARGUMENT:0:1}

if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then
    echo Decline
elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then
    echo Accept
else
    echo Invalid argument
fi

다음은 몇 가지 샘플 결과입니다.

./test.sh 0

User passed in 0
Decline

./test.sh 1

User passed in 1
Accept

./test.sh 2

User passed in 2
Invalid argument

./test.sh 아니오

User passed in No
Decline

이제 스 텀퍼. [[ "${OPTARG^^}" == "N" ]]문자열에 대해 왜 true를 반환 합니까 ?

./test.sh 예

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

이것을 인용하면 어떻게 되나요? OPTARG = "$ {ARGUMENT : 0 : 1}"
mikeserv

1
신경 쓰지 마. 골디 락이 맞습니다.
mikeserv

답변:


10

이:

if [[ "$OPTARG" -eq 0 ]] 

숫자가 아닌 한 모든 문자열과 일치합니다. 사용하다:

if [[ "$OPTARG" == "0" ]] 

대신에.


8

코드의 문제는 goldilocks 에 의해 잘 설명 되었지만 코드가 불필요하게 길다는 말에는 저항 할 수 없습니다. 당신은 그것을 많이 단순화 할 수 있습니다.

다음은 원하는 코드와 같습니다.

echo User passed in $1
if [[ "$1" == [nN0]* ]]; then      # First argument starts with either n, N, or 0
    echo Decline
elif [[ "$1" == [yY1]* ]]; then    # First argument starts with either y, Y, or 1
    echo Accept
else
    echo Invalid argument
fi

또한 참조 할 수 있습니다 조건부를 구축수동 .


고맙습니다, devnull. 나는 미래의 스크립트 에서이 트릭을 확실히 사용할 것입니다! 나는 당신의 대답을 받아 들여야하는지에 대해 찢어졌지만, goldilocks의 대답의 구별이 다른 사람들에게 도움이 될 수 있다고 생각합니다.
i_grok

@i_grok 나는 내 대답에서 goldilocks의 대답이 문제를 지적한다고 언급했습니다. 나는 좀 더 읽기 쉬운 대안을 제시했다 . 문제를 해결하기위한 여러 가지 접근 방식이 나타나는 것이 좋습니다. 어떤 대답이 받아 들여 지는가에 관해서는 비교적 사소한 일입니다.
devnull

6

또한 사용할 수 있습니다 case

read -p 'Do you want to Continue (yes/no?): ' 
case $REPLY in
       [yY]|[yY][eE][sS]) echo Accept             ;;
           [nN]|[nN][oO]) echo Decline            ;;
                       *) echo "Invalid argument" ;;
esac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.