使用getopts的Bash脚本 - 使用directory作为参数

时间:2016-04-23 01:58:16

标签: bash getopts

好的,所以我有一个脚本,我用它来解析具有不同列和值的各种日志文件。我一直在尝试使用getopts来允许我的脚本对一个目录中的文件进行解析,并将输出保存到另一个目录。基本上命令是(应该):

./script.sh -i /absolute/input/dir/ -o /absolute/output/dir/

目前,如果脚本位于包含日志文件的目录中,则

检查每个文件的前4个和后4个, 基于这些结果以某种方式解析文件, 将修改输出到指定的输出目录, 继续下一个文件,完成。

现在,如果我将脚本移到日志目录之外,我似乎无法让它对文件执行任何操作。

以下是我的代码示例:

#!/bin/bash
while getopts ":i:o:" opt; do
 case $opt in
  i)
   indir="$OPTARG"
   ;;
  o)
   outdir="$OPTARG"
   ;;
  \?)
   echo "invalid option"
   exit 0
  esac
done
shift $((OPTIND-1))

for f in *.log
do
  shopt -s nocasematch
  f4l4="${f:0:4}${f:${#f}-4}"
  if [[ "${f4l4}" = "this.log" ]]; then
    tr -cd "[:print:]\n" < $f | awk -F, 'BEGIN{OFS=FS}for(i=6,i<8;i++) $i=sprintf(%02X,$i)}1' > $outdir$f.csv
    sed -i '1icolumn1,column2,column3,column4,5,6,7,8,etc' $outdir$f.csv
  elif [[ "${f4l4}" = "that.log" ]]; then
    parse log file another way < $f | sed this and that > $outdir$f.csv1

  fi
done

所以我尝试在for语句($indir)中使用$indir$f instead of $f变量,但这并不起作用。如果我echo $f那么我可以看到目录中的所有文件,但脚本只是没有做任何事情。

简而言之,我想使用getopts指定一个输入目录,其中包含要编辑的文件,以及要保存的已编辑文件的输出目录。

思想?

1 个答案:

答案 0 :(得分:1)

我认为问题在于:

f4l4="${f:0:4}${f:${#f}-4}"

如果f包含路径,那么您将从整个路径中修剪,而不仅仅是文件名,因此永远不会这样:

[[ "${f4l4}" = "this.log" ]]

这是一个修复,从for f in *.log...开始:

for p in $indir*.log ## <-- change "for f in *.log" to this
do
  f=`basename "$p"` ## <-- new
  ...
  if [[ "${f4l4}" = "this.log" ]]; then
    tr -cd "[:print:]\n" < $p  ## <-- change ($f to $p)
    ...
  elif [[ "${f4l4}" = "that.log" ]]; then
    parse log file another way < $p ## <-- change ($f to $p)