Bash脚本 - 不会完全执行

时间:2014-08-11 20:41:53

标签: bash shell grep

我正在编写一个脚本,它将接收3个输出,然后搜索预定义路径中的所有文件。但是,我的grep命令似乎打破了错误代码123的脚本。我一直盯着它看似错误,所以我希望有人可以指出我的错误。这是代码:

#! /bin/bash -e

#Check if path exists
if [ -z $ARCHIVE ]; then
  echo "ARCHIVE NOT SET, PLEASE SET TO PROCEED."
  echo "EXITING...."
  exit 1
elif [ $# -ne 3 ]; then
  echo "Illegal number of arguments"
  echo "Please enter the date in yyyy mm dd"
  echo "EXITING..."
  exit 1
fi

filename=output.txt

#Simple signal handler 
signal_handler()
{
  echo ""
  echo "Process killed or interrupted"
  echo "Cleaning up files..."
  rm -f out
  echo "Finsihed"
  exit 1
}

trap 'signal_handler' KILL
trap 'signal_handler' TERM
trap 'signal_handler' INT

echo "line 32"
echo $1 $2 $3

#Search for the TimeStamp field and replace the / and : characters
find $ARCHIVE | xargs grep -l "TimeStamp: $2/$3/$1"

echo "line 35"
fileSize=`wc -c out.txt | cut -f 1 -d ' '`

echo $fileSize

if [ $fileSize -ge 1 ]; then
   echo "no"
   xargs -n1 basename < $filename
else
   echo "NO FILES EXIST"
fi

我添加了回声来知道它在哪里破碎。我的程序打印出第32行和args但从不打35行。当我检查退出代码时,我得到123.

谢谢!

注意:

ARCHIVE设置为测试目录,即/home/'uname'/testDir

$ 1 $ 2 $ 3 == yyyy mm dd(即日期)

在testDir中有N个目录。在这些目录中,有包含数据的数据文件以及时间标记。时间标记的格式如下:TimeStamp: 02/02/2004 at 20:38:01

脚本目标是查找具有您要搜索的日期标记的所有文件。

2 个答案:

答案 0 :(得分:3)

这是一个更简单的测试用例,可以演示您的问题:

#!/bin/bash -e
echo "This prints"
true | xargs false
echo "This does not"

该代码段以代码123退出。

如果任何命令失败,问题是xargs退出代码123。当xargs以非零状态退出时,-e会导致脚本退出。

最快的解决方法是使用|| true有效忽略xargs&#39;状态:

#!/bin/bash -e
echo "This prints"
true | xargs false    || true
echo "This now prints too"

更好的解决方法是不依赖-e,因为此选项具有误导性和不可预测性。

答案 1 :(得分:1)

xargs返回非零代码时,

123会生成错误代码grep。由于您正在使用-e#!/bin/bash -e),bash会在其中一个命令返回非零退出代码时退出脚本。不使用-e将允许您的代码继续。只是在那部分禁用它也可以是一个解决方案:

set +e  ## Disable
find "$ARCHIVE" | xargs grep -l "TimeStamp: $2/$1/$3"  ## If one of the files doesn't match the pattern, `grep` would return a nonzero code.
set -e  ## Enable again.

考虑将变量放在引号周围以防止分词,例如"$ARCHIVE"

如果您的某个文件与某个文件相关,则可能还需要{p> -d '\n' filename包含空格。

find "$ARCHIVE" | xargs -d '\n' grep -l "TimeStamp: $2/$1/$3"