zsh 스크립트에서 배열 길이 찾기

zsh 스크립트에서 배열 길이 찾기

*일부 변수를 증가시키기 위해 for 루프를 사용하지 않고 zsh에서 배열(파일 이름)의 길이를 찾는 방법이 있습니까 ?

순진하게 시도했지만 echo ${#*[@]} 성공하지 못했습니다. (bash 구문도 환영합니다)

답변1

${#*[@]}위치 인수의 배열인 or $*라고도 하는 배열의 길이입니다 (스크립트나 함수의 경우 이는 스크립트나 함수가 받는 인수입니다). 오히려 그것을 사용하고 싶지만 .$@$argv$#

*혼자는 전역 모드일 뿐입니다. 목록 컨텍스트에서는 패턴과 일치하는 현재 디렉터리의 파일 목록으로 확장됩니다. 모든 문자열과 일치하는 패턴 으로 *현재 디렉터리의 모든 파일 이름으로 확장됩니다(예외숨겨진그것들).

이제 하나를 찾아야 해목록 컨텍스트그것을 확장 *하고 어떻게든 결과 인수의 수를 계산합니다. 한 가지 방법은 익명 함수를 사용하는 것입니다.

() {echo There are $# non hidden files in the current directory} *(N)

**(N)나는 which is를 사용하지 않았지만 (nullglob의 경우) 와일드카드 한정자를 *사용하여 N패턴이 *어떤 파일과도 일치하지 않으면 오류를 보고하지 않고 어떤 것으로든 확장하도록 합니다.

그런 다음 확장을 *(N)익명 함수에 전달합니다. 해당 익명 함수에서 파일 목록은 $@/ 배열에서 사용할 수 $argv있으며 해당 배열의 길이를 사용할 수 있습니다 $#( $#argv또는 $#@심지어 $#*동일한 어색한 ksh 구문 사용 ${#argv[@]}).

답변2

files=(*)
printf 'There are %d files\n' "${#files[@]}"

또는

set -- *
printf 'There are %d files\n' "$#"

먼저 배열의 이름을 지정하거나(위에서 했던 것처럼), files두 번째 예에서 했던 것처럼 와일드카드를 채워 내장 배열을 사용해야 합니다. $@전자에서는 배열의 "길이"(파일 수)가 구문적으로 수행됩니다 ${#arrayname[@]}. 내장 배열의 요소 수는 입니다 $#.

관련 정보