>

현재 bash 쉘 스크립트를 작성 중이며 사양 중 하나는 첫 번째 인수 $1이 -e 또는 -d가 아닌 경우 오류 메시지를 인쇄해야한다는 것입니다./p>

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

그러나 첫 번째 인수에 -e 또는 -d를 사용한 경우에도이 오류 메시지가 인쇄되는 것처럼 작동하지 않는 것 같습니다. 내가 뭘 잘못하고 있으며 어떻게 고치나요?

  • 답변 # 1

    $1 인 경우   -d 입니다 첫 번째 조건은 true입니다. 만약 $1   -e 입니다 두 번째 조건은 true입니다. 다른 것이 있으면 둘 다 사실입니다. || 와 함께한 이후  (또는),if그런 다음분기는 어느 쪽이든 참인 경우에 사용됩니다. 따라서다음지점은 항상 사용됩니다

    if [ "$1" != "-e" ] && [ "$1" != "-d" ] 를 사용해야합니다   $1 의 경우에만then지점을 가져 오려면   -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

관련 자료

  • 이전 bash - "${var ,,}"에서 쉼표는 무엇을 의미합니까?
  • 다음 FreeBSD 하드 드라이브 성능