![打印日期和 sha512 总和到文件?](https://linux22.com/image/190186/%E6%89%93%E5%8D%B0%E6%97%A5%E6%9C%9F%E5%92%8C%20sha512%20%E6%80%BB%E5%92%8C%E5%88%B0%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我想将日期和 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 }'