这两天被一个问题 搞的快疯了
使用脚本读取一个配置文件,配置文件是windows下读的utf-8格式
脚本如下:
-
mypath=skytest.properties
-
if [ -f $mypath ];then
-
sip=`sed -n '/redis.host/p' $mypath|awk -F "=" '{print $2}'`
-
#sip=`echo $sip":hello" `
-
sport=`sed -n '/redis.port/p' $mypath |awk -F "=" '{print $2}'`
-
#sip="127.0.0.1"
-
if [ "$sip" = "127.0.0.1" ];then
-
echo "相同"
-
fillspace $sip 20
-
sip="$mystr"
-
else
-
echo "sip is:$sip"
-
echo "字符串:127.0.0.1"
-
echo "不一样"
-
fi
-
else
-
sip="不存在$filename"
-
sport=""
-
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 -n '/redis.host/p' $mypath|awk -F "=" '{print $2}'`
修改为:
sip=`sed 's/.$//g'$mypath |sed -n '/redis.host/p'|awk -F "=" '{print $2}'`
再次执行脚本:
终于解决两天的困扰了,可以好好睡觉了!
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
阅读(2622) | 评论(0) | 转发(0) |