将变量中的内容附加到日志文件

Append content from variable to log file

我有一个脚本并试图将变量中的内容附加到 .log 文件。我在另一个 post(How can I append a variable text to last line of file via command line?) 上看到,您可以使用 echo "$(cat $FILE)$APPEND" > $FILE 来执行此操作。我试过这样做,它能够 运行 我的脚本没有错误,并通过终端给出我需要的答案,但它没有将它附加到我的日志文件中。任何人都可以给我任何指示吗?

#!/bin/bash
mdate=echo date
mcpu=echo $[100-$(vmstat 1 2 |tail -1|awk ‘{print }’)]%
mmem=free | grep Mem | awk ‘{print / * 100.0}’
sudo cat /dev/null > /home/daniel/systemstatus.log
echo “$(cat $systemstatus.log)$mdate” >> $systemstatus.log
echo “$(cat $systemstatus.log)$mcpu” >> $systemstatus.log
echo “$(cat $systemstatus.log)$mmem” >> $systemstatus.log

尝试在 systemstatus

之前删除 $

当您键入 $systemstatus 时,它表示一个名为 "systemstatus" 的变量,而不是系统状态文件。

您的代码需要进行多次修改,您不能按照您尝试的方式使用命令输出分配变量,您需要使用命令替换 (var=$(command)):

mdate=$(date)
mcpu=$(( 100 - $(vmstat 1 2 | tail -1| awk '{print }') ))
mmem=$(free | grep Mem | awk '{print / * 100.0}')

您的 post 包含对 shell 无效的引号。使用单引号 ' 或双引号 "(各有用途)。

但是日志记录部分比你想象的要简单

logfile=/home/daniel/systemstatus.log
echo "$mdate" >"$logfile"  # Overwrites the previous log file
echo "$mcpu"  >>"$logfile" # Appends to the log file
echo "$mmem"  >>"$logfile" # Appends to the log file

如果在变量中捕获命令输出的唯一原因是为了记录日志,您可以通过重定向到日志文件而不捕获输出来进一步简化。

date >"$logfile" # Overwrites the previous log file
echo $(( 100 - $(vmstat 1 2 | tail -1| awk '{print }') )) >>"$logfile"
free | grep Mem | awk '{print / * 100.0}' >>"$logfile"

你甚至可以把重定向放在第一位,根据你的口味,这可能会更干净:

>"$logfile"  date # Overwrites the previous log file
>>"$logfile" echo $(( 100 - $(vmstat 1 2 | tail -1| awk '{print }') ))
>>"$logfile" free | grep Mem | awk '{print / * 100.0}'

此答案假定您的命令确实有效(我没有测试过)。

以下应该有效:

#!/bin/bash
mdate=$(echo date)
mcpu=$(echo $[100-$(vmstat 1 2 |tail -1|awk '{print }')]%)
mmem=$(free | grep Mem | awk '{print / * 100.0}')
>/home/daniel/systemstatus.log
echo “$(cat $systemstatus.log)$mdate” >> systemstatus.log
echo “$(cat $systemstatus.log)$mcpu” >> systemstatus.log
echo “$(cat $systemstatus.log)$mmem” >> systemstatus.log

请注意,如果您想将命令的输出存储在 bash 中,您应该将命令四舍五入到 $() 或 `` 但是,现在已弃用重音符号。

此外,使用 cat /dev/null > 清空 Linux 中的文件基本上与仅使用 > 的结果相同

至于您遇到的问题,请注意在任何单词前附加 $ 基本上会使 script/command 查找具有此类名称的变量而不是文件名。

此致