날짜와 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 }'