一時変数なしでテストを使用して2つのコマンドの出力を比較する

一時変数なしでテストを使用して2つのコマンドの出力を比較する

私は bash でいくつかのことをテストしていて、ファイル内の行数と一意の行数を比較することにしました。対応する値を格納する 2 つの一時変数を作成して比較するだけでよいことはわかっていますが、それを 1 行で行う方法について疑問に思っています。

たとえば、次のアプローチが機能すると思いました: test `wc -l filename` -eq `uniq filename|wc -l`。エラーが発生します-bash: test: too many arguments。どこに間違いがあるのでしょうか。一時変数を使用せずにこれを行うにはどうすればよいのでしょうか。

答え1

と は のみを出力wc -l fileするため、直接比較することはできません。@stelldriver が提案したように、 でファイルをの標準入力にリダイレクトしてのみが出力されるようにするか、awk を使用して最初のフィールドのみを取得してください (以下を参照)。[number] fileuniq file | wc -l[number]wcwc -l < file[number]

また、バックティックは読みにくくなります。$(command)構造を優先します。

式が引用符で囲まれていないため、「引数が多すぎます」というメッセージが表示され、シェルは[number] file出力を 1 つの単語ではなく 2 つの単語に分割します。

全体として、これがあなたが求めているものです:

test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"

wc -l file最初のフィールドだけを取得するために、出力を awk に渡します[number]


答えをより明確にするために、echoコマンドの前に an を追加して、元の試行で何が起こるかを確認してください。

$ echo test `wc -l file` -eq `uniq file|wc -l`
test 19 file -eq 17

ご覧のとおり、testコマンドには19file-eqの4 つの引数があります17

私が提案したものを試してみると、次の 3 つの引数による適切な比較が得られますtest

$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17

関連情報