if 문의 elif 조건

if 문의 elif 조건

이 변수가 있습니다

start=$1;
end=$2;
sn=${#start}
en=${#end}

만약에:

if ( [ $# -eq 2 ] )
then
elif ( [ $sn -ne 3 ] && [ -n "$(printf '%s\n' "$start" | sed 's/[0-9]//g') " ] );
then     
    echo "Incorrect format"
    exit 1
elif ( [ $en -ne 3 ] && [ -n "$(printf '%s\n' "$end" | sed 's/[0-9]//g') " ] );
then
    echo "Incorrect format"
    exit 1
else
    echo "Correct format"
    exit 1
fi

나는 첫 번째 elif에 놀랐습니다. 사용자가 제공한 매개변수를 확인하고 싶었는데 매개변수는 3자리로만 구성될 수 있습니다.

답변1

if ( [ $# -eq 2 ] )
then
elif

Jeff의 답변에서 알 수 있듯이 첫 번째 if조건은 명령 부분이 누락되었다는 것입니다. Bash와 Dash가 제공하는 오류 메시지는 약간 모호합니다. 파서에서 직접 나온 것처럼 보이며 거기에 더 사용자 친화적인 메시지를 추가하지 않았습니다.

브랜치 내부에서 아무 것도 하지 않으려면 거기에 몇 가지 명령을 추가해야 합니다. 나는 true이것이 아무것도 하지 않는 것을 제안한다.

이 문제를 해결하고,shellcheck.net더 많은 관찰이 제공됩니다:

if ( [ $# -eq 2 ] )
   ^-- SC2233: Remove superfluous (..) around condition.

대괄호는 여기서는 필요하지 않은 하위 쉘을 시작합니다(Bash에서 하위 프로세스를 분기하는 것과 같은 추가 오버헤드가 포함됨).

... [ -n "$(printf '%s\n' "$start" | sed 's/[0-9]//g') " ] 
>>                                                    ^-- 
             SC2157: Argument to -n is always true due to literal strings.

명령 대체를 인용하셨습니다. 좋습니다! 하지만 마지막에는 추가 공간이 있습니다. 명령 대체 결과가 무엇이든 -n공백이 있기 때문에 인수는 결코 비어 있지 않습니다.

(또한 sums 를 인용하는 것을 지적합니다 $sn. 이는 주의해야 할 사항이지만 $en숫자가 포함되지 않을 것이라는 점을 알고 있다면 실제로는 필요하지 않습니다.)IFS


즉, 조건이 여전히 적절한지 잘 모르겠습니다. 당신은 말한다:

사용자가 제공한 매개변수를 확인하고 싶은데, 매개변수는 3자리로만 구성될 수 있습니다.

sn다만, 아래 테스트는 3개가 없는 경우만 캡쳐한 것이므로,게다가숫자 외에 다른 문자도 있습니다. 즉 , abcand 는 통과 1234하고 는 거부합니다 abcd. 당신은 하나를 원한다또는조건, ||, 대신그리고.

if [ $sn -ne 3 ] && [ -n "$(printf '%s\n' "$start" | sed 's/[0-9]//g')" ]; then
    echo reject

case또는 다음과 같이 패턴 일치를 사용할 수도 있습니다 .

case "$start" in
    [0-9][0-9][0-9]) echo "'$start' is ok";;
    *) echo "'$start' is invalid"; exit 1;;
esac

답변2

첫 번째 사례의 "실제" 사례에서는 아무런 설명도 하지 않습니다 if.

if ( [ $# -eq 2 ] )

then
  ##  <-- HERE
elif  ...

bash 매뉴얼을 인용하면 다음과 같습니다.

if 명령의 구문은 다음과 같습니다.

if test-commands; then
  consequent-commands;
[elif more-test-commands; then
  more-consequents;]
[else alternate-consequents;]
fi

중요한 점은 입니다 consequent-commands.

관련 정보