打印日期和 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

就我个人而言,我会避免对文件名进行硬编码,因为这确实限制了脚本。只需从参数中获取文件并打印到标准输出:

#! /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命令。它似乎将 shell 代码与 Python 代码混合在一起。 shell 不与 进行串联+。您也不能将文件名放入字符串变量中,然后从该字符串中提取它们,而不严格限制您可以支持的名称类型。最好对事物列表使用真正的数组变量。

假设您想要文件的普通输出格式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 }'

相关内容