shell编程中一个空格引起的异常
最近使用shell编写一个备份和替换f服务器程序的脚本replace.sh,初衷是为了节约人力的重复机械的劳动。在脚本编写过程中,由于疏忽多打了一个空格,出现了一个不符合预期的情况。
1.先看一下出问题的replace.sh
清单1:replace.sh
#!/bin/sh
file="mv.sh" #日志清理脚本
bak="mv"
replace="scp"
hostPath="/data/kuyin_new/musicsearch/bin/logs"
#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)
hostList=(172.16.72.50)
for host in ${hostList[*]}
do
bakCmd= "ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak" #先备份目标机器上的脚本,这里=之后多打了一个空格
echo $bakCmd #这里先打印一下bakCmd命令,看一下
#bash -c "$bakCmd"
#replaceCmd="$replace $file ${host}:${hostPath}" #拷贝至目标机器
#finalCmd="${bakCmd} ; ${replaceCmd}"
#echo $replaceCmd
#echo $finalCmd
#bash -c "$finalCmd"
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
#!/bin/sh
file="mv.sh" #日志清理脚本
bak="mv"
replace="scp"
hostPath="/data/kuyin_new/musicsearch/bin/logs"
#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)
hostList=(172.16.72.50)
for host in ${hostList[*]}
do
bakCmd="ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak" ##先备份目标机器上的脚本,去除了多余的空格,此时第10行就是一个命令
echo $bakCmd
#bash -c "$bakCmd"
#replaceCmd="$replace $file ${host}:${hostPath}" #拷贝至目标机器
#finalCmd="${bakCmd} ; ${replaceCmd}"
#echo $replaceCmd
#echo $finalCmd
#bash -c "$finalCmd"
done
运行结果如下:

因此,在编写shell脚本时要格外注意空格。
shell编程中一个空格引起的异常的更多相关文章
- Shell编程中while与for的区别及用法详解【转】
在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用 ...
- shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法
shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...
- shell编程中的单/双 小括号, 中括号, 大括号
linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html 不分! sh ...
- shell编程中用户输入处理(shell 04)
shell编程中用户输入处理1.命令行参数2.脚本运行时获取输入 命令行参数 通过空格来进行分割的位置参数 :$+position $0,$1,$2 ....$0 :程序名$1,$2,$3 ... $ ...
- shell编程中星号(asterisk "*")的坑
今天分享一个有关shell编程中由通配符引起的问题. 1. 问题代码 cat test.logs 4567890 * ##*************************************## ...
- Shell编程中Shift的用法
Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shif ...
- Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||
https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...
- shell编程中的if语句
if语句在任何编程中都是必不可少.至关重要的分支语句,shell也是如此,只不过各种编程中的方式和格式有点不太一样 shell编程中的if语句基本格式如下: if [ X$1 = XA ];then ...
- [ SHELL编程 ] shell编程中数值计算方法实例
SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表 ...
随机推荐
- Replica Sets+Sharding方案之真枪实弹篇
话说在虚拟机中会报各种错误.在真实的环境中就不会那么痛苦了. 想了一下虚拟机中报错的原因有. 机器卡,处理的时间长就会抛出错误 还有虚拟机假设给的空间太小.也会报异常. 此处讲讲我的大致思路. 第一, ...
- 从编译器源代码中提取ARMv8的指令编码
2012年11月份的资料,之前ARMv8手冊还没公布,我想办法从编译器的binutils中提取出了全部ARMv8指令的二进制编码,之前不能随便发,如今相当于解禁了^_^. 问题1:提取ARMv8的指令 ...
- ci url 控制 查询 通过路由 控制返回 视图的结果
http://192.168.2.102/fastdatav/ChkUrl/daily/G8 http://192.168.2.102/fastdatav/ChkUrl/daily/ 放在 试图 控 ...
- android:模拟水波效果的自己定义View
Github地址:https://github.com/nuptboyzhb/WaterWaveView 欢迎Fork.欢迎Star 1.先看效果 watermark/2/text/aHR0cDovL ...
- SICP习题练习
练习1.6 new-if的三个参数会先被执行,这样就会无限循环下去 练习1.7 (define (sqrt-iter last-guess guess x) (if (good-enough? las ...
- Lein droid
最近尝试使用Clojure,发现有个Lein droid的项目可以方便的在android下使用Clojure. http://clojure-android.info/#get-started 尝试了 ...
- luogu 4429 染色
bjoi 2018 染色 推了个错误结论得了60分? 题目大意: 一个无重边和自环的无向图,并且对每个点分别给了一个大小为2的颜色集合,只能从这个集合中选一种颜色给这个点染色 求一个染色方案使得没有两 ...
- Codeforces Round #498 (Div. 3) 简要题解
[比赛链接] https://codeforces.com/contest/1006 [题解] Problem A. Adjacent Replacements [算法] 将序列中的所有 ...
- 【SDOI 2008】 递归数列
[题目链接] 点击打开链接 [算法] 矩阵乘法优化递推 由于本博客不支持数学公式,所以不能将矩阵画出来,请谅解! [代码] #include<bits/stdc++.h> using na ...
- mysql数据库中的十进位是什么意思?
一般在用小数的时候才有用,比如类型你设置了double,十进位你设为2,那么你可以放0.22的值,但是放0.222的值它会自动四舍五入为0.22,相当于小数位数吧