我正在 bash 中測試一些內容,我決定將文件中的行數與唯一行數進行比較。我確實知道我可以簡單地創建 2 個臨時變數來儲存相應的值並比較它們,但我想知道如何在 1 行中完成它。
例如,我認為這種方法可行:test `wc -l filename` -eq `uniq filename|wc -l`
。我得到了錯誤-bash: test: too many arguments
。我的錯誤在哪裡?
答案1
您無法進行直接比較,因為只有wc -l file
輸出[number] file
和uniq 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 個參數test
:19
、file
和-eq
。17
如果您嘗試我建議的方法,您將獲得與 3 個參數的正確比較test
:
$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17