날짜와 sha512 합계를 파일로 인쇄하시겠습니까?

날짜와 sha512 합계를 파일로 인쇄하시겠습니까?

날짜와 sha512 합계를 파일로 인쇄하고 싶습니다. 다음 구문을 사용하는 것이 좋습니다 <date> : <sha512sum>.

코드는 다음과 같습니다.

FILES="
blocklists/blocklist.txt
whitelists/whitelist.txt
"
main() {
    echo "sha512"
    func_sha512sum
    cat sha512.md
}

func_sha512sum() {
    for file in $FILES
    do
        sha512sum $file > temp2
        date > temp3
        temp3 + " : " + temp2 >> sha512.md
    done
}
main
rm temp*

그러나 출력은 다음과 같습니다.

sha512
test.sh: 17: temp3: not found
test.sh: 17: temp3: not found

누구든지 작동시키는 방법을 알고 있습니까? 미리 감사드립니다

편집: rm temp*가 없으면 temp2와 temp3은 모두 있어야 하는 정보로 채워지지만 sha512sum.md에 "병합"되지는 않습니다.

답변1

이 줄은 bash 구문에 아무런 도움이 되지 않습니다:

temp3 + " : " + temp2 >> sha512.md

이는 "문자열을 가져와서 temp3명령으로 실행하고 이를 + " : " + temp2인수로 전달한 후 출력을 파일에 추가 sha512.md"하는 것을 의미합니다. 다음은 스크립트의 작업 버전입니다.

#! /usr/bin/env bash
FILES="
blocklists/blocklist.txt
whitelists/whitelist.txt
"
main() {
    echo "sha512"
    func_sha512sum
    cat sha512.md
}

func_sha512sum() {
    for file in $FILES
    do
      printf '%s : %s\n' \
            "$(date)" \
            "$(sha512sum -- "$file")"  >> sha512.md
    done
}
main

개인적으로 저는 파일 이름을 하드코딩하는 것을 피하고 싶습니다. 이는 스크립팅을 실제로 제한하기 때문입니다. 인수에서 파일을 가져와 stdout으로 인쇄하십시오.

#! /usr/bin/env bash

for file in "$@"; do
  printf '%s : %s\n' \
        "$(date)" \
        "$(sha512sum -- "$file")"  
done 

그런 다음 다음과 같이 실행할 수 있습니다.

$ foo.sh whitelists/whitelist.txt blocklists/blocklist.txt 
Fri Apr 23 10:11:10 AM BST 2021 : a61788166e55f4fbac36f7c9b5a35b80d79eaee684e247caa1e3985a0b78a0edd2c04cacad017b077250c91ced64894d3ae17204df684e09020d7d2569414c5c  blocklists/blocklist.txt
Fri Apr 23 10:11:10 AM BST 2021 : 6b29fcb04c0c19abda792b6efb41f317d8a6af63daad74c0eb82ac7dee7be88d87242fb36b56c63581f109d8cb50969b519935d23b9c5223af1c69a4e3ac5ef5  whitelists/whitelist.txt

답변2

temp3귀하의 코드가 명령 으로 사용되는 것 같습니다 . 쉘 코드와 Python 코드를 혼합한 것 같습니다. 쉘은 와 연결되지 않습니다 +. 또한 지원할 수 있는 이름 유형을 엄격하게 제한하지 않고 파일 이름을 문자열 변수에 넣은 다음 해당 문자열에서 추출할 수 없습니다. 사물 목록에는 실제 배열 변수를 사용하는 것이 좋습니다.

files 에 대한 일반적인 출력 형식을 원하고 sha256sum각 파일 앞에 (같은 줄에) 출력이 붙는다고 가정해 보세요 date.

#!/bin/bash

files=(
    blocklists/blocklist.txt
    whitelists/whitelist.txt
)

now=$(date)

for filepath in "${files[@]}"; do
    printf '%s\n' "$now" |
    paste -d : - <( sha256sum -- "$filepath" )
done >sha256.md

이는 파일 배열을 사용하며(공백, 줄 바꿈 및 와일드카드가 포함된 파일 이름을 포함하여 가능한 모든 파일 이름 허용) paste첫 번째 열에 출력이 있고 다른 열에 출력이 있는 두 개의 열을 만드는 데 사용됩니다 date. sha256sum두 열은 로 구분됩니다 :.

스크립트의 명령줄에 지정된 모든 이름에서 실행되도록 이 스크립트를 변경하고 출력을 표준 출력에 쓰십시오.

#!/bin/bash

now=$(date)

for filepath do
    printf '%s\n' "$now" |
    paste -d : - <( sha256sum -- "$filepath" )
done

다음과 같이 사용할 수 있습니다.

$ ./myscript blocklists/blocklist.txt whitelists/whitelist.txt >sha256.md

또는 루프가 필요하지 않고 sha256sum주어진 모든 경로 이름을 사용하여 호출할 수 있습니다.

#!/bin/bash

sha256sum "$@" |
awk -v now="$(date)" -v OFS=: '{ print now, $0 }'

관련 정보