为什么执行(False)if语句中的一部分代码



我写了一个小脚本:

  1. 使用矩阵打印机在纸上打印文件(由另一个应用程序生成(的内容
  2. 将同一行打印到备份文件中
  3. 删除原始文件

该脚本由cronjob每分钟运行一次,只要有文件要打印,它就可以正常工作。如果没有要打印的文件,它会在矩阵打印机和备份文件中打印一行空行。我不明白为什么会发生这种情况,因为我实现了一个if语句,该语句在执行print命令之前检查是否有文件要打印。只有当脚本由cron执行时才会发生这种行为,而不是当我使用./script.sh手动执行它时。这是什么原因?我该怎么解决?

我注意到,如果我在脚本中放置echo "hi"命令,它就会打印到矩阵打印机和备份文件中。当它后面没有>> something时,我预计它会打印到控制台上。这是怎么回事?

脚本:

#!/bin/bash
# Make sure the backup directory exists
if [ ! -d /home/user/backup_logprint ]
then
mkdir /home/user/backup_logprint
fi
# Print the records if there are any
date=`date +%Y-%m-%d`
filename='_logprint_backup'
printer_path="/dev/usb/lp0"
if [ `ls /tmp/ | grep logprint | wc -l` -gt 0 ]
then 
for f in `ls /tmp | grep logprint`
do
echo `cat /tmp/$f` >> "/home/user/backup_logprint/$date$filename"
echo `cat /tmp/$f` >> $printer_path
rm "/tmp/$f"
done
fi

不需要lsif语句。只需在for循环中使用适当的glob,如果没有匹配的文件,则不会输入循环。

#!/bin/bash
# Don't check first; just let mkdir decide if
# anything actually needs to be created.
d=/home/user/backup_logprint
mkdir -p "$d"
filename=$(date +"$d/%Y-%m-%d_logprint_backup")
printer_path="/dev/usb/lp0"
# Cause non-matching globs to expand to an empty
# sequence instead of being treated literally.
shopt -s nullglob
for f in /tmp/*logprint*; do
cat "$f" > "$printer_path" && mv "$f" "$d"
done

最新更新