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의 답변과 같이 옵션을 순서대로 처리 합니다 .