日付と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
あり、他の列に出力を持つ2つの列を作成するために使用されますdate
。sha256sum
2つの列はで区切ります:
。
スクリプトのコマンドラインで指定されたすべての名前で実行するようにこのスクリプトを変更し、出力を標準出力に書き込みます。
#!/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 }'