예를 들어, 10개의 매개변수가 필요한 ./foo 스크립트가 있고 8번째 매개변수만 전달하려는 경우입니다. 현재 내가 아는 유일한 방법은 다음과 같습니다.
./foo '' '' '' '' '' '' '' 'bar'
더 쉽고 더 좋은 방법이 있나요?
답변1
스크립트를 변경할 수 있다고 가정하면 필수 매개변수(매개변수) 대신 선택적 매개변수(옵션)를 사용하는 것을 고려해야 합니다.
처음 7개 매개변수를 각각 옵션으로 사용하고 기본적으로 빈 문자열을 사용하는 경우 다음을 수행할 수 있습니다.
./foo bar
당신이 사용하는 경우POSIX 호환 쉘당신이 사용할 수있는getopts
유틸리티 또는 프로그램 getopt
. bash
- 대부분의 쉘과 마찬가지로 - getopts
내장형으로 제공됩니다. 어느 쪽이든 자신만의 명령줄 파서를 실행하는 것보다 쉽습니다.
마지막 X 비옵션 매개변수와 같은 것을 구현하지 않는 한 마지막 Y 매개변수의 값과 옵션 문자열을 제공합니다. 그러나 이는 일반적인 관행이 아니며 일반적으로 옵션은 항상 옵션이고 인수는 항상 인수이며 옵션이 "삽입"되는 순서는 자유입니다.
답변2
이를 수행하는 또 다른 방법은 선언하려는 매개변수의 이름을 지정하고 다음을 수행하는 것입니다.
{ 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
비어 있거나 기본값이 설정되어 있지 않습니다.일부 기본값두 경우 모두 null 이 $eight
허용 가능한 값이면 :
or 문에서 제거할 수 있습니다.:-
:=
이 변수는 $eight
다음과 같이 설정할 수도 있습니다.
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
...이전 줄은 완전히 생략되었지만 이런 방식으로 변수를 선언하면 지속적인 값이 생성된다는 것을 증명하고 싶어서 두 개의 명령을 사용하여 수행했습니다. 어느 쪽이든 $eight
복합 매개변수 확장의 최종 값으로 설정됩니다.
getopts
- 강력한 스크립트의 경우 - 명령을 처리하는 가장 좋은 방법인 경우가 많습니다.옵션. 반면에 위치 매개변수는 거의 항상 강력하게 처리하는 가장 간단한 방법입니다.피연산자스크립트에서.
예를 들어:
touch file$(seq -ws\ file 100)
./foo *
산출
$eight = file008
여기서는 여덟 번째 피연산자만 볼 수 있지만 내 테스트 디렉터리에는 그 중 101개가 있습니다.