liux文件的每行末尾^M$ 和$

本文探讨了在Windows系统编辑后的Shell脚本文件传输到Linux系统执行时遇到的问题及原因。由于Windows与Linux系统的行尾符不同,导致脚本无法正确解析配置文件中的设置。文章提供了两种解决方案:一是重新在Linux环境下编写文件;二是使用sed命令进行文本处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

之前在linux下写了个shell脚本,然后发给一个同事帮我修改(他用的是windows的系统),修改好了之后又发给了我,我直接就覆盖了原来的文件,但是在脚本执行的时候遇到了个问题:



manage_dir=`cat sdm_cristel_external_server.cfg | grep "MANAGE_DIRECTORY" | awk -F "=" '{print $2}' `
echo $manage_dir


if [ "$manage_dir" = "YES" ];then
echo "manage dir"
elif [ "$manage_dir" = "NO" ];then
echo "can not manage dir"
else
echo "please in put a flag"
fi

我在sdm_cristel_external_server.cfg文件里的设置MANAGE_DIRECTORY=YES,但是上面的测试脚本总是输出:please in put a flag


原因:

Unix系统里,每行结尾只有“<换行>",即"\n";windows系统里面,每行结尾是"<换行><回车>" ,即”\n\r"。

一个直接的后果是,Unix的文件在windows打开的话,所有的文字会变成一行;windows文件在Unix里打开的话,在每行的结尾可能会多出一个^M符号。但这个符号通常是直接看不出来的,可以用命令cat -A filename 来查看。


如:windows文件在linux下打开(用cat查看)

# Restore Server configuration^M$
#It indicates which server it is^M$
EXTERNAL_SERVER_NAME_CRISTEL=""^M$
#It is the server IP address^M$
EXTERNAL_SERVER_ADDRESS_CRISTEL=""^M$
#It is the used account for access and transfer to this restore server^M$
EXTERNAL_SERVER_ACCOUNT_CRISTEL=""^M$
#Define the transfer directory in restore server^I^M$
SERVER_TRANSFER_DIRECTORY_CRISTEL=""^M$
#Define the valid directory in restore server^M$
SERVER_VALID_DIRECTORY_CRISTEL=""^M$
#Define the restored directory in restore server^M$
SERVER_RESTORED_DIRECTORY_CRISTEL=""^M$
^M$


解决:

法1. 把windows下发过来的文件,在linux下再重写一遍

法2. 用sed解决

manage_dir=`cat sdm_cristel_external_server.cfg | grep "MANAGE_DIRECTORY" | awk -F "=" '{print $2}'  | sed   -i   's/^M$//g`


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值