명령의 출력 (예 : diff)을 변수에 저장하는 방법 “Passed $x”

diffnone ( 출력 이 같은 경우 테스트)의 출력이 있는지 테스트하고 싶습니다 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변수에 직접 저장할 수 있습니까?



답변

이것은 작동합니다 :

if diff "./helloworld$x.out" "./output/helloworld$x.out"> / dev / null; 그때
    echo "통과 $ x";
그밖에
    echo "실패 $ x";
fi

대신 변수를 사용 echo하면 else분기를 삭제할 수 있습니다 . 변수를 false로 설정하고 if코드를 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";
fi
rinzwind @ discworld : ~ $ ./test
합격

rinzwind @ discworld : ~ $ vi 2
rinzwind @ discworld : ~ $ 더 2
2
rinzwind @ discworld : ~ $ ./test
실패한

>/dev/null부분 : >/dev/null 2>&1출력을 보낼 >/dev/null2>&1 동일한 파일 (표준 오차 보낼 &1명령 앞에 수단 ‘을 사용 첫번째 파라미터’) (도 사용 그렇게 /dev/null).

sidenote : 단계별 목록 sdiff이 표시됩니다 diff.

sdiff 1 2
1 1
2 2
3 3
4 4
5 5
7 7
                                  > 8
9 9
10 10


답변

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" ]가 권장됩니다.


답변

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


답변

두 파일이 동일하거나 다른지 알고 싶지만 (차이가 무엇인지는 상관하지 않음) cmp더 적합합니다.

if cmp -s file1 file2; then echo "Equal"; else echo "Not equal"; fi


답변