我想编写一个脚本,创建一个文件,该文件将主机名和日期存储在 YEARMONTHDAYHOURMINSEC 中,并打印系统中的所有环境变量,并删除目录中以前创建的所有文件(如果有),否则创建一个新文件。
因此,脚本应该搜索目录并删除该模式中的前一个文件,但不应删除其他文件。
#!/bin/bash
time=$(date +"%Y%m%d%H%M%S")
echo $(hostname) >>env.$time.txt
echo date:$time >>env.$time.txt
echo $(env)>>env.$time.txt
cat env.$time.txt
答案1
对现有脚本的一个简单修复是:
#!/bin/bash
# set location of backup such as `/var/log`
envDir=/path/to/dir
mkdir -p $envDir/junk
mv $envDir/env.*.txt $envDir/junk 2> /dev/null
time=$(date +"%Y%m%d%H%M%S")
echo $(hostname) >> $envDir/env.$time.txt
echo date:$time >> $envDir/env.$time.txt
echo $(env)>>$envDir/env.$time.txt
cat $envDir/env.$time.txt
rm $envDir/junk/*
请注意,有些事情可以改进,例如您的echo $(env)
,这会产生实际上无法使用的数据。相反,您应该这样做,因为env
它将被行分隔,并且易于导入。
文件名也可以提前定义,以简化设置等代码并使其更易于维护。
这是一个稍微改进的版本,带有附加注释:
#!/bin/bash
# set location of backup such as `/var/log`
# !!! Update this!
envDir=/path/to/dir
# set backup time
time=$(date +"%Y%m%d%H%M%S")
# set full file name for the backup
envFile=$envDir/env.$time.txt
# make temporary directory and ignore if it already exists
mkdir -p $envDir/junk
# move existing environment backup files to junk until we have our new output
mv $envDir/env.*.txt $envDir/junk 2> /dev/null
hostname >> $envFile
echo date:$time >> $envFile
env >> $envFile
cat $envFile
# remove the backup(s)
rm $envDir/junk/*
答案2
我已经测试过这个脚本并且它有效。该脚本创建一个新文件并删除用户主目录中的旧文件(如果存在)。
#!/bin/bash
DATETIME=$(date +"%Y%m%d%H%M%S")
rm ~/env.*.txt
echo "$(hostname)
date:$DATETIME
$(env)" | tee ~/env.$DATETIME.txt
第一的,更改date
为DATETIME
因为date
似乎更有可能已被定义。
下一个, rm ~/env.*.txt
使用 glob 作为通配符删除用户 $HOME 目录或 ~/ 中的任何文件,以便仅匹配文件名的静态或固定部分。
如果使用该脚本创建的任何输出文件应该对此进行处理,并且应该从主目录中删除。
如果文件不存在,用户应该在终端中收到一条输出错误消息,表明该文件不存在。可以忽略此消息,并且在脚本运行的任何后续时间中不应存在此消息。
另外,我使用T恤tee
而不是>>
出于习惯,因为T恤通常不会出现任何问题。
最后echo
在这里不需要使用多次。我在第一行使用了开放式双引号,包括要写入文件的接下来两行,并在最后一行以封闭式双引号结束,然后通过管道将输出tee
写入文件。
使用时tee
,写入文件的内容将在终端中打印,因此cat
显得多余。
此外,您可以使用以下-a
标志将输出作为新行附加到任何现有文件的末尾:tee
tee -a