学派吧-shell一个空格引起的异常-linux教程

学派吧-最近使用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 do10     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 $replaceCmd16     #echo $finalCmd17     #bash -c "$finalCmd"18 done

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

学派吧-shell一个空格引起的异常-linux教程

  多打了一个空格,之后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,结果如下:

  学派吧-shell一个空格引起的异常-linux教程

  可以看出,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 do10     bakCmd="ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak"    ##先备份目标机器上的脚本,去除了多余的空格,此时第10行就是一个命令11     echo $bakCmd12     #bash -c "$bakCmd"13     #replaceCmd="$replace $file ${host}:${hostPath}"   #拷贝至目标机器14     #finalCmd="${bakCmd} ; ${replaceCmd}"15     #echo $replaceCmd16     #echo $finalCmd17     #bash -c "$finalCmd"18 done

  运行结果如下:

学派吧-shell一个空格引起的异常-linux教程

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

  

以上就是shell一个空格引起的异常的详细内容,更多请关注学派吧其它相关文章!

主题测试文章,只做测试使用。发布者:云大使,转转请注明出处:https://www.xp8.net/server/2768.html

(0)
打赏 微信扫一扫 微信扫一扫
云大使的头像云大使
上一篇 2018年12月19日 下午9:49
下一篇 2018年12月19日 下午9:49

相关推荐

  • 学派吧-在Linux环境下g++编译GDAL动态库的操作方法-linux教程

    学派吧-下面小编就为大家带来一篇Linux环境g++编译GDAL动态库操作方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 一、编译步骤 解压下载的GDAL源程序,并在命令行中切换到解压目录。 tar -xzvf gdal-2.1.3.tar.gz cd gdal-2.1.3 GDAL可通过configure来实现一些自定义…

    2018年12月19日
    1.8K00
  • linux-centos7 安全优化运维教程-学派吧

    前言 centos 越来越普及了,通过一些面板很多小白都可以使用centos、但是安全方面却不行、今天学派吧整理下 centos安全相关的资料 发布出来、供小白学习、 设置 1 修改网卡为eth0 2 更新系统 3 给/etc/rc.local添加执行权限 4 添加用户hequan 5 禁用selinux 6 关闭防火墙安装iptables 7 修改主机名 …

    2018年10月8日
    3.2K00
  • 分享如何使用Yum在CentOS和RHEL上安装Lighttpd Web服务器教程

    Lighttpd是一种适合在生产环境中运行的高性能Web服务器。它是高度优化,安全且非常灵活的Web服务器;与其他Web服务器相比,LightTPD使用的内存和CPU非常低。其事件驱动架构针对大量并行连接进行了优化(保持活跃状态) Lighttpd为一些流行的Web 2.0站点提供了支持。它提供了高速IO基础设施,使它们能够在相同的硬件上扩展好几倍。这是在考…

    服务器运维 2019年5月7日
    3.7K00
  • 宝塔linux面板重启、重置等命令-学派吧

    现在有很多网友都在使用宝塔主机管理系统、对一些不懂linux操作的朋友来说,是一个很好的管理系统、但是有些朋友重启服务器以后,有可能造成一些服务无法重启。今天我们搜集下关于宝塔面板的命令集锦[v_notice]安装宝塔[/v_notice]Centos安装脚本 yum install -y wget && wget -O install.sh http://…

    服务器运维 2018年9月1日
    26.5K10
  • 阿里云服务器安装宝塔面板打不开

    有些网友反映。买了阿里云。安装上宝塔、却打不开。这是什么问题。 其实这个问题是阿里云的安全组在作怪。添加端口8888 到安全组里 尽量多添加一个 。8088-定义。 不要使用默认的端口、不安全。

    2018年8月18日
    4.8K00

发表回复

登录后才能评论
联系我们

联系我们

18838889666

在线咨询: QQ交谈

邮件:xinyun@88.com

工作时间:周一至周五,9:30-18:30,节假日休息

添加微信
添加微信
分享本页
返回顶部
---------官方优惠叠加渠道折扣:通过我们购买腾讯云/阿里云,价格更低,服务更优。更有专业配置指导与服务。微信同步:18838889666----