셸 스크립트의 단일 쿼리에 여러 출력이 있는 경우 각 출력을 어떻게 선언합니까?

셸 스크립트의 단일 쿼리에 여러 출력이 있는 경우 각 출력을 어떻게 선언합니까?

출력이 일치하면 다음 명령을 실행하여 조건을 작성하고 싶습니다.

diff -is <(echo 'curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256') \
         <(shasum -a 256 teleport-v9.3.4-linux-amd64-bin.tar.gz)

위 명령의 출력은 다음과 같습니다

< 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15 teleport-v9.3.4-linux-amd64-bin.tar.gz
> 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15  teleport-v9.3.4-linux-amd64-bin.tar.gz

이 경우 체크섬이 일치하므로 조건에 추가할 각 출력을 어떻게 선언할 수 있습니까? 예: 출력 a==출력 b이면 체크섬이 일치합니다. 누구든지 도움을 줄 수 있다면 좋을 것입니다.

답변 주셔서 감사합니다. 다음 답변을 사용해 보았고 요청한 작업을 수행할 수 있었습니다.

답변1

나는 shasum 이 의 출력을 diff-ing하는 대신 자체 내장 "체크" 옵션( )을 사용하도록 할 것입니다 .*.sha256shasumshasum -c

실행 중:

$ echo "This is a file" > file1
$ echo "This is another file" > file2
$ shasum -a 256 file* | tee files.sha256
0b7d91193b9c0f5cc01d40332a10cf1ed338a41640bd7f045f1087628c1d7a9b  file1
0290013ed1662eda102bee144a282ffe03d226b4dd9134c251c6b3be6d69d6ec  file2


$ shasum -c files.sha256
file1: OK
file2: OK
$ echo $?
0

$ echo "damaged file" > file1

$ shasum -c files.sha256
file1: FAILED
file2: OK
shasum: WARNING: 1 computed checksum did NOT match
$ echo $?
1

이 스크립트를 작성하면 shasum -c의 종료 코드를 통해 확인 성공 여부를 알 수 있습니다.

따라서 귀하의 경우에는 다음을 수행합니다.

wget https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
shasum -c teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
rm teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256

또는

shasum -c <(curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256)

답변2

URL과 파일 이름을 바꾼 후 실제로 실행하는 명령은 다음과 같습니다.

diff -is <(echo `curl "$url"`)  <(shasum -a 256 "$file")
                ^           ^

이는 echo `curl...`게시물(*)과 같은 작은따옴표가 아닌 백틱입니다. 따옴표가 없는 명령 대체를 통해 전달된 출력은 curl두 개의 개별 인수를 제공한 echo다음 공백으로 연결하여 토큰화를 적용합니다. 파일의 이중 공백을 단일 공백으로 효과적으로 변경합니다.

curl https://...(* 작은따옴표를 사용하면 명령으로 실행되지 않고 출력됩니다 )

바라보다:

이것이 출력이 제공되는 이유이기도 합니다 diff. 행은 단일 공백만큼만 다릅니다.

쓸모없는 명령 대체를 제거하고 실행하면

diff -is <(curl "$url")  <(shasum -a 256 "$file")

대신, 파일을 동일한 것으로 인식하고 -s. 그런 다음 diff인쇄된 출력에 신경 쓰지 않고 종료 상태를 직접 사용할 수 있습니다 .

if diff -iq <(curl "$url")  <(shasum -a 256 "$file") > /dev/null; then
    echo "hashes are the same"
else
    echo "hashes differ"
fi

diff대소문자를 무시하는 기능 외에는 필요하지 않지만 꼭 필요한 것은 아니라고 생각합니다. 출력을 쉘 변수에 저장하고 비교할 수 있습니다.

their=$(curl "$url")
mine=$(shasum -a 256 "$file")
if [[ "$their" == "$mine" ]]; then
    echo "hashes match"
else
    echo "hashes do not match"
fi

또는 초기 부분을 해시와 비교하려는 경우:

their=$(curl "$url")
their=${their%% *}
mine=$(shasum -a 256 "$file")
mine=${mine%% *}
if [[ "$their" == "$mine" ]]; then
    ...

아니면 심지어 같은 것

read -r hash1 filename1 < <(curl "$url")
etc.

출력의 두 필드를 별도의 변수로 읽습니다.

관련 정보