Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1689438
  • 博文数量: 186
  • 博客积分: 3044
  • 博客等级: 中校
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-25 15:04
文章分类

全部博文(186)

文章存档

2024年(2)

2022年(4)

2021年(3)

2020年(1)

2019年(5)

2018年(13)

2017年(6)

2016年(10)

2015年(11)

2014年(11)

2013年(13)

2012年(23)

2011年(25)

2010年(2)

2008年(1)

2007年(5)

2006年(51)

分类: LINUX

2012-07-19 14:21:02

这两天被一个问题 搞的快疯了
使用脚本读取一个配置文件,配置文件是windows下读的utf-8格式
脚本如下:


点击(此处)折叠或打开

  1. mypath=skytest.properties
  2. if [ -f $mypath ];then
  3.          sip=`sed -n '/redis.host/p' $mypath|awk -F "=" '{print $2}'`
  4.          #sip=`echo $sip":hello" `
  5.          sport=`sed -n '/redis.port/p' $mypath |awk -F "=" '{print $2}'`
  6.         #sip="127.0.0.1"
  7.      if [ "$sip" = "127.0.0.1" ];then
  8.             echo "相同"
  9.             fillspace $sip 20
  10.             sip="$mystr"
  11.          else
  12.      echo "sip is:$sip"
  13.      echo "字符串:127.0.0.1"
  14.      echo "不一样"
  15.      fi
  16.    else
  17.      sip="不存在$filename"
  18.      sport=""
  19. fi
其中skytest.properties的内容如下:
redis.host=127.0.0.1
redis.port=6379

脚本执行结果一直是:
#>sh skytest.sh
sip is:127.0.0.1
字符串:127.0.0.1
不一样
#>

肉眼看上去变量sip值也是127.0.0.1呀,怎么会两个不一样呀
再试验发现如果对$sip进行操作时,也会出现很多问题
例如:
 #>echo $sip"add"
本意是出现这样的结果:“127.0.0.1add”
但结果却是:“add.0.0.1”
见鬼不!

反复的测试结果都差不多,感觉跟文件的编码格式有关,但是在windows下查看是utf-8格式的
在Linux用vim打开 skytest.properties后再用:set fileencoding也显示是utf-8 
晕呀,晕呀

网上找结果,但不知道如何提问或是查找相关的关题。
安装了enca后执行:enca skytest.properties
Universal transformation format 8 bits; UTF-8
  CRLF line terminators
问题的原因终于出现了:  CRLF line terminators
回车换行呀,sed无法正确处理

(补充:用file命令也可以查看文件格式
 file skytest.properties 
skytest.properties: UTF-8 Unicode text, with CRLF line terminators


找到原因,再找解决方法,网上方法很多,我的解决方案就是使用sed把 CRLF替换掉
sed  's/.$//g' skytest.properties

正确的脚本只要把其中的:
sip=`sed -'/redis.host/p' $mypath|awk -"=" '{print $2}'`
修改为:
sip=`sed 's/.$//g'$mypath |sed -'/redis.host/p'|awk -"=" '{print $2}'`


再次执行脚本:
#>sh skytest.sh
相同
127.0.0.1

#>

终于解决两天的困扰了,可以好好睡觉了!


$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

阅读(2622) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~