EOF中空格和tab的问题
2016-04-11 11:31
239 查看
在一次偶然的事件中,我复制了一段EOF代码粘贴到脚本的另一位置,结果脚本就不运行了。后来通过排查发现原来是空格的问题。下面举例说明这个问题。
首先看如下脚本
# vim bb.sh
test
aa
0
脚本执行成功,一切正常。
现在我们做两个操作,比较下异同。
操作一:在vim中复制以下代码段粘贴到if的else上方。
完成后代码如下:
test
aa
0
# cat aa
6
一切执行正常,aa文件也被写入了EOF中的数值6
操作二:我们不用vim的yy命令去复制,而是改用xhell的鼠标复制功能,用鼠标选定这三行,再粘贴到上面的else上方。
粘贴后代码如下:
那么我们执行一下看看。
# ./bb.sh
test
aa
bb
0
得到的结果完全出乎意料,可以看到if命令已经失效了,echo "aa" echo "bb"都被执行了!
# cat aa
6
EOF
else
cat >aa <<-EOF
6
再看输入的aa文件,也不是想要的结果6!而是前后两个EOF之间的字段
那么这是为什么?
原因就在于空格和tab的问题!
在vim下我们用:set list来显示特殊字符
下图是操作一,即用yy命令复制时的代码图
下图是操作二,即用鼠标复制时的代码图
发现两者的不同没有?
操作一中yy复制的三行和原来的三行格式一样,EOF结尾符前面是^I,即tab字符。
操作二中鼠标复制的三行和原来的三行格式不一样,EOF结尾符前面是空格,不是tab!
结论:
重定向-EOF只会匹配前面以tab开头的EOF结束符,而不会匹配空格开头的EOF,操作二中,由于第一个EOF前面是空格,不会被识别为结束标志,而是被当作一个输入的字符来对待,当遇到第二个EOF时,由于前面是tab键,就被匹配为结束字符,所以也就出现了aa文件中的那一大串字符。
首先看如下脚本
# vim bb.sh
#!/bin/bash echo test if [ $? -eq 0 ];then echo "aa" else cat >aa <<-EOF 6 EOF echo "bb" fi echo $?# ./bb.sh
test
aa
0
脚本执行成功,一切正常。
现在我们做两个操作,比较下异同。
操作一:在vim中复制以下代码段粘贴到if的else上方。
cat >aa <<-EOF 6 EOF
完成后代码如下:
#!/bin/bash echo test if [ $? -eq 0 ];then echo "aa" cat >aa <<-EOF 6 EOF else cat >aa <<-EOF 6 EOF echo "bb" fi echo $?# ./bb.sh
test
aa
0
# cat aa
6
一切执行正常,aa文件也被写入了EOF中的数值6
操作二:我们不用vim的yy命令去复制,而是改用xhell的鼠标复制功能,用鼠标选定这三行,再粘贴到上面的else上方。
粘贴后代码如下:
#!/bin/bash echo test if [ $? -eq 0 ];then echo "aa" cat >aa <<-EOF 6 EOF else cat >aa <<-EOF 6 EOF echo "bb" fi echo $?看上去与yy复制的并没有什么不同。
那么我们执行一下看看。
# ./bb.sh
test
aa
bb
0
得到的结果完全出乎意料,可以看到if命令已经失效了,echo "aa" echo "bb"都被执行了!
# cat aa
6
EOF
else
cat >aa <<-EOF
6
再看输入的aa文件,也不是想要的结果6!而是前后两个EOF之间的字段
那么这是为什么?
原因就在于空格和tab的问题!
在vim下我们用:set list来显示特殊字符
下图是操作一,即用yy命令复制时的代码图
下图是操作二,即用鼠标复制时的代码图
发现两者的不同没有?
操作一中yy复制的三行和原来的三行格式一样,EOF结尾符前面是^I,即tab字符。
操作二中鼠标复制的三行和原来的三行格式不一样,EOF结尾符前面是空格,不是tab!
结论:
重定向-EOF只会匹配前面以tab开头的EOF结束符,而不会匹配空格开头的EOF,操作二中,由于第一个EOF前面是空格,不会被识别为结束标志,而是被当作一个输入的字符来对待,当遇到第二个EOF时,由于前面是tab键,就被匹配为结束字符,所以也就出现了aa文件中的那一大串字符。
相关文章推荐
- expand 与 unexpand 命令实例教程
- 鼠标hover时tab自动切换
- Powershell小技巧之去除多余的空格
- PowerShell命令中包含空格如何运行?
- 基于C语言EOF与getchar()的使用详解
- 让DOS下输入命令时也可以象Linux一样用Tab键进行命令自动填充
- 关于ASP eof与bof 区别分析
- javascript 定时自动切换的选项卡Tab
- javascript+css 新闻显示tab 选项卡效果
- JavaScript实现简单的tab选项卡切换
- js实现的简洁网页滑动tab菜单效果代码
- 使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
- javascript实现textarea中tab键的缩排处理方法
- 表现、结构、行为分离的选项卡效果
- Enter转换为Tab的小例子(兼容IE,Firefox)
- javascript实现tab响应式切换特效
- JS+CSS实现滑动切换tab菜单效果
- JS实现淡蓝色简洁竖向Tab点击切换效果
- jQuery实现TAB风格的全国省份城市滑动切换效果代码
- Python命令行添加Tab键自动补全功能