1. ホーム
  2. bash

[解決済み] bash echo ファイル名なしでbash変数に指定されたファイルの行数

2023-07-04 08:09:14

質問

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

?

どのように解決するのですか?

自分のデータを使った例

にファイル名が埋め込まれるのを避けることができます。 NUMOFLINES 変数に埋め込まれるのを避けることができます。 JAVA_TAGS_FILE への引数としてファイル名を渡すのではなく、リダイレクションを使って wc . 例えば

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 がファイル名を表示するのは、標準入力のデータとしてではなく、引数として渡されたときだけです。場合によっては、ファイル名が表示されることを望むかもしれないので、いつ表示されるかを理解しておくと便利です。