쉘 스크립트를 작성 중인데 두 개의 필수 매개변수와 하나의 선택적 매개변수를 허용해야 합니다. 어떻게 확인하나요? 내가 본 대부분의 스크립트에서는 선택적 매개변수가 필수 매개변수보다 먼저 전달됩니다. 예를 들면 다음과 같습니다.
cut -c2 test.txt
하지만 제 생각에는 이 패턴을 스크립트에서 확인하기가 복잡하므로 세 번째 매개변수를 선택 사항으로 처리하는 것이 좋습니다.
답변1
마지막에 있는 선택적 매개변수에 동의하면 다음을 수행할 수 있습니다.
foo=$1
bar=$2
baz=${3:-default value}
그러면 처음 두 매개변수가 $foo
sum 에 저장됩니다 $bar
. 세 번째 인수가 제공되면 에 저장되고 $baz
그렇지 않으면 기본값이 가 됩니다 default value
. 세 번째 변수가 비어 있는지 확인할 수도 있습니다.
if [ -z "$3" ]; then
# Code for the case that the user didn't pass a third argument
fi
처음부터 기본값을 사용하려는 경우 가장 쉬운 방법은 $#
.
case $# in
2)
# Put commands here for when the user passes two arguments
# Could just be setting variables like above, or anything else you need
;;
3)
# Put commands here for when the user passes three arguments
;;
*)
echo "Wrong number of arguments passed"
exit 1;;
esac
오류 검사를 원할 경우 $#
두 경우 모두 열기가 제대로 작동합니다. 스크립트가 예제와 같이 getopt 스타일 매개변수를 사용하는 경우 이를 사용할 수 있습니다 cut
.이 스택 오버플로 질문더 많은 정보를 알고 싶다면
답변2
필수 매개변수와 선택적 매개변수, 옵션과 피연산자라는 두 가지 개념이 있습니다. 옵션은 로 시작하는 인수이고 -
피연산자는 로 시작하지 않는 인수이며 -
옵션에 대한 인수가 아닙니다. 옵션은 이름으로 식별되며 일반적으로 어떤 순서로든 정렬될 수 있습니다. 피연산자는 해당 위치로 식별됩니다. 그래서
someprogram -a -z -c foo bar
세 가지 옵션 -a
, -c
및 가 -z
있고 두 개의 피연산자가 있습니다. 첫 번째는 이고 foo
두 번째는 입니다 bar
.
옵션은 일반적으로 피연산자 앞에 옵니다. GNU 프로그램은 순서를 신경 쓰지 않는 경향이 있는 반면, GNU가 아닌 대부분의 프로그램은 -
인수 앞에 다른 피연산자가 있으면 피연산자로 시작하는 인수를 처리합니다. 옵션(그룹화 등)에는 다양한 변형이 있지만 --
여기서는 다루지 않겠습니다.
프로그램이 두 개의 필수 피연산자와 세 번째 선택적 피연산자를 사용하는 경우 자연스러운 방법은 필수 피연산자를 첫 번째와 두 번째로 갖고 세 번째 피연산자가 있는 경우 선택적 피연산자가 되도록 하는 것입니다.
쉘 스크립트에서 매개변수는 "$1"
, 등 입니다 "$2"
. "$3"
매개변수의 개수는 입니다 $#
. 스크립트가 옵션을 인식하지 못하는 경우 옵션 감지를 생략하고 모든 인수를 피연산자로 처리할 수 있습니다. 바라보다마이클 모로젝의 답변샘플 코드. 옵션이 인식되기를 정말로 원한다면 getopts
내장 옵션을 사용하십시오(예제는 쉘 문서를 참조하십시오).
답변3
선택적 매개변수를 처음에 넣는 한 가지 방법은 를 사용하는 것입니다 shift
.
모든 매개변수를 n 단계 왼쪽으로 이동하고 아래 매개변수를 제거합니다 $1
. 인수가 제공되지 않으면 shift
단계 수는 1입니다.
스크립트 시작 부분에서 첫 번째 인수가 선택적 인수 또는 첫 번째 필수 인수의 구조와 일치하는지 확인합니다.
이것이 필요한 경우 아무 작업도 수행하지 않습니다.
선택사항인 경우 이를 처리하고 에 전화할 수 있습니다 shift
.
여기서 유용한 점은 선택적 매개변수가 제공되었는지 여부에 관계없이 필수 매개변수(3개가 있다고 가정)가 항상 $1
to 에 있다는 것입니다.$3
뒤쪽에선택적 매개변수를 처리하는 블록입니다.