논리 분기에 대한 몇 가지 지침을 스크립트에 전달합니다.

논리 분기에 대한 몇 가지 지침을 스크립트에 전달합니다.

매개변수를 기반으로 분기하려는 스크립트가 있습니다.
기본적으로 이 매개변수는 부울 값과 같습니다. 그러나 나는 사용자가 쉘 실행 명령에 쓰레기를 입력하고 이를 true로 해석하는 것을 원하지 않습니다.
또는 대소문자 구분 문제 등을 고려해야 하는 일부 문자열을 원하지 않습니다.
내가 원하는 최종 결과는 다음과 같습니다.

some_script.sh arg1 arg2 arg3 --remove   

하도록 하다:

PARAM1="$1"  
PARAM2="$2"  
PARAM3="$3"   
REMOVE=?--> what here   

if [ $REMOVE ]; then  
# remove some files  
fi   

답변1

문자열이 --remove스크립트의 위치 매개변수에 있는지 확인하기만 하면 됩니다. 정규식 일치 연산자를 사용하는 bash 버전 =~:

#!/bin/bash

if [[ $@ =~ --remove ]]; then
   echo "removing files"
fi

exit

POSIX 버전:

#!/bin/sh

for arg in "$@"; do
   if [ "$arg" = "--remove" ]; then
      echo "removing files"
   fi
done

exit

답변2

$1친구는 고정된 매개변수 세트가 있는 스크립트에서는 비교적 잘 작동 하지만 동적 매개변수가 있는 스크립트에서는 실제로 그렇게 잘 작동하지 않습니다. 이렇게 하려면 루프와 케이스 구성을 사용해야 합니다.

REMOVE=
for arg in "$@"; do
    case "$arg" in
        --remove)
            REMOVE=1
            ;;
        *)
            if [ ! -z "$REMOVE" ]; then
                # whatever you need to do to remove
            else
                # whatever you need to do if you do not want to remove
            fi
            ;;
    esac
done

--remove가 그 뒤의 인수에만 적용된다고 기록하면 잘 작동합니다. 이렇게 하면 제거가 일부 인수에만 적용되고 다른 인수에는 적용되지 않는 하이브리드 명령줄을 가질 수 있습니다.

script.sh arg1 arg2 --remove arg3

위의 예에서는 --removearg3에서는 작동하지만 arg1 또는 arg2에서는 작동하지 않습니다. --noremove케이스 구조에 명령줄 옵션에 대한 지원을 추가할 수도 있습니다 .

case "$arg" in
    --noremove)
        REMOVE=
        ;;
    --remove)
        # ... rest of the case remains as is from before
esac

이렇게 하면 다음과 같은 작업이 가능해집니다.

script.sh --remove arg1 --noremove arg2 --remove arg3

이 예에서 --remove옵션은 arg1 및 arg3에는 적용되지만 arg2에는 적용되지 않습니다.

--remove마지막으로 명령줄에 나타나는 위치에 관계없이 모든 인수에 적용하려는 경우 아마도 가장 쉬운 방법은 다음을 사용하는 것입니다 getopt(1).

# reorder the command line so that option arguments come first
# and non-option arguments come second, separated by "--"
PARSED=$(getopt -o '' --long remove -n scriptname.sh -- "$@")
# overwrite $@ with the contents of the newly created $PARSED
# Note the quotes; they are essential
eval set -- "$PARSED"

REMOVE=

while true; do
    case "$1" in
        --remove)
            REMOVE=1
            shift
            ;;
        --)
            shift; break;
    esac
done

for arg in "$@"; do
    if [ ! -z "$REMOVE" ]; then
        # whatever you need to do to remove
    else
        # the other thing
    fi
done

인수는 -o짧은 옵션을 취하므로 원하는 경우 해당 옵션을 대신 getopt사용할 수 있습니다 -r. --removeGetopt에는 또한 옵션(선택 사항)에 매개 변수 등이 포함되기를 원할 때 몇 가지 추가 옵션이 있으며 사용자가 스크립트가 인식하지 못하는 옵션을 제공할 때 무료 기본 사용법 출력을 허용합니다. GNU getopt에는 데비안(및 그 파생물)의 모든 가능성을 보여주는 예제가 제공됩니다./usr/share/doc/util-linux/getopt-parse.bash

관련 정보