使用不含臨時變數的 test 比較 2 個指令的輸出

使用不含臨時變數的 test 比較 2 個指令的輸出

我正在 bash 中測試一些內容,我決定將文件中的行數與唯一行數進行比較。我確實知道我可以簡單地創建 2 個臨時變數來儲存相應的值並比較它們,但我想知道如何在 1 行中完成它。

例如,我認為這種方法可行:test `wc -l filename` -eq `uniq filename|wc -l`。我得到了錯誤-bash: test: too many arguments。我的錯誤在哪裡?

答案1

您無法進行直接比較,因為只有wc -l file輸出[number] fileuniq file | wc -l輸出[number]。您可以按照@stelldriver的建議,將檔案重新導向到wc的標準輸入wc -l < file,以便僅[number]輸出,或使用 awk 僅取得第一個欄位(請參閱下文)。

此外,反引號也不利於可讀性。更喜歡$(command)構造。

你會得到“太多參數”,因為你的表達式沒有被引用,所以 shell 將輸出分成[number] file兩個單字而不是一個單字。

總而言之,這就是您所追求的:

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

可以看出,該指令有 4 個參數test19file-eq17

如果您嘗試我建議的方法,您將獲得與 3 個參數的正確比較test

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

相關內容