
我想測試是否有任何輸出diff
(測試檔案是否相同),如果沒有echo "Passed $x" else echo "Failed $x"
。我想出了一些中間步驟(將 diff 的輸出保存到文件中,然後從文件中讀取)
diff "./helloworld$x.out" "./output/helloworld$x.out" > tmp.txt;
output="`cat tmp.txt`";
if [ "$output" = "" ];
then
echo "Passed $x";
else
echo "Failed $x";
fi;
我確定程式碼可以改進嗎?主要問題是:是否可以將輸出diff
直接保存到變數中?
答案1
這有效:
if diff "./helloworld$x.out" "./output/helloworld$x.out" >/dev/null;然後 echo "透過$x"; 別的 echo "失敗$x"; 菲
如果您使用變數而不是,則echo
可以刪除else
分支:在 之前將變數設為 falseif
並儲存 2 行程式碼。
如果您想實際將結果放入變數中,請使用:
some_var="$(diff "./helloworld$x.out" "./output/helloworld$x.out")"
包括我的測試,看看它是否真的有效:
rinzwind@discworld:~$ 觸 1 rinzwind@discworld:~$ 觸 2 rinzwind@discworld:~$ 更多測試 如果 diff 1 2 >/dev/null;然後 echo "透過$x"; 別的 echo "失敗$x"; 菲 rinzwind@discworld:~$ ./測試 透過 rinzwind@discworld:~$ vi 2 rinzwind@discworld:~$ 更多 2 2 rinzwind@discworld:~$ ./測試 失敗的
就>/dev/null
部分而言:將在該命令前面>/dev/null 2>&1
將輸出發送到>/dev/null
並將2>&1
標準錯誤發送到同一文件(意味著“使用第一個參數”)(因此它也使用)。&1
/dev/null
附註:sdiff
將顯示並排diff
列表:
差異 1 2 1 1 2 2 3 3 4 4 5 5 7 7 > 8 9 9 10 10
答案2
diff
使用下面的程式碼甚至可以完全抑制輸出,除了「檔案 /bin/bash 和 /bin/sh 不同」訊息之外。
file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
if diff -q "$file1" "$file2"; then
echo "Passed $x"
else
echo "Failed $x"
fi
如果您想要隱藏該訊息,則必須> /dev/null
在 diff 命令之後附加以隱藏以下輸出diff
:
if diff -q "$file1" "$file2" >/dev/null; then
/dev/null
是一個充當黑洞的特殊文件,如果你寫入它,它就會消失,如果你從它讀取,你將什麼也得不到。
請注意,bash 不需要;
結束行。
至於原來的問題,將程式的輸出保存在變數中:
file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
output="$(diff -q "$file1" "$file2")"
# the quotes are mandatory, this checks whether $output is empty or not
if [ -n "$output" ]; then
echo "Passed $x"
else
echo "Failed $x"
fi
檢查變數是否為空的其他方法:
[ "$output" = "" ]
[ "$output" == "" ]
[[ "$output" == "" ]]
[[ $output == "" ]]
如果您使用的是 Bash,建議使用最後兩個指令進行字串比較。否則,[ -n "$output" ]
建議使用第一個 和。
答案3
a) command1 的輸出可以用以下指令捕獲
output=$(diff "helloworld$x.out" "output/helloworld$x.out")
或使用反引號,但不鼓勵使用這些,因為您不能嵌套它們,而且它們可能很難與撇號區分開,這取決於字體:
output=`cmd1`
b) 您可以直接使用管道,而不是寫入文件,然後讀取該文件(或抓取輸出,然後回顯它):
cmd1 > file
cat file | cmd2
output=$(cmd1)
echo "${output}" | cmd2
=>
cmd1 | cmd2
但在您的範例中,您對輸出不感興趣,而是對程式的結果感興趣 - 它有效嗎?
diff "helloworld$x.out" "output/helloworld$x.out" && echo "success" || echo "failure"
了解 && 和 || 的使用搜尋“快捷方式 AND 和快捷方式 OR”。
為了保持輸出乾淨,您可以將“diff”的輸出重新導向到任何地方:
diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null && echo "success" || echo "failure"
為了獲取成功並稍後對其進行評估,您可以使用 $? 將最後一個命令的結果儲存在變數中:
diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null
result=$?
# do something else
case $result in
0) echo success ;;
*) echo failure ;;
esac
答案4
如果您想知道兩個文件是否相同或不同(但不關心實際差異是什麼),cmp
則更合適。
if cmp -s file1 file2; then echo "Equal"; else echo "Not equal"; fi