매개변수를 기반으로 분기하려는 스크립트가 있습니다.
기본적으로 이 매개변수는 부울 값과 같습니다. 그러나 나는 사용자가 쉘 실행 명령에 쓰레기를 입력하고 이를 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
위의 예에서는 --remove
arg3에서는 작동하지만 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
. --remove
Getopt에는 또한 옵션(선택 사항)에 매개 변수 등이 포함되기를 원할 때 몇 가지 추가 옵션이 있으며 사용자가 스크립트가 인식하지 못하는 옵션을 제공할 때 무료 기본 사용법 출력을 허용합니다. GNU getopt에는 데비안(및 그 파생물)의 모든 가능성을 보여주는 예제가 제공됩니다./usr/share/doc/util-linux/getopt-parse.bash