변수 확장을 따옴표로 묶는 방법은 무엇입니까?

변수 확장을 따옴표로 묶는 방법은 무엇입니까?

내 bash 스크립트는 다음과 같습니다.

#!/bin/bash
set -x 

./test FLAGS=${@:2}

내가 실행할 때 ./script 1 2 3실행되는 명령 은 ./test FLAGS=2 3... 내 생각에는 FLAGS="2 3".

네 번째 줄을 로 변경해도 ./test FLAGS="${@:2}"아무 변화가 없습니다.

네 번째 줄을 다음과 같이 바꾸면 ./test FLAGS=\"{@:2}\"내가 얻는 것은 ./test 'FLAGS="2' '3"'실제로 내가 원하는 것이 아닙니다.

변수를 따옴표로 묶는 방법은 무엇입니까?

답변1

사용

"${*:2}"

바꾸다

"${@:2}"

$@${x[@]}그 변형,배열의 각 요소는 "단어"로 확장됩니다.인용할 때. $*(그리고 ${x[*]})모든 요소를 ​​함께 연결하여 단일 단어로 확장사용된 첫 번째 문자입니다 $IFS.

전혀 참조되지 않으면 두 버전 모두 통과됩니다.분사모든 문자에서 여러 단어 분할을 생성합니다.IFS발생하다.

답변2

의견에 따르면 첫 번째 인수를 삭제(또는 어딘가에 저장)한 다음 나머지 인수를 스크립트 내에서 호출하는 다른 스크립트 또는 명령에 대한 인수로 사용하려는 것으로 이해됩니다.

그렇다면 이 작업을 쉽게 수행할 수 있으며 FLAGS스크립트 인수를 스크립트 내의 명령에 전달하기 위해 변수(또는 다른 것)를 설정할 필요가 없습니다. 다음 예를 참조하세요.

#!/bin/bash
set -x

original_first_arg="$1"     # Use this line if you need to save the value to use later.

shift
mycommand "$@"

shift명령은 bash내장된 명령입니다. 그 자체로는(숫자를 지정하지 않음) 스크립트의 첫 번째 인수(위치 인수)만 버립니다. 맨페이지에서:

   shift [n]
          The  positional  parameters  from n+1 ... are renamed to $1 ....
          Parameters represented by the numbers  $#  down  to  $#-n+1  are
          unset.   n  must  be a non-negative number less than or equal to
          $#.  If n is 0, no parameters are changed.  If n is  not  given,
          it  is assumed to be 1.  If n is greater than $#, the positional
          parameters are not changed.  The return status is  greater  than
          zero if n is greater than $# or less than zero; otherwise 0.

그런 다음 명령에 의해 삭제된 이후 "$@"첫 번째 인수를 빼고 스크립트에 제공한 정확한 인수로 확장됩니다 .$1shift

추가 자료:

답변3

스크립트의 매개변수에 따라 다른 매개변수 세트를 사용하려면할 수 있는이를 위해 기능을 사용하십시오.

other_script(){ shift; command other_script "$@"; }
other_script "$@"

그것이 내가 보통 하는 일이다. 함수는 다른 함수 자체를 호출하거나 새 함수를 정의하거나 재정의할 수 있습니다. 모든 함수에는 배열이 있습니다.

관련 정보