Linux 带grep的Bash条件不产生预期输出

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

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

对于
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