日期:2014-05-16 浏览次数:20699 次
前言
有没有人遇到过在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);
这里涉及到两个点:一个是如果有字符串作为一个整体部分处理,那请主动的用双引号将其括起来;
另一个是当你要用到双引号作为一个特定的字符时,那你需要对双引号进行转义,这样才会可用。
以上是个人的一点学习心得总结。