내 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.
그런 다음 명령에 의해 삭제된 이후 "$@"
첫 번째 인수를 빼고 스크립트에 제공한 정확한 인수로 확장됩니다 .$1
shift
추가 자료:
답변3
스크립트의 매개변수에 따라 다른 매개변수 세트를 사용하려면할 수 있는이를 위해 기능을 사용하십시오.
other_script(){ shift; command other_script "$@"; }
other_script "$@"
그것이 내가 보통 하는 일이다. 함수는 다른 함수 자체를 호출하거나 새 함수를 정의하거나 재정의할 수 있습니다. 모든 함수에는 배열이 있습니다.