日期:2014-05-16  浏览次数:20699 次

linux shell对空格处理之学习篇

前言

有没有人遇到过在linux shell下因为对空格没有处理好而造成实际结果与预期不符呢?

 

1. 我想输出的是"oo    mm",但是实际结果却是"oo mm",中间丢了三个空格字符,为什么?

sh-# echo oo    mm
oo mm

从现象上看像是shell内部的域分隔符是空格,

linux系统默认的域分隔符就是空格或tab或newline字符,

通过echo $IFS查看,果真如此。

此时解决方法大概有如下几种:

(1)因为IFS= 的关系,所以就必须要对空格字符进行转义,下面的命令就能达到我们的需求:

sh-# echo oo\ \ \ \ mm;

(2)另一种方法是暂时性的修改IFS,可以遗憾的是本人的实验没有取得想象的成功,

所以方法2可能需要以后弄明白了再补上来了。如果有知道的朋友,也请多多指教哈,

小弟在此先谢过了。

(3)第三种方法就是使用双引号了,如果你的字符串要作为一个整体的字符串来对待,

那使用双引号括起来是一种比较好的选择。

sh-# echo "oo    mm"

如果你的双引号里面要包含双引号字符,那也必须要用转义字符隔起来。

sh-# echo "\"\""

上面语句可以帮助你将双引号打印出来。

 

2. 原本以为export IFS=$'\n'这样的动作没能更改IFS的值,刚刚网上学习了一下,

原来是echo $IFS与echo "$IFS"这两个命令的输出是不一样的,所以才造成了一丝困惑。

但是关于这两种输出形式为什么结果会不一样,我还没搞清楚,这个只能后续有时间再看了。

 

3. 关于linux对空格处理的应用实例?

假设你的无线路由器的名称是"my router",

iwpriv wireless_interface set SSID=my router,可能会导致你无法连上这台无线路由器;

正确的写法应该是:iwpriv wirelss_interface set SSID="my router"。

所以你的应用程序要连接无线路由器,应该要:

s_cmd[100] = "iwpriv wireless_interface set SSID=\"my router\"";

system(s_cmd);

这里涉及到两个点:一个是如果有字符串作为一个整体部分处理,那请主动的用双引号将其括起来;

另一个是当你要用到双引号作为一个特定的字符时,那你需要对双引号进行转义,这样才会可用。

 

以上是个人的一点学习心得总结。

1楼boyxulin1986前天 11:05
自己必须顶自己