쉘 스크립트를 실행할 때, 모든 위치 매개 변수를 순서대로 입력하지 않고 전달할 수 있습니까?


13

예를 들어 10 개의 매개 변수를 사용하는 스크립트 ./foo가 있고 8 번째 매개 변수 만 전달하려고합니다. 현재이 작업을 수행하는 방법을 아는 유일한 방법은 다음과 같습니다.

./foo '' '' '' '' '' '' '' 'bar'

더 쉬운 방법이 있습니까?


1
많은 매개 변수가있는 경우 프로그램이 일반적으로 위치 매개 변수 대신 옵션을 사용하는 이유입니다.
Barmar

답변:


4

이 작업을 수행하는 또 다른 방법은 선언하려는 매개 변수의 이름을 지정한 다음 그렇게하는 것입니다.

{   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 개는 내 테스트 디렉토리에서 가져 왔습니다.


18

스크립트를 변경할 수 있다고 가정하면 필수 매개 변수 (인수) 대신 선택적 매개 변수 (옵션)를 사용해야합니다.

처음 7 개의 7 개 매개 변수를 각각 옵션으로 사용하고 기본값을 빈 문자열로 설정하면 다음과 같이 할 수 있습니다.

./foo bar

당신이 사용하는 경우 POSIX 호환 쉘을 당신이 사용할 수있는 getopts유틸리티 또는 프로그램을 getopt. bash-대부분의 조개처럼-제안getopts 내장 기능을 제공합니다. 어느 쪽이든 자신의 명령 줄 파서를 굴리는 것보다 쉽습니다.

마지막 X 비 옵션 인수가 마지막 Y 인수 및 XY 옵션 인수의 값과 같은 것을 구현하지 않는 한 7 개의 (현재 비어있는) 문자열 앞에 옵션 문자열을 제공해야합니다. 그러나 이것은 일반적인 관행이 아니며 일반적으로 옵션은 항상 옵션이며 인수는 인수이며 옵션 "삽입"의 순서는 자유입니다.


5
+1에 대한 getopt(s). 위치 매개 변수는 슬픈 시간이므로 피해야합니다.
HalosGhost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.