今天写一个脚本,获取配置文件中的值,配置文件如下:
[root@localhost test]# cat config.ini
[MY_CONFIG]
SERVER_IP=192.168.99.100
SERVER_PORT=10001
在linux下查看以上配置文件,未发现有啥问题。
脚本如下(感觉也没毛病吧):
[root@localhost test]# cat test_fail.sh
#!/bin/sh
TEST_MGR_IP=`cat config.ini |grep "SERVER_IP" |cut -d \= -f 2 | sed -e 's/^[ ]*//g' | sed -e 's/[ ]*$//g'`
echo "${TEST_MGR_IP}"
TEST_MGR_PORT=`cat config.ini |grep "SERVER_PORT" |cut -d \= -f 2 | sed -e 's/^[ ]*//g' | sed -e 's/[ ]*$//g'`
echo "${TEST_MGR_PORT}"
echo "${TEST_MGR_IP}:${TEST_MGR_PORT}"
但是当执行后,单个值打印没问题,加起来打印就出现覆盖的现象,如下所示:
[root@localhost test]# ./test_fail.sh
192.168.99.100
10001
:100018.99.100
晕晕晕,查了我好久,终于找出问题,由于我的配置文件是在WIN32下编辑的,里面包含了一个回车符。
这样就还要去掉结尾的回车,脚本完善一下,如下:
[root@localhost test]# cat test_ok.sh
#!/bin/sh
TEST_MGR_IP=`cat config.ini |grep "SERVER_IP" |cut -d \= -f 2 | sed -e 's/^[ ]*//g' | sed -e 's/[ ]*$//g' |sed -e 's/\r//g'`
echo "${TEST_MGR_IP}"
TEST_MGR_PORT=`cat config.ini |grep "SERVER_PORT" |cut -d \= -f 2 | sed -e 's/^[ ]*//g' | sed -e 's/[ ]*$//g' |sed -e 's/\r//g'`
echo "${TEST_MGR_PORT}"
echo "${TEST_MGR_IP}:${TEST_MGR_PORT}"
总结:
大家看出区别了吗, 对了,是要在去掉回车,因为经过WIN32编辑的文件会隐藏一个回车符。因为WIN32和LINUX是有区别的:
\r : return 到当前行的最左边。
\n: newline 向下移动一行,并不移动左右。
Linux中\n表示回车+换行;
Windows中\r\n表示回车+换行。
Mac中\r表示回车+换行。
因此在脚本中加了“ |sed -e 's/\r//g'
” 就可以把回车符去掉了。