日付と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あり、他の列に出力を持つ2つの列を作成するために使用されますdatesha256sum2つの列はで区切ります:

スクリプトのコマンドラインで指定されたすべての名前で実行するようにこのスクリプトを変更し、出力を標準出力に書き込みます。

#!/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 }'

関連情報