$@
나는 이것이 위치 매개변수를 보유하는 배열이라는 것을 읽었습니다 .
$@
배열의 요소를 출력하려고 합니다 .
echo ${@[1]}
하지만 bash
나에게 다음과 같은 오류가 발생했습니다.
test.sh: line 1: ${@[1]}: bad substitution
답변1
$@
는"특수 매개변수"은(는) 배열이 아니므로 배열로 액세스할 수 없습니다. 해당 위치를 사용하여 매개변수에 직접 액세스할 수 있습니다. ${1}
... .${n}
$ set -- a b c d e f g h i j k l m n
$ echo "$#"
14
$ echo "${10}"
j
매개변수 10+에 대한 중괄호 동작이 궁금했기 때문에 다양한 셸에서 테스트했습니다.
for shell in ash bash dash fish ksh mksh posh rc sash yash zsh
do
printf "The %s shell outputs: %s\n" "$shell" "$($shell -c 'set -- a b c d e f g h i j k l m n; echo $10')"
done
다음 결과는 다음과 같습니다.
The ash shell outputs: j
The bash shell outputs: a0
The dash shell outputs: j
The fish shell outputs:
The ksh shell outputs: a0
The mksh shell outputs: a0
The posh shell outputs: a0
rc: cannot find `set'
The rc shell outputs:
The sash shell outputs: j
The yash shell outputs: a0
The zsh shell outputs: j
쉘 매개변수의 중괄호 동작은 다음과 같습니다.쉘 명령 언어쉘 매개변수 확장 부분:
매개변수 이름이나 기호는 중괄호로 묶일 수 있습니다. 이는 두 자리 이상의 위치 인수를 제외하고는 선택 사항입니다.
특수 매개변수 자체 는 $@
같은 페이지에 설명되어 있습니다.특수 매개변수부분.
답변2
$@
실제로 는 배열이 아니라 값 목록 입니다 . 배열 구문은 실제로 작동하지 않습니다. 그들을"위치 매개변수"라고 합니다.일반적으로 구문 $4
(예:)을 통해 액세스됩니다.
배쉬에서:
$ set -- a b c d e f g h i j k l m n
$ echo $6
f
$ echo "${11}"
k
$ echo "${@:11:1}"
k
색인이 있습니다:
$ i=11
$ echo "${@:i:1}"
k
$ echo "${!i}"
k
이전 셸에서는 eval을 사용하는 것 외에는 해결책이 없습니다(위험 참고).
$ eval 'var=$'"{$i}"
$ echo "$var"
k
주기
루프는 관리하기 쉽습니다. 그냥 사용하세요.for var; do …; done
$ for pos; do printf '%s:' "$pos"; done; echo
a:b:c:d:e:f:g:h:i:j:k:l:m:n:
쉘은 목록의 각 값을 각 루프에 사용할 수 있도록 자동으로 만듭니다.