답변:
이 작업을 수행하는 또 다른 방법은 선언하려는 매개 변수의 이름을 지정한 다음 그렇게하는 것입니다.
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
위의 예에서 명시 적으로 선언 된 환경 변수는 명령 행 인수보다 선호되지만 명령 행 인수는 환경 변수가 비어 있거나 설정되지 않은 경우에 사용됩니다. 8 번째 위치 변수 와 환경 변수 $eight
가 모두 비어 있거나 설정되어 있지 않으면 some_default 기본값 이에 지정됩니다 $eight
. 두 경우 모두 비어있는 값이 허용 가능한 경우 or 문 :
에서 제거 할 수 있습니다 .:-
:=
변수 $eight
는 다음과 같이 설정할 수도 있습니다.
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
... 그리고 이전 줄은 완전히 생략되었지만 그런 식으로 변수를 선언하면 지속적인 가치가 생겨서 두 가지 명령으로 수행했습니다. 어느 쪽이든 $eight
해당 복합 매개 변수 확장의 최종 값으로 설정됩니다.
getopts
강력한 스크립트의 경우 명령 옵션 을 처리하는 가장 좋은 방법 입니다. 반면에 위치 매개 변수는 거의 항상 스크립트에서 피연산자 를 강력하게 처리하는 가장 간단한 수단입니다 .
예를 들면 다음과 같습니다.
touch file$(seq -ws\ file 100)
./foo *
$eight = file008
거기에는 8 번째 피연산자 만 표시되지만 그중 101 개는 내 테스트 디렉토리에서 가져 왔습니다.
스크립트를 변경할 수 있다고 가정하면 필수 매개 변수 (인수) 대신 선택적 매개 변수 (옵션)를 사용해야합니다.
처음 7 개의 7 개 매개 변수를 각각 옵션으로 사용하고 기본값을 빈 문자열로 설정하면 다음과 같이 할 수 있습니다.
./foo bar
당신이 사용하는 경우 POSIX 호환 쉘을 당신이 사용할 수있는 getopts
유틸리티 또는 프로그램을 getopt
. bash
-대부분의 조개처럼-제안getopts
내장 기능을 제공합니다. 어느 쪽이든 자신의 명령 줄 파서를 굴리는 것보다 쉽습니다.
마지막 X 비 옵션 인수가 마지막 Y 인수 및 XY 옵션 인수의 값과 같은 것을 구현하지 않는 한 7 개의 (현재 비어있는) 문자열 앞에 옵션 문자열을 제공해야합니다. 그러나 이것은 일반적인 관행이 아니며 일반적으로 옵션은 항상 옵션이며 인수는 인수이며 옵션 "삽입"의 순서는 자유입니다.
+1
에 대한 getopt(s)
. 위치 매개 변수는 슬픈 시간이므로 피해야합니다.