首页 > 代码库 > shell脚本中定义路径变量出现的BUG

shell脚本中定义路径变量出现的BUG

===========================================================================

if 语句中的定义路径变量 引发命令的PATH路径改变出现的bug 问题

  • 原脚本文件:inotify +rsync 实时共享

#!/bin/bash

PATH=/data/

IP=172.16.1.41

cd $PATH &&\ 切换到一个新的变量中了

/usr/bin/inotifywait -mrq --format ‘%w%f‘ -e create,moved_to,close_write,delete $PATH|while read line

do

  if [ -f $line ];then此时的rsync命令就已经不能使用了 (解决方法 绝对路径)/usr/bin/rsync

    rsync -az $line --delete rsync_backup@$IP::nfsbackup --password-file=/etc/rsync.password

  else

    cd $PATH &&\

    rsync -az ./ --delete rsync_backup@$IP::nfsbackup --password-file=/etc/rsync.piassword

  fi

done

===========================================================================

  • sh -x 的验证过程

[root@nfs01 scripts]# vim jiankong2.sh

#cd $PATH &&\

do

  if [ -f $line ];then

    echo 01 在此特别增加了显示内容方便定位到当前变量路径

    echo $PATH

    echo 03

    rsync -az $line --delete rsync_backup@$IP::nfsbackup --

password-file=/etc/rsync.password

  else

    echo 01

    echo $PATH

sh -x 查看过程

[root@nfs01 scripts]# sh -x  jiankong2.sh

+ PATH=/data/

+ IP=172.16.1.41

+ read line

+ /usr/bin/inotifywait -mrq --format %w%f -e create,moved_to

+ ‘[‘ -f /data/oldgirl ‘]‘

+ echo 01

01

+ echo /data/  PATH变量的路径转换为/data/ 所以命令会在此读取路径

/data/

+ echo 03

03

+ rsync -az /data/oldgirl --delete rsync_backup@172.16.1.41:

jiankong2.sh: line 13: rsync: command not found 结论:果真报错 命令找不到

+ read line

+ ‘[‘ -f /data/oldgirl ‘]‘

+ echo 01

01

+ echo /data/

/data/

+ echo 03

03

+ rsync -az /data/oldgirl --delete rsync_backup@172.16.1.41:

jiankong2.sh: line 13: rsync: command not found  同样的命令找不到

+ read line

===========================================================================

  • 解决方法一 定义变量要和PATH区分开 删除cd 到的变量路径

[root@nfs01 scripts]# cat  jiankong2.sh

#!/bin/bash

WEIZHI=/data/

IP=172.16.1.41

#cd $PATH &&\

/usr/bin/inotifywait -mrq --format ‘%w%f‘ -e create,moved_to,close_write,delete $WEIZHI|while read line

do

  if [ -f $line ];then

    rsync -az $line --delete rsync_backup@$IP::nfsbackup --password-file=/etc/rsync.password

  else

  #cd $PATH &&\

    rsync -az $WEIZHI --delete rsync_backup@$IP::nfsbackup --password-file=/etc/rsync.password

  fi

done

===========================================================================

  • 解决方法二

使用绝对路径可以跳出当前定义PATH环境

/usr/bin/rsync

===========================================================================

shell脚本中定义路径变量出现的BUG