当定义函数时,
1. 里面尽量不要使用脚本位置参数$1,$2...,我调试的结果是,无法识别函数里面的这些符号;
2. 不要使用 awk 引用系统变量,也是不能识别。
#!/bin/sh
EXC1='--exclude bill/*'
EXC2='--exclude log/*'
EXC3='--exclude *core*'
SSHD='-e /app/oslinkd/bin/ssh'
ARG='-avzn'
RSYNC="rsync $ARG ${EXC1} ${EXC2} ${EXC3} ${SSHD}"
PWD=`pwd`
CHECKLIST="$PWD/checklist.txt"
TYPE=`awk '!/^#/{print $1}' $CHECKLIST|sort|uniq`
SRVTYPE=$1
if [ $# -lt 1 -o $# -gt 1 ];then
echo "Usage: $0 [all] | [logic-01|hall-01|...]"
exit
fi
FUN_RSYNC(){
IP=`grep -i "$SRVTYPE" serversdmz.txt|awk '!/^#|^$/{print $2}'`
RPATH=`grep -i "$SRVTYPE" $CHECKLIST|awk '{print $2}'`
LPATH=`grep -i "$SRVTYPE" $CHECKLIST|awk '{print $3}'`
echo "-----------/$SRVTYPE $IP/-------------"
$RSYNC $IP:${RPATH} $PWD/default/$LPATH
}
case $1 in
all)
for i in `echo $TYPE`
do
IP=`egrep -i "$i" serversdmz.txt|awk '!/^#|^$/{print $2}'`
RPATH=`awk '/'"$i"'/{print $2}' $CHECKLIST`
LPATH=`awk '/'"$i"'/{print $3}' $CHECKLIST`
echo "-----------/$i $IP/-------------"
$RSYNC $IP:${RPATH} $PWD/default/$LPATH
done ;;
act-01)
FUN_RSYNC ;;
ap-01)
FUN_RSYNC ;;
catalog-01)
FUN_RSYNC ;;
catalog-02)
FUN_RSYNC ;;
dbcache-01)
FUN_RSYNC ;;
dbcache-02)
FUN_RSYNC ;;
family-01)
FUN_RSYNC ;;
gm-01)
FUN_RSYNC ;;
hall-01)
FUN_RSYNC ;;
hall-02)
FUN_RSYNC ;;
logic-01)
FUN_RSYNC ;;
logic-02)
FUN_RSYNC ;;
logic-03)
FUN_RSYNC ;;
market-01)
FUN_RSYNC ;;
market-02)
FUN_RSYNC ;;
pay-01)
FUN_RSYNC ;;
router-01)
FUN_RSYNC ;;
state-01)
FUN_RSYNC ;;
syn-01)
FUN_RSYNC ;;
ui-01)
FUN_RSYNC ;;
*)
echo "Usage: $0 [all] | [logic-01|hall-01|...]"
exit;;
esac
#Script END
此脚本中的SRVTYPE变量我原来是没有的,都是直接用的$1;
RPATH,LPATH变量原来是这样写的:
RPATH=`awk '/'"$1"'/{print $2}' $CHECKLIST`
LPATH=`awk '/'"$1"'/{print $3}' $CHECKLIST`
不生效,改成如下写法,同样也不生效。
RPATH=`awk '/'"$SRVTYPE"'/{print $2}' $CHECKLIST`
LPATH=`awk '/'"$SRVTYPE"'/{print $3}' $CHECKLIST`
也就是说,在定义函数时awk引用系统变量的用法都无法识别了,但是在函数外部这样用是没有问题的。所以最好在函数内部不要这样使用。原因是函数本身有自身的位置参数,在函数内部使用位置参数是代表函数本身的位置参数。
阅读(1000) | 评论(0) | 转发(0) |