学派吧-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
学派吧-iptables基本概念和原理 -linux教程
下一篇 2018年12月19日 下午9:49

相关推荐

  • 学派吧-详解win2008 IP安全策略下配置一个IP段的写法-windows教程

    这篇文章主要介绍了win2008 IP安全策略下配置一个IP段的写法,需要的朋友可以参考下 可以指定单个 IP 地址或者 IPv4 或 IPv6 地址的子网。若要指定子网,请使用与下面类似的语法输入 IP 地址: 192.168.1.0/24 正斜杠 (/) 后面的数字表示子网掩码中的位数。可能为 32 位。在本示例中,24 表示前三个八进制数是子网地址,最…

    服务器运维 2018年12月10日
    3.2K00
  • OneinStack自动部署Let’s Encrypt证书 | Linux教程

    Let’s Encrypt是一个由电子前哨基金会、Mozilla基金会、Akamai、密歇根大学、思科联合发起的一个项目。它旨在为站长提供一个免费的、完全自动化的证书申请过程,从而让整个互联网都能享受到HTTPS加密。Let’s Encrypt的证书申请过程非常简单、安全、快速、自动化并且免费。Let’s Encrypt是一个中间CA,它的CA证…

    服务器运维 2018年11月21日
    2.8K00
  • 阿里云腾讯云安装管理面板centos宝塔面板安装教程

    2分钟装好面板,一键管理服务器Linux版请确保纯净系统安装(支持CentOS、Ubuntu、Debian、Fedora、Deepin),Web端管理,QQ群及论坛技术支持一键LAMP/LNMP、创建网站FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP多版本共存及切换,一键开启Tomcat环境 Linux面板安装脚本 系统兼容性排序: Debia…

    2018年7月12日
    9.3K00
  • linux中关于echo命令的用法实例教程-学派吧

    linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法,下面这篇文章主要给大家介绍了关于linux中echo命令用法的相关资料,需要的朋友可以参考学习。 前言 对于初学者来说,掌握一些基本命令的常用用法是必须的。本文列举了echo命令的几个常用用法并加以实例说明,以作回顾、参…

    2019年1月1日
    2.0K00
  • Win2008 R2 WEB服务器安全设置指南之如何修改3389端口与更新补丁的具体教程-win教程-学派吧

    这篇文章主要介绍了Win2008 R2 WEB 服务器安全设置指南之修改3389端口与更新补丁,需要的朋友可以参考下 3389端口是指windows系统中的远程桌面端口,可以使用它本管理远程计算机,就像操作本地的电脑一样,但是也容易被一些黑客利用,所以对于这个端口我必须要修改,且必须在安装完系统后就马上修改它。 随着云主机的普及和微软的大力更新,用windo…

    服务器运维 2018年12月2日
    4.4K00

发表回复

登录后才能评论
联系我们

联系我们

18838889666

在线咨询: QQ交谈

邮件:xinyun@88.com

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

添加微信
添加微信
分享本页
返回顶部