包含2个函数的BASH脚本中的模糊重定向,带有3个参数

时间:2015-02-06 09:45:14

标签: bash shell

我在bash脚本中发现了一个错误,我不知道如何修复它。

我有一个主脚本,在某个时刻我正在调用另一个脚本。

另一个time_diff.sh脚本由2个函数组成,它们看起来像这样:

#!/bin/bash
function timeDiff() {
    local time1="$(head -n 1 "$1")"
    local time2="$(head -n 1 "$2")"
    pc=$(( $time2 - $time1 ))
    timediff=${pc#-}

    pc=$(perl $BVTDIR/engine/math.pl $pc $time1)
    pc=${pc#-}

    echo "Prozentdiffertenz = "$pc"%"
    echo "Laufzeitdiffertenz = "$timediff" milisekunden"

    if (( "$timediff" < "$MAX_TIME_DIFF")) && (( "$pc" < "$MAX_PERC_DIFF" )); then

# the script is doing nothing, just echoing that everything is fine

     elif (( "$timediff" > "$MAX_TIME_DIFF")) && (( "$pc" < "$MAX_PERC_DIFF" )); then

# the script is doing nothing, just echoing that everything is fine

     elif (( "$timediff" < "$MAX_TIME_DIFF")) && (( "$pc" > "$MAX_PERC_DIFF" )); then

# the script is doing nothing, just echoing that everything is fine

     elif (( "$timediff" > "$MAX_TIME_DIFF")) && (( "$pc" > "$MAX_PERC_DIFF" )); then

# the script is runing a diff and saving the output.

          diff $1 $2 >> $3
    fi
}

function recuDiff {
  find $1 -maxdepth 1 -mindepth 1 -type f -name \*.TIME.TXT -printf '%P\n' |
  while read each
  do
    if [ -e $2/"$each" ]
    then
      timeDiff {$1,$2}/"$each"
    fi
  done
}

recuDiff $1 $2

从主脚本调用此脚本,如下所示:

/bin/bash time_diff.sh $CURRENT_BUILD_DIR $PREVIOUS_BUILD_DIR $DIFF_DIR/DIFF_RUNTIMES.TXT

直到timeDiff()函数转到if-elif语句的部分,其中脚本什么都不做,打印出一切都很好 - 一切都很好。

今天我发现当if-elif语句进入最后一节时,它应该在文件上运行diff并将其保存到文件中,我得到:

time_diff.sh: line 34: $3: ambiguous redirect

第34行:

diff $1 $2 >> $3

永远不会创建该文件。

可能有什么不对?在运行touch DIFF_TIME.TXT脚本之前我应该​​time_diff.sh吗?

还有一件事 - 很难重现这个错误,整个Jenkins工作需要一个小时才能运行,我绝对不能保证这个脚本测试的东西会比它应该运行的时间更长,所以我还没有尝试任何解决方案。

2 个答案:

答案 0 :(得分:3)

似乎问题只是$3未定义。

观察:

echo foo >> "$3"
bash: $3: ambiguous redirect

请注意,位置参数($1 ... $9)不会被共享或继承。每个shell函数都有自己的一组位置参数。

您使用三个参数调用了脚本。但是你只用两个参数调用了这个函数。这就是函数内部未定义$3的原因。

观察:

$ cat foo.sh 
echo "$1" "$2" "$3"
func() {
  echo "$1" "$2" "$3"
}
func "$1" "$2"

$ bash foo.sh a b c
a b c
a b

同样作为一般规则:在所有变量引用周围加上引号。

答案 1 :(得分:1)

在shell函数中,$1$2等引用传递给函数的参数,而不是传递给脚本的参数。在你的情况下,你正在打电话

timeDiff {$1,$2}/"$each"

将两个参数传递给timeDiff(在参数中可能包含空格的情况之外 - 您可能需要重新考虑一些引用位),但timeDiff()指的是{{1}这将是未定义的。