我有一个脚本,并尝试将我的变量中的内容附加到.log文件。 我在另一篇文章中看到了(如何通过命令行将变量文本附加到文件的最后一行?),你可以使用echo"$(cat $ FILE)$ APPEND"> $ FILE来完成。 我尝试这样做,它能够无错误地运行我的脚本,并通过终端提供我需要的答案,但它不会将其附加到我的日志文件中。 任何人都可以给我任何指示?
#!/bin/bash
mdate=echo date
mcpu=echo $[100-$(vmstat 1 2 |tail -1|awk ‘{print $15}’)]%
mmem=free | grep Mem | awk ‘{print $3/$2 * 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
您的代码需要多次修改,您无法按照您尝试的方式使用命令输出分配变量,您需要使用命令替换(var=$(command)):
mdate=$(date)
mcpu=$(( 100 - $(vmstat 1 2 | tail -1| awk '{print $15}') ))
mmem=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
您的帖子包含对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 $15}') )) >>"$logfile"
free | grep Mem | awk '{print $3/$2 * 100.0}' >>"$logfile"
您甚至可以先重定向,根据您的喜好,它可能更清洁:
>"$logfile" date # Overwrites the previous log file
>>"$logfile" echo $(( 100 - $(vmstat 1 2 | tail -1| awk '{print $15}') ))
>>"$logfile" free | grep Mem | awk '{print $3/$2 * 100.0}'
这个答案假设您的命令实际上有效(我还没有测试过它们)。
非常感谢帮助伙伴,这样做了,解释也很棒!
以下应该有效:
#!/bin/bash
mdate=$(echo date)
mcpu=$(echo $[100-$(vmstat 1 2 |tail -1|awk '{print $15}')]%)
mmem=$(free | grep Mem | awk '{print $3/$2 * 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中清空文件基本上与使用>的结果基本相同
至于您遇到的问题,请注意在任何单词之前附加$基本上会使脚本/命令查找具有此类名称而不是文件名的变量。
问候
非常感谢!
尝试在systemstatus之前删除$
键入$systemstatus时,它表示名为"systemstatus"的变量,而不是systemstatus文件。
我想OP在当前目录中创建了一个文件.log
非常感谢!