bash 스크립트에서 다른 명령으로 매개 변수를 어떻게 전달합니까?


165

내 bash 스크립트 내에서 하나 또는 두 개의 매개 변수 (스크립트가 인식 할 수 있음)를 구문 분석 한 다음 나머지 매개 변수를 스크립트에서 호출 된 명령으로 전달하고 싶습니다. 어떻게해야합니까?

답변:


239

shift내장 명령을 사용하여 인수를 "먹으십시오". 그런 다음 자식 프로세스를 호출하고 "$@"나머지 모든 인수를 포함 하도록 인수를 전달하십시오 . 따옴표는 인수 목록의 확장이 올바르게 인용되도록하기 때문에 유지되어야합니다.


23
실제로 "$ @"는 $ *보다 안전합니다.
pixelbeat

1
@pixelbeat : 고마워요. 편집했습니다. @ Łukasz Lew : 설명서의 링크 된 페이지를 참조하십시오. :) 기본적으로 인용을 더 잘 처리합니다.

22
$@본질적으로 배열의 각 요소를 따옴표로 묶은 문자열로 취급합니다-확장의 기회없이 전달됩니다. 또한 각각이 별도의 단어로 표시되도록합니다. 차이를 보여주는 테스트 스크립트와 함께이 설명은 여기에 있습니다 : tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel

2
따옴표 사용에주의하십시오! 중요한 이유는 다음과 같습니다. stackoverflow.com/a/4824637/4575793
Cadoiz

32

bash는 shift 명령을 사용합니다 .

예 : shifttest.sh :

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 12 3 생성

1
2 3

2
트윗 담아 가기
Kyle Chadha

2
당신이로 인수를 전달하는 경우 $1로 말을 인용하지 않고 "$1"예 : 그렇다면, 쉘은, 단어 분할을 수행 foo bar으로 전달됩니다 foobar별도.
Tamás Zahola

여기에 이중 ""이 필요한 이유에 대해 자세히 알아보십시오. stackoverflow.com/a/4824637/4575793
Cadoiz

1
내 뇌는 "시프트 테스트"로 몇 글자를 뒤섞 였고 결과적으로 다른 것으로 읽었습니다.
Alex

21

Bash는 하위 설정 매개 변수 ( 서브 세트 및 하위 문자열 참조 )를 지원하므로 이와 같이 처리 / 전달할 매개 변수를 선택할 수 있습니다.

  1. 새 파일을 열고 편집하십시오 : vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. 그것을 실행 :

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. 결과는 다음과 같습니다.

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.