以下のスクリプトを作成しましたが、ディレクトリ内のファイル数に関係なく、ディレクトリ内のファイル数に対して0を返します。
source ~/Alan/assign/changeDir.sh
num=$(( ls | wc -l ))
echo $num
ChangeDir.shスクリプトは次のとおりです
function my_cd() {
cd ~/Alan
}
私にとって必要なのは、後で同じスクリプトで使用できるように数字を返すことです。これについての指示をいただきありがとうございます。ありがとう
ベストアンサー1
単一のディレクトリにある名前の数を見つけるには、*
その中のglobを展開して生成された単語の数を数えます。
shopt -s nullglob # to make the * glob expand to nothing
# if there is no matching names
set -- *
num=$#
printf '%s\n' "$num"
特別な値$#
は位置引数の数です。このset
コマンドは位置パラメータを設定します。
数えてみたいですか?定期的なファイルのみを含め、隠し名前を含めてから
shopt -s nullglob dotglob
for name in *; do
if [ ! -f "$name" ] || [ -L "$name" ]; then
# skip non-regular files and symbolic links
continue
fi
files+=( "$name" )
done
num=${#files[@]}
printf '%s\n' "$num"
サブディレクトリでこれを繰り返し実行するには、globstar
シェルオプションも設定し、それを**/*
グローブパターンとして使用します。
(zsh
シェルではを使用しても十分ですset -- **/*(.DN); print $#
)
あなたの問題
num=$(( ls | wc -l ))
2つです:
$(( ... ))
算術拡張です。ここでコマンドの置き換えを実行する必要があるかもしれません$( ... )
。wc -l
ファイル数はカウントされません。出力の改行数を計算しますls
。名前に1つ以上の改行が含まれるファイルは、複数のファイルと見なされますwc -l
。を使用してこのようなファイルを生成してテストできますtouch $'hello\nworld'
。