如何將命令的輸出(例如 diff)儲存到變數中

如何將命令的輸出(例如 diff)儲存到變數中

我想測試是否有任何輸出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

相關內容