刚开始正式学习写脚本,就遇到了这样的蹊跷的问题。

一个文本example.txt,内容为:

一个sed脚本replace.sed: 

 

 

 

 看下文档:

然后执行sed -f  replace.sed example.txt,产生新文档exam01.txt;

 

cat exam01.txt,报错: 
 
 
 

高手或许知道哪里出错了,但我菜鸟想不出来,为什么呢?我明明是输出到exam01.txt,为什么呢,明明产生了exam01.txt,却cat不了?

不过在用tab补全的时候,也发现这个问题,exam01.txt后补上了\和空格:

 

(PS:在tab补全的情况下,直接回车是能执行的!当然这是后来发现的!)

于是在命令行下执行:sed -n 's/is/IS/gw exam01.txt' example.txt,成功执行:

可是2个同名文件,晕倒! 

 rm exam01.txt,一个成功删除,一个报错:

 

忽然想起生产中遇到过删除文件名带空格事情,于是执行rm "exam01.txt_",(这里的_是空格的意思 ),成功删除 :

 

(ps:直接tab补全,也可以删除的,补全了\和空格,直接回车ok,当然这是后来发现的)

 

到这里,意识到原因,肯定是空格捣的鬼,回查sed脚本:

 

发现脚本最后一行文件名和$之间确实有个空格。把exam01.txt后的空格删除,再执行,得到了自己想要的文件,cat exam01.txt,成功了!

 

再来看一个简单的shell脚本,re.sh:

这里重定向的文件名exam02.txt,exam03.txt后都有空格。

执行sh re.sh,产生exam02.txt,exam03.txt:

 

cat exam02.txt;成功查看:

cat exam03.txt,若不用tab补全的话,还是报错:

 

从这个shell脚本re.sh可以得出结论,sed的选项w重定向输出的文件名后不可以有空格(有空格也可以,只是会遇到麻烦)。

另:关于删除带空格的文档。后缀空格已经见识了,再来看看前缀空格文档:

 

 

 

可以看出tttt和wo没有左对齐,是因为他们前面有空格,在对他们执行命令操作执行的时候有报错。rm删除的时候要用双引号,文档名前加空格:
 
 
 
从这次问题中学到如下几点:

1.编写代码要养成良好的习惯,严格执行命令格式要求。

2.调试脚本,区分不同命令工具的差异。