我在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工作需要一个小时才能运行,我绝对不能保证这个脚本测试的东西会比它应该运行的时间更长,所以我还没有尝试任何解决方案。
答案 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}这将是未定义的。