쉘 스크립트 내부의 프로그램에 명령 행 매개 변수 전달


15

에 관해서는 ./script.sh arg1 [arg2 arg3 ...]명령 줄 인수 arg1, arg2에 의해, ... 가지고 할 수있다 $1, $2... 그러나 인수의 수입니다 NOT 고정.

쉘 스크립트에서, 나는 인수를 시작 arg2하여 프로그램 으로 전달하고 싶습니다 .

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

하나 이상의 주장이있을 수 있으므로 어떻게해야합니까?

답변:


17

일반적인 방법은 arg1 ( "$1") 사본을 저장 하고 매개 변수를 하나씩 이동하여 전체 목록을 "$@"다음 과 같이 참조 할 수 있습니다 .

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

bash는 물론 배열을 지원하지만 질문에 제기 된 것은 필요하지 않습니다.

arg1 조차도 선택 사항 이라면 다음과 같이 확인하십시오.

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

사용할 때 큰 따옴표가 필요 $@합니까?
Lee

1
을 사용한 큰 따옴표 $@는 쉘에 각 매개 변수를 큰 따옴표로 묶도록 지시합니다 (매개 변수에 괄호 나 별표와 같은 재미있는 문자가 포함되어 있으면 좋을 것입니다). 당신이 그것에 관심이 없다면, 평범한 $*작품 ...
토마스 Dickey

6
@ Lee 네, 큰 따옴표가 필요합니다. 그렇지 않으면 인수 목록을 전달하는 대신 각 인수가 공백으로 분할되고 각 조각이 와일드 카드 패턴으로 해석되며 패턴이 일치하면 일치 목록으로 대체됩니다. 일반적으로 말하면 항상 큰 따옴표 변수 대체 .
Gilles 'SO- 악마 그만해'

10

파라미터 확장을 사용하여 위치 파라미터를 슬라이스 할 수 있습니다. 구문은 다음과 같습니다.

${parameter:offset:length}

경우 length생략 그것은 마지막 값까지로한다.

두 번째에서 마지막 인수로 전달하려면 다음이 필요합니다.

${@:2}

예:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.