
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