bash 스크립트의 매개 변수가 문자열과 일치하는지 확인하십시오. != “-disCopperBld”

bash 스크립트에 전달 된 매개 변수가 문자열과 일치하는지 확인하려는 스크립트를 작성하려고합니다. 내가 지금 설정하는 방법은

if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]

그러나 많은 매개 변수가있을 수 있으므로 더 좋은 방법이 있는지 궁금합니다.

감사

편집 :이 코드 덩어리를 시도하고 옵션 -disableVenusBld와 함께 스크립트를 호출했지만 여전히 “빌드 시작”을 인쇄합니다. 내가 뭔가 잘못하고 있습니까? 미리 감사드립니다!

while [ $# -ne 0 ]
do
    arg="$1"
    case "$arg" in
        -disableVenusBld)
            disableVenusBld=true
            ;;
        -disableCopperBld)
            disableCopperBld=true
            ;;
        -disableTest)
            disableTest=true
            ;;
        -disableUpdate)
            disableUpdate=true
            ;;
        *)
            nothing="true"
            ;;
    esac
    shift
done

if [ "$disableVenusBld" != true ]; then
    echo "Starting build"
fi



답변

쉘 스크립트에서 옵션 처리를하고있는 것 같습니다. 이에 대한 관용구는 다음과 같습니다.

#! /bin/sh -

# idiomatic parameter and option handling in sh
while test $# -gt 0
do
    case "$1" in
        --opt1) echo "option 1"
            ;;
        --opt2) echo "option 2"
            ;;
        --*) echo "bad option $1"
            ;;
        *) echo "argument $1"
            ;;
    esac
    shift
done

exit 0

(들여 쓰기에 대한 몇 가지 규칙이 ;;있으며 일부 쉘에서는 (--opt1)괄호 일치를 돕기 위해 옵션을 제공 할 수 있지만 이것이 기본 아이디어입니다)


답변

이것은 나를 위해 일했습니다. 그것은 당신이 요구 한 것을 정확하게하고 더 이상 아무것도하지 않습니다 (옵션 처리 없음). 그것이 좋든 나쁘 든 포스터의 운동입니다 🙂

if [[ "$*" == *YOURSTRING* ]]
then
    echo "YES"
else
    echo "NO"
fi

이것은 특수 처리 $*
및 수퍼 테스트 [[]]괄호를 활용합니다.


답변

전체 매개 변수 공간을 검색 (와일드 카드 사용)하는 방법은 무엇입니까?

if [[ $@ == *'-disableVenusBld'* ]]
then

편집 : 좋아, 좋아, 그것은 대중적인 대답이 아니었다. 이건 어때, 완벽 해! :

if [[ "${@#-disableVenusBld}" = "$@" ]]
then
    echo "Did not find disableVenusBld"
else
    echo "Found disableVenusBld"
fi

Edit2 : 좋아, 아마 이것은 완벽하지 않을 수도 있습니다 …- param이 목록의 시작 부분에 있고 -paramXZY 또는 -paramABC와 일치하는 경우에만 작동한다고 생각하십시오. 나는 여전히 bash 문자열 조작으로 원래의 문제를 매우 잘 해결할 수 있다고 생각하지만 여기서는 그렇게 크지 않았습니다 …


답변

disCopperBld=
for x; do
  if [ "$x" = "-disCopperBld" ]; then disCopperBld=1; break; fi
done
if [ -n "$disCopperBld" ]; then
  ...
fi

에서 시작하는 매개 변수 만 테스트해야하는 경우 $3함수에서 검색하십시오.

## Usage: search_trailing_parameters NEEDLE NUM "$@"
## Search NEEDLE amongst the parameters, skipping $1 through ${$NUM}.
search_trailing_parameters () {
  needle=$1
  shift $(($2 + 2))
  for x; do
    if [ "$x" = "$needle" ]; then return 0; fi
  done
  return 1
}
if search_trailing_parameters -disCopperBld 2 "$@"; then
  ...
fi

그러나 왜 당신이 처음에 이것을하려고하는지 궁금합니다. 일반적인 요구는 아닙니다. 일반적으로 이전 질문에 대한 Dennis의 답변과 같이 옵션을 순서대로 처리 합니다 .


답변