쉘 스크립트를 실행할 때 순서대로 입력하지 않고도 특정 위치 인수를 전달할 수 있습니까?

쉘 스크립트를 실행할 때 순서대로 입력하지 않고도 특정 위치 인수를 전달할 수 있습니까?

예를 들어, 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개가 있습니다.

관련 정보