Linux 文件监视Bash脚本
我创建此脚本是为了检查特定文件是否存在于给定位置。但当我运行它时,它总是显示 失败-标志\u lms\u设备\u信息\u 20160628.txt不存在Linux 文件监视Bash脚本,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,我创建此脚本是为了检查特定文件是否存在于给定位置。但当我运行它时,它总是显示 失败-标志\u lms\u设备\u信息\u 20160628.txt不存在 失败-标记\ lms \每周\使用情况\信息\ 20160628不存在 但这两个文件都存在 PREFIX="/opt/data" REPORT="/tmp/report.txt" DATE=$( date -d "${dtd} -1 days" +'%Y%m%d' ) rm -f "$REPORT"
失败-标记\ lms \每周\使用情况\信息\ 20160628不存在 但这两个文件都存在
PREFIX="/opt/data"
REPORT="/tmp/report.txt"
DATE=$( date -d "${dtd} -1 days" +'%Y%m%d' )
rm -f "$REPORT"
FILENAME="Flag_lms_device_info_${DATE}.txt"
FULLFN="$PREFIX/$FILENAME"
if [ -f "$FULLFN" ]; then
echo "OK - $FILENAME exists" >> $REPORT
else
echo "Failed - $FILENAME do not exist" >> $REPORT
fi
FILENAME="Flag_lms_weekly_usage_info_${DATE}.txt"
FULLFN="$PREFIX/$FILENAME"
if [ -f "$FULLFN" ]; then
echo "OK - $FILENAME exists" >> $REPORT
else
echo "Failed - $FILENAME do not exist" >> $REPORT
fi
在这里,您可以检查名为find
的奇怪文件是否存在。。。使用反引号
if [ -f `find "$FULLFN" -type f -name "$FILENAME"` ];then
或者,在bash
中
if [ -f $(find "$FULLFN" -type f -name "$FILENAME") ];then
以字符串形式获取命令的输出
此外,您的find
调用看起来并不乐观。如果您需要在/opt/data/
下的某个位置查找名为Flag\u lms\u device等的文件,请使用find“$PREFIX”-键入f-name“$FILENAME”
。如果您确定/opt/data
是准确的位置,请使用
if [ -f "$FULLFN" ]
您不需要查找文件
在这里,您可以检查名为find
的奇怪文件是否存在。。。使用反引号
if [ -f `find "$FULLFN" -type f -name "$FILENAME"` ];then
或者,在bash
中
if [ -f $(find "$FULLFN" -type f -name "$FILENAME") ];then
以字符串形式获取命令的输出
此外,您的find
调用看起来并不乐观。如果您需要在/opt/data/
下的某个位置查找名为Flag\u lms\u device等的文件,请使用find“$PREFIX”-键入f-name“$FILENAME”
。如果您确定/opt/data
是准确的位置,请使用
if [ -f "$FULLFN" ]
您不需要查找文件。首先,您的问题中有奇怪的输出:您的第二行输出缺少.txt扩展名。这可能是个意外,但如果不是,那就值得调查
假设date命令工作正常(我不知道该命令),我会减少变量的使用。此外,我将使用-e测试操作符而不是-f,因为它更具包容性。(如果尚未将数据放入文件中,-f可能会返回错误,即使文件存在):
首先,您的问题中有奇怪的输出:第二行输出缺少.txt扩展名。这可能是个意外,但如果不是,那就值得调查
假设date命令工作正常(我不知道该命令),我会减少变量的使用。此外,我将使用-e测试操作符而不是-f,因为它更具包容性。(如果尚未将数据放入文件中,-f可能会返回错误,即使文件存在):
另一方面,所有caps变量名都位于POSIX定义的命名空间中,供对shell或操作系统有意义的变量使用——用户提供的变量名应至少具有一个小写字符,以避免冲突。请参见第4段,记住环境变量和shell变量共享一个名称空间(这意味着即使您没有显式地命令shell导出它,使用与环境变量重叠的名称设置shell变量也会覆盖后者),所有caps变量名都位于POSIX定义的命名空间中,供对shell或操作系统有意义的变量使用——用户提供的变量名应至少具有一个小写字符,以避免冲突。请参见第4段,记住环境变量和shell变量共享一个名称空间(这意味着即使您没有显式地命令shell导出它,使用与环境变量重叠的名称设置shell变量也会覆盖后者)。OP是否编辑了问题以删除此答案所指的代码?顺便说一句,$(…)
不是巴什主义;它在1992年发布的POSIX sh标准中有规定;因此,只有20世纪70年代伯恩(Bourne)的贝壳衍生物才需要回勾。好吧,在过去几十年中,唯一一家能够在操作系统中包含POSIX前shell的供应商是Sun,甚至他们最终也清理了这一点。是的,最初的问题是以双引号作为条件的find
命令。感谢您关于backticks的注释,可能是我上次阅读bash手册的这一部分时,它是一些老式版本,就像古代Solaris的版本一样。>_nod,听起来不错——Sun可能是你坚持时间最长的公司,安装了一个原始的Bourne shell,名为/bin/sh
,并在/usr/xpg4/bin
或类似的地方安装了一个POSIX sh实例。Fun,Fun.BTW,即使与反勾号或$()
组合使用,如果文件名有空格,引号仍然是避免字符串拆分的必要条件;例如,[-f“$(查找“$FULLFN”-键入f-name“$FILENAME”)”]
。另外,如果文件位于使用mkdir--'-a-z nonempty-a'
或类似恶意代码(在test
语法的上下文中)创建的目录中,则会出现这种行为。OP是否编辑问题以删除此答案所指的代码?顺便说一句,$(…)
不是巴什主义;它在1992年发布的POSIX sh标准中有规定;因此,只有20世纪70年代伯恩(Bourne)的贝壳衍生物才需要回勾。好吧,在过去几十年中,唯一一家能够在操作系统中包含POSIX前shell的供应商是Sun,甚至他们最终也清理了这一点。是的,最初的问题是以双引号作为条件的find
命令。感谢您关于backticks的注释,可能是我上次阅读bash手册的这一部分时,它是一些老式版本,就像古代Solaris的版本一样。>_nod,听起来不错——Sun可能是你坚持时间最长的公司,安装了一个原始的Bourne shell,名为/bin/sh
,并在/usr/xpg4/bin
或类似的地方安装了一个POSIX sh实例。Fun,Fun.BTW,即使与反勾号或$()
组合使用,如果文件名有空格,引号仍然是避免字符串拆分的必要条件;例如,[-f“$(查找“$FULLFN”-键入f-name“$FILENAME”)”]
。behav的额外积分