(참고: 이 질문의 동기는 단지 bash
프로그래밍 지식을 향상시키기 위한 것입니다.)
에 bash
해당하는 표현을 알고 싶습니다 .zsh
$@[2,$#]
곧장$@
셸 함수(또는 스크립트)의 명령줄 인수 배열( ) 범위를 지정합니다 .
(주소 범위를 온라인에서 찾은 모든 솔루션 $@
은 bash
"간접적인$@
주소 지정'은 모두 중간 변수에 먼저 할당되어야 하기 때문입니다 . 아래 예를 참조하세요.)
구체적으로 말하면 bash
다음 테스트 기능 zsh
과 동등한 것은 무엇입니까 ?
testfn () {
printf '>%s<\n' $@[2,$#]
}
% testfn a b c d
>b<
>c<
>d<
위에서 언급한 것처럼 내가 생각해낸 가장 가까운 방법은 다음과 같습니다. $@
중간 변수에 할당해야 합니다.
testfn () {
holdargs=( $@ )
printf '>%s<\n' "${holdargs[@]:1}"
}
중간 변수가 필요하지 않은 모든 시도는 오류로 인해 실패합니다 bad substitution
.
답변1
이것은 나에게 효과적입니다.
testfn () {
printf '>%s<\n' "${@:2}"
}
예:
$ testfn a b c d
>b<
>c<
>d<
$@ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word.
위치 매개변수 섹션 보기배쉬 해커 위키게다가광범위하게 사용됨더 많은 예시와 세부정보를 보려면 섹션을 참조하세요.
이는 일반적으로 큰따옴표를 사용하는 경우입니다 $@
. "$@"
그렇지 않으면 "${@:2}"
반환된 결과는 큰따옴표 결과가 됩니다.
$@
배열 요소는 다음 표기법을 사용하여 액세스할 수 있습니다.
"${@:START:COUNT}"
"과다한 사용" 섹션에서 발췌
그러면 START에서 시작하여 COUNT개의 위치 매개변수가 확장됩니다. COUNT는 생략할 수 있으며(${@:START}), 이 경우 START로 시작하는 모든 위치 인수가 확장됩니다.
요소가 비어 있나요?
다른 사람들은 위의 내용이 빈 요소를 처리할 수 없기 때문에 동일하지 않다고 지적했습니다. 저는 Bash 4.1.7을 사용하고 있는데 그런 것 같습니다.
예:
$ testfn "" a "" c d e
>a<
><
>c<
>d<
>e<
$ testfn '' a '*' c d e
>a<
>*<
>c<
>d<
>e<
$ testfn "" a " " c d e
>a<
> <
>c<
>d<
>e<
답변2
존재하다 zsh
,
printf '<%s>\n' ${@[2,$#]}
그것은 같은
printf '<%s>\n' $@[2,-1]
null이 아닌 위치 요소 2를 마지막 요소까지 인쇄합니다. 이는 작성과 동일합니다($# == 5인 경우).
printf '<%s>\n' $2 $3 $4 $5
그래서:
$ set 1 2 '' '*' 5
$ printf '<%s>\n' $@[2,-1]
<2>
<*>
<5>
동등한 것을 얻으려면 bash
다음이 필요합니다.
$ set 1 2 '' '*' 5
$ a=("$@")
$ IFS=; set -f
$ printf '<%s>\n' ${a[@]:1}
<2>
<*>
<5>
작동하지 않기 때문에 중간 배열이 필요합니다 ${@:2}
(적어도 4.2.45에서는 아님).
물론, 비어 있는지 여부에 관계없이 첫 번째 요소를 제외한 모든 요소를 원하는 경우 다음과 같이 작성해야 합니다.
$ printf '<%s>\n' "$@[2,-1]"
<2>
<>
<*>
<5>
zsh
함께 하다
$ printf '<%s>\n' "${@:2}"
<2>
<>
<*>
<5>
존재하다 bash
.
구문 은 zsh
끝에 포함되므로 ${array:first:n}
(csh 스타일 수정자와 충돌하지 않는 경우에만) 위의 bash(실제로는 ksh) 코드는 최신 버전의 zsh
.
${a[@]:1}
과 의 차이가 나는 이유는 에서는 or 와 반대로 배열에서 위치를 복사할 때와 마찬가지로 배열이 희박하고 인덱스가 0 부터 시작한다는 ${@:2}
점을 기억해야 합니다 .bash
zsh
csh
rc
ksh
bash
${a[@]:4:5}
인덱스가 4보다 크거나 같은 처음 5개 요소를 반환합니다. 첫 번째 요소 $@
의 인덱스는 1( $1
)이고, 로 정의된 배열 a=(...)
의 요소는 0부터 시작하는 인덱스로 설정됩니다.
글쎄, 그것은 전적으로 사실이 아닙니다. 에서 like는 $# > 0인 경우에만 while(따옴표 없이) 처럼 확장 bash
되며 설정되지 않거나 비어 있지 않은 경우에만 가능합니다. 이것은 나에게 버그처럼 들린다. 에서는 동작이 다르지만 다시 일관됩니다."$@"
"$1" "$2" "$3" "$4" "$5"
"${@:0:1}"
"$0"
"$@"
"${@:1}"
$@
${@:1}
$IFS
ksh