ループ内のファイルコマンド数の計算

ループ内のファイルコマンド数の計算

ls *.txt | wc後でループで使用できるように、別の変数としてどのように使用できますか?それは

count.files=$(ls *.txt | wc)
...

if count.files -ne 2000; then
echo "message"
fi

試してみましたが、うまくいかないようです。

答え1

コードにいくつかのエラーがあります。

  • ほとんどのシェルでは、変数名にドットを含めることはできません。
  • 旗をwc持って電話する必要があります-l
  • 旗をls持って電話する必要があります-d
  • オプションの終わりを表示する--か、./プレフィックスを使用する必要があります。ls
  • テストifに括弧がありません(ただし、スタック交換形式になる可能性があります)。
  • ファイル名に改行文字が含まれている場合、この方法は機能しません。
  • 隠しファイルは省略されます。

より良い作業例は次のとおりです。

file_count=$(ls -d ./*.txt | wc -l)
if [ $file_count -ne 2000 ]; then echo "message"; fi

答え2

あなたが考慮している機能は規律だと思います。これはksh93ユニークな機能です:

function count.get {
  .sh.value=$(set -- ~(N)*.txt; echo "$#")
}

その後、$count展開するたびに規律関数を呼び出し、値を割り当てます。

では、zsh変数の内容をコードとして定義することもできます。

count='$(set -- *.txt(N); echo "$#")'

${(e)count}拡張時に評価するコードとして使用しますe

しかしながら、これらの方法は、関数を使用する標準的なアプローチに比べて利点がほとんどない。

count() (
  set -- [*].txt *.txt
  case $1$2 in
    '[*].txt*.txt') echo 0;;
    *) echo "$#"
  esac
)

(このトリックは、nullglobオプション(上記の 'sまたは'など)をサポートするシェルを使用して[*]回避できます。)ksh93~(N)zsh(N)

そしてそれを$(count)コマンドの置き換え)。

(コードに関するすべての質問については、他の回答を参照してください)

答え3

wc -lまず、改行文字のみを使用してください。これは働きます:

#!
filecounter=$(ls *.txt | wc -l)
if [ $filecounter -ne 2000 ]; then echo "message"
fi

関連情報