zoukankan      html  css  js  c++  java
  • shell编程中一个空格引起的异常

      最近使用shell编写一个备份和替换f服务器程序的脚本replace.sh,初衷是为了节约人力的重复机械的劳动。在脚本编写过程中,由于疏忽多打了一个空格,出现了一个不符合预期的情况。

    1.先看一下出问题的replace.sh

     清单1:replace.sh

     1 #!/bin/sh
     2 file="mv.sh"     #日志清理脚本
     3 bak="mv"
     4 replace="scp"
     5 hostPath="/data/kuyin_new/musicsearch/bin/logs"
     6 #hostList=(172.16.72.50 172.16.72.56 172.16.72.58 172.16.72.76 172.16.72.78 172.16.72.96 172.16.72.98)
     7 hostList=(172.16.72.50)
     8 for host in ${hostList[*]}
     9 do
    10     bakCmd= "ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak"    #先备份目标机器上的脚本,这里=之后多打了一个空格
    11     echo $bakCmd       #这里先打印一下bakCmd命令,看一下
    12     #bash -c "$bakCmd"
    13     #replaceCmd="$replace $file ${host}:${hostPath}"   #拷贝至目标机器
    14     #finalCmd="${bakCmd} ; ${replaceCmd}"
    15     #echo $replaceCmd
    16     #echo $finalCmd
    17     #bash -c "$finalCmd"
    18 done

    执行脚本,运行结果如下:

      多打了一个空格,之后bash replace.sh运行脚本,出现了不符合预期的情况:ssh 172.16.72.50 mv /data/kuyin_new/musicsearch/bin/logs/mv.sh /data/kuyin_new/musicsearch/bin/logs/mv.sh.bak(ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak经过变量替换后的结果) 命令竟然执行了!而我的初衷是用echo查看这个命令组合的是不是正确,这条命令并不会被执行。那么为什么会出现这种情况呢?

      为了找出问题,可以通过bash -x replace.sh运行脚本。“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。执行bash -x replace.sh,结果如下:

      

      可以看出,replace.sh中的第10行被拆成了2条命令(黄色框和红色框共2条命令),因此ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak才会被执行。下面去掉第10行多出的空格,看一下效果。

    2. 正常的replace.sh

      清单2:replace.sh

     1 #!/bin/sh
     2 file="mv.sh"     #日志清理脚本
     3 bak="mv"
     4 replace="scp"
     5 hostPath="/data/kuyin_new/musicsearch/bin/logs"
     6 #hostList=(172.16.72.50 172.16.72.56 172.16.72.58 172.16.72.76 172.16.72.78 172.16.72.96 172.16.72.98)
     7 hostList=(172.16.72.50)
     8 for host in ${hostList[*]}
     9 do
    10     bakCmd="ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak"    ##先备份目标机器上的脚本,去除了多余的空格,此时第10行就是一个命令
    11     echo $bakCmd
    12     #bash -c "$bakCmd"
    13     #replaceCmd="$replace $file ${host}:${hostPath}"   #拷贝至目标机器
    14     #finalCmd="${bakCmd} ; ${replaceCmd}"
    15     #echo $replaceCmd
    16     #echo $finalCmd
    17     #bash -c "$finalCmd"
    18 done

      运行结果如下:

      因此,在编写shell脚本时要格外注意空格。

      

  • 相关阅读:
    android 75 新闻列表页面
    android 74 下载文本
    android 73 下载图片
    android 72 确定取消对话框,单选对话框,多选对话框
    android 71 ArrayAdapter和SimpleAdapter
    android 70 使用ListView把数据显示至屏幕
    maven如何将本地jar安装到本地仓库
    Centos6.7搭建ISCSI存储服务器
    解决maven打包编译出现File encoding has not been set问题
    MySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码)
  • 原文地址:https://www.cnblogs.com/litaozijin/p/6903210.html
Copyright © 2011-2022 走看看