历史经验之linux shell脚本获取配置文件值的一个坑

本文讲述了作者在Linux环境下遇到的一个脚本问题,即从Windows编辑的配置文件中读取值时,由于回车符的存在导致脚本运行错误。作者通过分析和调试,发现需要使用`sed`命令去除回车符,最终修正了脚本。总结了Linux与Windows在换行符处理上的差异,并提醒开发者注意跨平台文件处理时的潜在问题。
摘要由CSDN通过智能技术生成

今天写一个脚本,获取配置文件中的值,配置文件如下:

[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'” 就可以把回车符去掉了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值