Bashスクリプトには次の3つの構造があります。
NUMOFLINES=$(wc -l $Java_TAGS_FILE)
echo $NUMOFLINES" lines"
echo $(wc -l $Java_TAGS_FILE)" lines"
echo "$(wc -l $Java_TAGS_FILE) lines"
そして、スクリプトの実行時に両方とも同じ出力を生成します。
121711 /home/slash/.Java_base.tag lines
121711 /home/slash/.Java_base.tag lines
121711 /home/slash/.Java_base.tag lines
つまりファイルの名前もエコーされます(これは望ましくありません)。これらのスクリプレットが失敗する理由と、クリーンを出力する方法は次のとおりです。
121711 lines
?
ファイル名を引数としてwcに渡すのではなく、Java_TAGS_FILEからのリダイレクトを使用して、NUMOFLINES変数にファイル名を埋め込むことを回避できます。 。例えば:
NUMOFLINES=$(wc -l < "$Java_TAGS_FILE")
wcユーティリティーは、入力がパイプまたはリダイレクト演算子から取得された場合、出力にファイルの名前を出力しません。これらのさまざまな例を考えてみましょう。
# wc shows filename when the file is an argument
$ wc -l /etc/passwd
41 /etc/passwd
# filename is ignored when piped in on standard input
$ cat /etc/passwd | wc -l
41
# unusual redirection, but wc still ignores the filename
$ < /etc/passwd wc -l
41
# typical redirection, taking standard input from a file
$ wc -l < /etc/passwd
41
ご覧のとおり、wcがファイル名を出力するのは、標準入力のデータとしてではなく、引数として渡されたときだけです。場合によっては、ファイル名を印刷したいことがあるので、いつ表示されるかを理解しておくと便利です。
wc
は、ファイル名を指定しないとファイル名を取得できません。
wc -l < "$Java_TAGS_FILE"
また、awkを使用することもできます。
awk 'END {print NR,"lines"}' filename
または
awk 'END {print NR}' filename
(Mac、およびおそらく他のUnixに適用)
実際、wcアプローチには問題があります。行末記号で終了しない場合、最後の行はカウントされません。
代わりにこれを使用してください
nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs)
またはそれ以上(gniourf_gniourfに感謝):
nblines=$(grep -c '' file.txt)
注:chilicuilによるawkアプローチも機能します。
それは非常に簡単です:
NUMOFLINES=$(cat $Java_TAGS_FILE | wc -l )
または
NUMOFLINES=$(wc -l $Java_TAGS_FILE | awk '{print $1}')