*
いくつかの変数を増やすためにforループを使わずにzshで配列(ファイル名)の長さを見つける方法はありますか?
無邪気に試しましたが、echo ${#*[@]}
成功しませんでした。 (bash構文も歓迎します)
答え1
${#*[@]}
位置引数の配列であるor$*
とも呼ばれる配列の長さです(スクリプトまたは関数の場合、これはスクリプトまたは関数が受け取る引数です)。むしろそれを使用したいのですが。$@
$argv
$#
*
単独ではグローバルモードに過ぎません。リストコンテキストでは、パターンに一致する現在のディレクトリのファイルのリストに展開されます。すべての文字列に一致するパターンで、*
現在のディレクトリのすべてのファイル名に展開されます(例外隠されたそれら)。
今一つを見つける必要がありますリストコンテキストそれを拡張し*
、何とか結果の引数の数を計算します。 1つの方法は、匿名関数を使用することです。
() {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
2番目の例で行ったようにワイルドカードを入力して組み込み配列を使用する必要があります。$@
前者では、配列の「長さ」(ファイル数)が構文的に実行されます${#arrayname[@]}
。組み込み配列の要素数はです$#
。