4)变量传播
【脚本内容】:
func(){
for((i=0;i<$RETRY_TIMES;i++))
do
NOTICE “delBlacklist”
done
}
for (( i=0; i<pggroup_size; i++))
do
func()
done
【问题】:“i”的值自增之后会传递到外层调用脚本,导致外层调用脚本的循环跳过或死循环
【解决】避免使用i,j,k等常见的循环控制变量,使用自定义的变量名,如retry_count等
在shell函数中定义的变量加上local关键字
5)命令连接
问题一:
【脚本内容】:
cd to_del; rm -rf *
【问题】:如果cd 目录失败,rm -rf * 会错误地删除当前目录下的所有文件
【解决】使用 && 连接 cd失败将不会继续执行后面的命令
问题二:
【脚本内容】:
for data in ${datalist{@}}
do
runRemoteCmd ${host} “cd ${data_path}.new && [[ -f ${data_flag} ]]” || suc=0 && break
done
【问题】:这里的 || && 是同一个优先级
那么就是说 && 后面的语句 break无论什么情况下都不可能被执行到
【解决】拆成两条语句,单独判断suc
6)文件泄露
【脚本内容】:
local status=$( mySsh ${remote_host} “{ ${command%%;}; }&>/tmp/$$ && echo 0 || echo 1″ )
【问题】:上述代码将远程执行命令行的输出结果导入到一个以pid命名的临时文件中,在脚本关闭的时候没有清除,每一次执行将创建一个新文件,很可能导致文件泄露问题。
【解决】注意清理脚本生成的临时文件