${#array} 및 ${#array[@]}

${#array} 및 ${#array[@]}

내가 아는 한, 의 요소 수를 평가 ${#array[@]}합니다 . 긴 형식( )을 선택한 이유가 있나요 ?${#array}$array${#array[@]}

답변1

zsh에서는 개인 취향입니다. 다른 쉘에서는 $array첫 번째 요소로만 확장될 수 있으므로 ${#array}첫 번째 요소의 길이가 출력됩니다.

따라서 쉘 사이에 더 많은 이식성을 원한다면 이를 지정하는 [@]것이 좋습니다.

zsh에서는 따옴표 안에 표시되는지 여부에 따라 $array동일한 방식으로 확장이 발생합니다 . $array[*]큰따옴표 안에 있는 경우 기본적으로 공백인 "$array"첫 번째 문자로 확장되고 구분됩니다.IFS

zsh% touch {1..10}; a=(*)
zsh% printf '<%s> ' $a
<1> <10> <2> <3> <4> <5> <6> <7> <8> <9>     
zsh% printf '<%s> ' "$a"
<1 10 2 3 4 5 6 7 8 9> 
zsh% IFS=:
zsh% print "$a"
1:10:2:3:4:5:6:7:8:9
zsh% print "$a[@]"
1 10 2 3 4 5 6 7 8 9
zsh% IFS=$' \t\n'
zsh% rm "$a"
rm: cannot remove ‘1 10 2 3 4 5 6 7 8 9’: No such file or directory

IFS변경할 필요가 거의 없으므로 초기 "개인 선호도" 응답이 촉발되었습니다. 하지만 명확히 하자면, flags 없이 두 가지를 사용하는 것 사이에는 약간의 차이점이 있으며 #매우 미묘합니다.

$array[@]또한 따옴표 안에 표시되는지 여부에 따라 동작이 변경되지 않기 때문에 선호합니다 . 요소에 있을 수 있는 모든 공백과 내부 공백은 유지됩니다.

답변2

다른 모든 것과 마찬가지로, 코드가 더 읽기 쉽고 이해하기 쉬울수록 다른 사람(또는 미래의 귀하)이 유지 관리하기가 더 쉬워집니다. 선택권이 있는데 하나가 불분명할 때 다른 하나를 선택하세요.

게다가 쉘 스크립트를 이식 가능하게 하려면 후자가 bash.

답변3

배열을 지원하는 대부분의 셸(나는 이것을 bash, 및 에서 테스트했습니다 ) 에서 길이가 제공되고 배열 의 요소 수가 제공됩니다. 이는 논리적입니다. 배열의 요소를 반환하고 해당 길이를 반환합니다. ksh93pdksh${#array}${array[0]}${#array[@]}"${array}"0"${#array}"

관련 정보