以下のスクリプトを作成しましたが、ディレクトリ内のファイル数に関係なく、ディレクトリ内のファイル数に対して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'
。
答え2
隠しファイル()を含むファイル数を数え、.*
サブディレクトリを除外するには、次のようにします。
find . -maxdepth 1 -type f -printf '.' | wc -c
すべての特典をfind
楽しむことができます。
答え3
問題はコマンド置換の構文エラーだと思います。
注文する
num=$(( expression ))
角かっこの内容を次のように解釈します。山水式を入力して数値結果を割り当てますnum
。いいえ括弧内にコードで記述された実行の出力を返します。代わりに、ls
およびwc
はシェル変数として解釈され、「OR減算」操作が実行l
されます。これらの「変数」のどれも初期化されていないため、結果はゼロになります。$ls
$wc
$l
やりたいことは次のように書かれます
num="$(ls | wc -l)"
しかしそれにもかかわらず、出力の解析ls
通常、これは良い考えではありません。代わりにいくつかの答えを見てください。この同様の質問ファイル名に特殊文字が含まれていても機能する「強力な」ソリューションが提供されます。