コマンド置換はループ条件内では機能しません

コマンド置換はループ条件内では機能しません

for (( a=1;a<=$(wc -l sedtest1);a++ ));do echo $a; done

エラーが発生します:

-bash: ((: a<=21 sedtest1: syntax error in expression (error token is "sedtest1")

答え1

の出力はwc -l sedtest1次のようになります。

21 sedtest1

したがって、テストはa <= 21 sedtest1無効になるようなものになります。

また、これはループの各反復ごとにコマンドが実行されることを意味しますwc。ファイルの内容がsedtest1各反復間で変更されない場合は、最初にその行番号をループ外の変数に保存する方がよいでしょう。

n=$(wc -l < sedtest1) # using redirection avoids the output containing the filename
for ((a = 0; a < n; a++)); do echo "$a"; done

また、ループを使用して非効率でシェルではない方法でテキストを処理しようとしているのではないかと思います。シェル ループを使用してテキストを処理するのはなぜ悪い習慣だと考えられるのでしょうか?このようにファイルの各行をループするのは正しい方法ではありません。

答え2

まあ、私はただ信じられないほど愚かだっただけです... wc -l file「x ファイル」として出力されます。

私がしなければならなかったのはこれだけです: for (( a=1;a<=$(wc -l sedtest1|awk '{print $1}');a++ ));do echo $a; done

関連情報