我运行自己的脚本,每晚将数据库转储到文件中 我想计算转储每个数据库所需的时间(以秒为单位),所以我试图编写一些函数来帮助我实现它,但我遇到了问题。
我不是bash中脚本编写的专家,所以如果我做错了,请说出来,理想情况下建议替代方案。
这是脚本:
#!/bin/bash
declare -i time_start
function get_timestamp {
declare -i time_curr=`date -j -f "%a %b %d %T %Z %Y" "\`date\`" "+%s"`
echo "get_timestamp:" $time_curr
return $time_curr
}
function timer_start {
get_timestamp
time_start=$?
echo "timer_start:" $time_start
}
function timer_stop {
get_timestamp
declare -i time_curr=$?
echo "timer_stop:" $time_curr
declare -i time_diff=$time_curr-$time_start
return $time_diff
}
timer_start
sleep 3
timer_stop
echo $?
代码应该是非常不言自明的。 echo
命令仅用于调试
我希望输出是这样的:
$ bash timer.sh
get_timestamp: 1285945972
timer_start: 1285945972
get_timestamp: 1285945975
timer_stop: 1285945975
3
现在不幸的是,情况并非如此。我得到的是:
$ bash timer.sh
get_timestamp: 1285945972
timer_start: 116
get_timestamp: 1285945975
timer_stop: 119
3
如您所见,本地var time_curr
从命令获取的值是有效的时间戳,但返回此值会使其更改为0到255之间的整数。
有人可以向我解释为什么会这样吗?
PS。这显然只是我的计时器测试脚本,没有任何其他逻辑。
更新 为了完全清楚,我希望这是一个非常类似于this one的bash脚本的一部分,我想测量每个循环周期。
除非我可以使用time
执行此操作,否则请提出解决方案。
答案 0 :(得分:21)
您无需执行所有操作。只需在shell中运行time <yourscript>
。
答案 1 :(得分:3)
$?
用于保存命令的退出状态,并且只能保存0到255之间的值。如果传递超出此范围的退出代码(例如,在调用{{1}的C程序中}),shell仍然会收到该范围内的值,并相应地设置exit(-1)
。
作为一种解决方法,您可以在bash函数中设置不同的值:
$?
答案 2 :(得分:0)
我相信你应该能够使用现有的“时间”功能。
更新问题后: 这是来自链接的脚本,它正在进行for循环。
# dump each database in turn
for db in $databases; do
echo $db
$MYSQLDUMP --force --opt --user=$USER --password=$PASSWORD
--databases $db > "$OUTPUTDIR/$db.bak"
done
您可以将循环的内部部分提取到一个新脚本中(称之为dump_one_db.sh
)
并在循环中执行此操作:
# dump each database in turn
for db in $databases; do
time dump_one_db.sh $db
done
确保将数据库名称的时间输出写入某个文件。
答案 3 :(得分:0)
这种情况正在发生,因为返回代码需要介于0到255之间。您不能返回任意数字。如果您继续拒绝使用内置time
函数并自行滚动,请更改函数以回显其标记并使用流程扩展($()
)来获取值。