스크립트의 첫 번째 인수가 -e 또는 -d인지 확인하세요.

스크립트의 첫 번째 인수가 -e 또는 -d인지 확인하세요.

나는 지금 bash 쉘 스크립트를 작성하고 있는데 사양 중 하나는 첫 번째 인수 $1이 -e 또는 -d가 아닌 경우 오류 메시지를 인쇄해야 한다는 것입니다. 이것이 제가 한 일입니다.

if [ "$1" != "-e" ] || [ "$1" != "-d" ]; then
        echo "Error: First argument must be either -e or -d"
        exit 1
fi

그러나 -e 또는 -d를 첫 번째 인수로 사용하더라도 이 오류 메시지가 계속 인쇄되기 때문에 이는 작동하지 않는 것 같습니다. 내가 뭘 잘못하고 있고 어떻게 해결할 수 있나요?

답변1

그렇다면 첫 번째 조건이 true입니다 $1. -d그렇다면 두 번째 조건이 true입니다 $1. -e둘 다 사실입니다. 당신이 합류한 이후로 ||(또는), 이것그 다음에가지만약에둘 중 하나라도 사실이라면 받아들이십시오. 그러므로,그 다음에지점은 항상 점유되어 있습니다.

if [ "$1" != "-e" ] && [ "$1" != "-d" ]당신은 사용해야 합니다그 다음에$1그렇지 않은 경우에만 분기-e 그리고아니요 -d.

답변2

case $1 in
    -d) ;; # nothing to do
    -e) ;; # nothing to do
    *)
        echo 'Error: First argument must be either -e or -d' >&2
        exit 1
esac

이는 또는 이외의 다른 경우 exit 1에 트리거됩니다 .$1-d-e

또는 사용된 옵션과 그에 대해 수행된 작업을 기반으로 플래그를 설정합니다(저는 별도로 유지하는 경향이 있습니다).분석하다명령줄 옵션은 다음에서 제공됩니다.성능그 중):

case $1 in
    -d) dflag=1 ;;
    -e) dflag=0 ;;
    *)
        echo 'Error: First argument must be either -e or -d' >&2
        exit 1
esac

# Getting here means:
#     - $1 was either -d or -e
#     - $dflag will show which one it was

if [ "$dflag" -eq 1 ]; then
    # act on -d option
else
    # act on -e option
fi

~처럼일까츄가 해명했어, 귀하의 문제는 (누락된 큰따옴표 외에) 논리(부울 연산) 중 하나입니다. 위에서는 작업을 수행하는 또 다른 방법을 보여 드렸습니다. case... esac문은 일반적으로 명령줄 옵션을 처리하는 데 사용됩니다.

관련 정보