이 $ {@ : 2}는 쉘 스크립팅에서 무엇을 의미합니까?


27

나는 이것을 쉘 스크립트에서 본다.

variable=${@:2}

뭐하는거야?


그것이 대본에 정확히 어떻게 나타 났습니까? 구문은 배열처럼 보이지만 일부 조각이 누락되었습니다. 이 줄 주변에 몇 줄을 스크립트에서 게시 해 주시겠습니까?
slm

그것은 두 번째 글자에서 시작하는 변수입니다. var="my_value"; echo var="${var[@]:2}"; echo "$var"차이점을 보시겠습니까?
Valentin Bajrami

답변:


34

$@Bash에서 특수 변수의 내용을 보여줍니다 . 여기에는 모든 명령 행 인수가 포함되며이 명령은 두 번째 인수에서 모든 인수를 가져 와서 변수에 저장합니다.variable .

예고는 스크립트입니다.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

예제 실행 :

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

참고 문헌


9
표시된 기술은 주어진 인수를 단일 문자열로 mashing합니다. 별도의 인수로 유지해야하는 경우 배열을 사용하십시오.vars=( "${@:2}" )
glenn jackman

@glennjackman-지적 해 주셔서 감사합니다.
slm

2
중괄호 사용에도 유의하십시오. 항상 중괄호를 사용해야하지만 Bash를 사용하면 컨텍스트가 모호하지 않으면 생략 할 수 있습니다. 따라서, $@그리고 ${@}후자는 "더욱 정확한"구문이지만 동일하다. 는 대괄호를 사용해야합니다. 모호 ${@:2}하기 $@:2때문에으로 해석되므로 ${@}:2동일하지 않습니다.
Paddy Landau

14

의 최신 버전 ksh에서도 볼 수 있는 기능 bash입니다 zsh.

에서 ksh그리고 bash에는 사용하여 배열의 여러 요소를 액세스 할 수있는 ${array[@]:first:length}최대로 확장 구문, length(또는 모든 경우에 length생략)의 요소들 array로 시작 배열 (배열의 요소들의 목록은 인덱스의 수치 정렬) 인덱스 크거나 같음으로 첫번째 first. 스칼라 문맥에서 (여기 스칼라 변수에 할당처럼) 요소의 목록으로 공백 문자와 결합 될 때 bashksh93첫 번째의 문자 $IFS(또는 아무것도 경우 $IFS에이 설정되지 않은 경우 빈 또는 공간) zsh.

예를 들어 :

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@특별한 경우입니다. $@위치 매개 변수의 배열입니다 ( $1, $2...). 함께 사용할 때 :, $0도 포함되어 있습니다. 그래서 ${@:1}과 동일 $@하지, ${@:0}다른 배열과 같은.

에서 zsh, 그것은 약간 다릅니다. 호환성을 위해 최근에 구문을 zsh추가 ksh했지만 요소 범위를 선택하기위한 고유 구문이 있습니다.

반대로 ksh하고 bash, zsh어레이 스칼라 변수와는 다른 변수의 입력이 아닌 스파 스 ( zsh다른 변수 유형과 연관 배열을 갖는다)과 인덱스 0 대신에 1에서 시작한다.

를 들어 zsh, 당신이 배열 요소 범위 액세스 $a[first,last](여기서 last또한 끝으로부터 거꾸로 카운트 음수 일 수 있음).

에서 zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

235 개의 요소로 구성된 배열을 생성하며 대부분 비어 있습니다. $a[12,50]요소 12에서 50으로 ${a[@]:12:2}확장되고 (빈) $a[12]$a[13]요소로 확장됩니다 . 특별한 경우로서, 다시 함께 휴대 성 ksh93하고 bash, zsh또한 허용 0첫번째 요소 $@와 그리고 취급 $0.

따라서 3 가지 쉘 모두에서 이식 가능 ${a[@]:x:n}하며 ${@:x:n}스파 스가 아닌 어레이에만 사용할 수 있으며 IFS의 가치에주의를 기울이십시오.

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