"$@"의 단일 요소를 출력하는 방법은 무엇입니까?

"$@"의 단일 요소를 출력하는 방법은 무엇입니까?

$@나는 이것이 위치 매개변수를 보유하는 배열이라는 것을 읽었습니다 .

$@배열의 요소를 출력하려고 합니다 .

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:

쉘은 목록의 각 값을 각 루프에 사용할 수 있도록 자동으로 만듭니다.

관련 정보