Linux 带grep的Bash条件不产生预期输出
projectsForArchive=/opt/tibco/run/tibbpma/log、/opt/tibco/run/tibbpmb/log、/opt/tibco/run/tibbpmd/log archiveScriptLogsDir=/opt/tibco/scripts/LogsArchival/ArchiveLogs backupScriptLogsDir=/opt/tibco/scripts/LogsArchival/BackupLogs 目录=$(echo$projectsForArchive | tr“,“\n”) d=$(ls/opt/tibco/run/| grep tibbpmd) echo$d 对于Linux 带grep的Bash条件不产生预期输出,linux,bash,shell,Linux,Bash,Shell,projectsForArchive=/opt/tibco/run/tibbpma/log、/opt/tibco/run/tibbpmb/log、/opt/tibco/run/tibbpmd/log archiveScriptLogsDir=/opt/tibco/scripts/LogsArchival/ArchiveLogs backupScriptLogsDir=/opt/tibco/scripts/LogsArchival/BackupLogs 目录=$(echo$projectsForA
find$dir-maxdepth 1-iname“*.log.*”
做
g=${i}
如果[$(ls/opt/tibco/run/| grep tibbpma)=“tibbpma”];然后
elif[$(ls/opt/tibco/run/| grep tibbpmd)=“tibbpmd”];然后
否则
fi
完成
对于find$dir-maxdepth 1-iname“*.log.*”
你要回显$i吗
mv$i$archiveScriptLogsDir
完成
输出在下面,这是不正确的
a、 log.1.tibbpma.xxxxx
a、 log.2.tibbpma.xxxxx
d、 log.1.tibbpma.xxxxx
d、 log.2.tibbpma.xxxxx
和下面的正确输出
a、 log.1.tibbpma.xxxxx
a、 log.2.tibbpma.xxxxx
d、 log.1.tibbpmd.xxxxx
d、 log.2.tibbpmd.xxxxx
请帮助根据注释中给出的询问者的
ls/opt/tibco/run/
输出,它总是包括“tibbpma”,然后是第一个if
语句中的条件
mv "$i" "${g}_`hostname`_`date +%Y-%m-%d-%H-%M-%s`"
也永远是真的。这就是为什么这个脚本的输出只包含“tibbpma”的原因。有很多理由这样做,这里也不需要它
作为记录,与在backticks中运行grep
命令并比较输出相比,只需使用grep-q所需的grep-q
只是告诉您正则表达式是否匹配,没有输出,也没有奇特的语法
此外,对于记录,除非您特别要求shell对值执行分词(您几乎从未这样做),否则您应该始终双引号引用变量插值
最后,注意一致地缩进
if [ $(ls /opt/tibco/run/ | grep tibbpma ) = "tibbpma" ];then
我很想将第二个循环移到第一个循环中,但我不确定是否存在由于某种原因而不起作用的情况。脚本运行时是否希望出现新文件,或者什么?您可以使用elif
而不是else if
来让代码更干净一些。运行此脚本时ls/opt/tibco/run/
的输出是什么?输出:b.log.1_tibbpma_c0040229.itcs.hp.com_2014-02-28-06-28-1393568931 d.log.1_tibbpma_c0040229.itcs.hp.com_2014-02-28-06-13935681;应该给b.log.1_tibbpma_c0040229.itcs.hp.com_2014-02-28-06-28-1393568931 d.log.1_tibbpmd_c0040229.itcs.hp.com_2014-02-28-06-28-1393568931@user3311501这就是你从ls/opt/tibco/run/
中得到的?+1个好球!OP:请解释在什么情况下你会“期待”当tibbpma
存在时,一个文件将接收tibbpmd
处理。我的源文件cat config.cfg archivescriptslogsdir=/opt/tibco/scripts/LogsArchival/ArchiveLogs backupscriptslogsdir=/opt/tibco/scripts/LogsArchival/BackupLogs#BW---------------------------------------------------------------projectsForArchive=/opt/tibco/run/tibbpma/log、/opt/tibco/run/tibbpmb/log、/opt/tibco/run/tibbpmd/log[tibco@c0040229日志]$pwd/opt/tibco/run/tibbpmd/log[tibco@c0040229日志]$ls d.log.1 d.log.2每个脚本的输出应该是d.log.1.tibbpmd.****d.log.2.tibbpmd.****但是根据您的脚本,输出只提供d.log.1_tibbpma_c040229.itcs.hp.com_2014-02-28-07-44-1393573464,具有相同的tibbpma问题,请向我们解释您原始脚本中的逻辑错误在哪里?在什么情况下,tibbpma
的存在不应导致文件移动到tibbpma
?或者换句话说,即使存在tibbpma
,我们如何知道哪些文件应该转到tibbpmd
呢?最好是用附加信息更新问题,而不是在注释中删除格式错误的庞然大物。问题在于如果[$(ls/opt/tibco/run/| grep tibbpma)=“tibbpma”];然后g=${i}mv“$i”“${g}{u tibbpma\hostname
\date+%Y-%m-%d-%H-%m-%s
”它有三个dir-tibbpma-tibbpmd-tibbpmb,但输出是伴随着tibbpma而来的,因为它不寻找其他dir。
mv "$i" "${g}_$d_`hostname`_`date +%Y-%m-%d-%H-%M-%s`"
mv "$i" "${g}_`hostname`_`date +%Y-%m-%d-%H-%M-%s`"
if [ $(ls /opt/tibco/run/ | grep tibbpma ) = "tibbpma" ];then
source /home/tibco/script/config.cfg
dir=$(echo "$projectsForArchive" | tr "," "\n")
for i in `find $dir -maxdepth 1 -iname "*.log.*" `
do
if [ -e /opt/tibco/run/tibbpma ];then
dest="${g}_tibbpma_`hostname`_`date +%Y-%m-%d-%H-%M-%s`"
elif [ -e /opt/tibco/run/tibbpmd ];then
dest="${g}_tibbpmd_`hostname`_`date +%Y-%m-%d-%H-%M-%s`"
else
dest="${g}_`hostname`_`date +%Y-%m-%d-%H-%M-%s`"
fi
g=${i}
mv "$i" "$dest"
done
for i in `find $dir -maxdepth 1 -iname "*.log.*" `
do
echo "$i"
mv "$i" "$archiveScriptLogsDir"
done