执行shell脚本出现 $‘ \r‘ 符号导致执行失败【解决】

👨‍🎓博主简介

  🏅CSDN博客专家
  🏅云计算领域优质创作者
  🏅华为云开发者社区专家博主
  🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

  • 问题
  • 问题的排查及原因
  • 解决方法一:修改文件 文件格式
  • 解决方法二:去除文件类型为“dos”文件中的回车

问题

  在执行脚本的时候,我们有时候会遇到添加一个变量值,明明读到的值是0或者1,在外面执行此命令都是没问题的,而且脚本中写的判断也是没问题的,但是为什么执行的结果是没有找到0或者1呢?

问题的排查及原因

  • 脚本示例(test.sh):
#!/bin/bash#获取脚本执行的路径
DIR=$(cd $(dirname $0) && pwd )num=$(cat $DIR/peizhi.properties | egrep "^onenumber" | awk -F "=" '{print $2}')if [ "$num" == 0 ];thenecho -e "配置文件中\e[1;34m测试服务\e[0m\e[1;32m已打开\e[0m"
elseecho -e "配置文件中\e[1;31m测试服务没有打开\e[0m,跳过此判断"
fi
  • 配置文件示例(peizhi.properties):
file=1.txt
onenumber=0
format=json

1、我们先分析脚本:

查看当前目录下的peizhi.properties配置文件中的以onenumber开头的文件;

= 后面的值,如果为0,那么就输入已经打开这个配置了;如果不等于0那么就输出没有打开这个配置。

2、然后我们先在linux命令行执行此命令: cat peizhi.properties | egrep "^onenumber" | awk -F "=" '{print $2}',查到的结果为:0,那么我们应该输出“配置文件中测试服务已打开”

3、放到脚本里执行:发现直接结果是:“配置文件中测试服务没有打开,跳过此判断”

image-20240506131109078

4、打开配置文件和脚本看看文件的格式,是不是都是unix的;vim 打开配置文件和脚本,执行::set ff,查看此脚本或者文件的文件格式;

image-20240506132210216

image-20240506132225669

可以看到,脚本是没问题的,是unix格式的;但是配置文件就是dos格式的了;dos格式为windows(CR LF),在windows上编写的shell脚本,在Linux系统中运行就会有\r ^M等错误信息;

所以,两个脚本文件格式都必须为unix格式,查看脚本是否为unix格式,vim进入脚本编辑器,执行::set ff查看脚本的文件格式;如果是dos的就是windows格式的,如果是unix就是linux格式的;dos格式的在windows回车是有一个隐藏的内容的\r,所以在执行脚本的时候会多出现一个\r

5、然后我们再去看一下,执行脚本的过程;sh -x test.sh

发现多了一个\r,然后导致下面的判断识别成了0\r0不匹配了,所以输出了没有打开此测试服务;

image-20240506141334744


所以,得出的结论是:因为两个文件中的 配置文件的文件格式为dos格式,dos为windows模式,回车会有\r占位符,所以,导致执行shell脚本的时候多了一个\r

两种解决方法:

  • 1、修改文件的文件格式
  • 2、去除文件中的回车:\r

解决方法一:修改文件 文件格式

当我们知道是配置文件的文件类型是dos类型,那么我们就可以只修改配置文件的文件类型即可;

  • 修改文件 文件格式

1、vim 进入编辑模式

2、执行: set ff=unix

3、:wq保存退出

4、再次进入查看文件格式::set ff

image-20240506151715360

image-20240506151812879

5、执行脚本带详细输出

root@7b64cee30106:~# sh -x test.sh 
+++ dirname test.sh
++ cd .
++ pwd
+ DIR=/root
++ cat /root/peizhi.properties
++ grep '^onenumber'
++ awk -F = '{print $2}'
+ num=0
+ '[' 0 == 0 ']'
+ echo -e '配置文件中\e[1;34m测试服务\e[0m\e[1;32m已打开\e[0m'
配置文件中测试服务已打开

可以发现已经是 0 = 0 了,那么问题就解决了;

image-20240506151925543

解决方法二:去除文件类型为“dos”文件中的回车

当我们知道是配置文件的文件类型是dos类型,那么我们就只去除配置文件里的\r就行;

  • 去除文件类型为“dos”文件中的回车\r
sed -i "s/\r//g" peizhi.properties

命令解析:

sed -i:		修改配置文件 
"s/\r//g":	将\r改为空格,文件中所有
peizhi.properties	要修改的文件名
  • 执行脚本带详细输出
root@7b64cee30106:~# sh -x test.sh 
+++ dirname test.sh
++ cd .
++ pwd
+ DIR=/root
++ cat /root/peizhi.properties
++ grep '^onenumber'
++ awk -F = '{print $2}'
+ num=0
+ '[' 0 == 0 ']'
+ echo -e '配置文件中\e[1;34m测试服务\e[0m\e[1;32m已打开\e[0m'
配置文件中测试服务已打开

可以发现已经是 0 = 0 了,那么问题就解决了;

image-20240506151925543



小知识:

  在windows上使用notepad++可以看到该文件的文件类型是什么;打开一个文件或者脚本在右下角可以看到。

image-20240506154549293

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深信服AC行为管理报错

报错信息: e0:alarmevent.cpp:54 exec cmd: /ac/common/app/kvupd -v failed 说明: 截止到上网行为管理12.0.80及全网行为管理13.0.102版本,AC凌晨(0点-7点)会重启进程让设备更好的运行,凌晨重启告警属于正…

android 彩虹进度条自定义view实现

实现一个彩虹色进度条功能,不说明具体用途大家应该能猜到。想找别人造的轮子,但是没有合适的,所以决定自己实现一个。 相关知识 android 自定义view LinearGradient 线性渐变 实现步骤 自定义view 自定义一个TmcView类继承View 重写两…

SpringBoot系列之搭建WebSocket应用

SpringBoot系列之@ServerEndpoint方式开发WebSocket应用。在实时的数据推送方面,经常会使用WebSocket或者MQTT来实现,WebSocket是一种不错的方案,只需要建立连接,服务端和客户端就可以进行双向的数据通信。很多网站的客户聊天,也经常使用WebSocket技术来实现。 WebSocket…

Mac角色扮演游戏推荐:仙剑奇侠传四 for Mac 安装包

《仙剑奇侠传四》拥有精美的画面、优秀的音乐和丰富的剧情内容,成为了仙剑系列中的经典作品之一。游戏在发行后获得了极高的口碑和销量,成为了仙剑系列中的经典之作。在游戏中,玩家将扮演不同的角色,进行冒险探索、与各种敌人战斗…

# bash: chkconfig: command not found 解决方法

bash: chkconfig: command not found 解决方法 一、chkconfig 错误描述: 这个错误表明在 Bash 环境下,尝试执行 chkconfig 命令,但是系统找不到这个命令。chkconfig 命令是一个用于管理 Linux 系统中服务的启动和停止的工具,通常…

2024 年网站分析必备:Fullstory、APILayer 及 Openinstall API 服务

在当今数字化的时代,网站和应用的成功运营离不开对用户行为和网站性能的深入洞察。2024 年的今天,随着技术的不断发展,各种先进的 API 服务应运而生,为我们提供了强大的工具来优化用户体验、保障网站可用性以及提升 App 推广效果。…

Linux编译器 gcc/g++

gcc/g的简介 GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。gcc是GCC中的C语言编译器&…

爱迪特两年创业板上市路:销售费用率远高同行,侵权风险引关注

《港湾商业观察》施子夫 王璐 从2022年4月7日就冲刺创业板的爱迪特(秦皇岛)科技股份有限公司(以下简称,爱迪特),预计将很快登陆资本市场。 爱迪特日前披露中签结果:本次发行股份数量为约1902…

关于最强模型Claude 3.5 Sonnet,你需要知道的10条总结!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

Python自动化(8)——pyqt5界面

Python自动化(8)——pyqt5界面 注意:pyqt5的界面使用时必须有app QApplication(sys.argv)这行代码,否则会出现错误并且无法显示窗口:QWidget: Must construct a QApplication before a QWidget 一些基础的控件 QMainWindow QMainWindow是…

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式 前言一、免费虚拟机下载方式二、 安装过程总结 前言 我真的是服了,现在的CSDN时效性为什么这么差了。都快一个月了还没有博主更新个人免费版虚拟机VMware Workstation Pro,甚至很多人还不知…

RFID技术在汽车轮胎加工工艺中的革新应用

RFID技术在汽车轮胎加工工艺中的革新应用 物联网技术的飞速发展,无线射频识别(Radio Frequency Identification,简称RFID)技术因其独特的优势,在各行各业中展现出巨大的应用潜力。特别是在汽车制造业,RFID…

推荐一款好用的浏览器翻译插件——欧路翻译

近些年,机器翻译的效果越来越好,于是也有更多的开发者,开发了免费使用的浏览器翻译插件。这大大的帮助了我们查看国外的网站,有利于大家获取更多的信息。 在此,给大家推荐一款免费好用的浏览器插件——欧路翻译。支持…

我在高职教STM32——LCD液晶显示(4)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就…

[经验] 如何做虾炒白菜 #学习方法#知识分享

如何做虾炒白菜 虾炒白菜的做法 虾炒白菜是一道营养丰富且美味可口的菜肴,虾肉的鲜嫩与白菜的甜脆相结合,口感极佳。接下来,让我们一起来学习一下虾炒白菜的详细做法。 食材准备 虾:约200克(选用新鲜活虾&#xff…

基于 Native 技术加速 Spark 计算引擎

本文整理自 2024 年 6 月 DataFunSummit 2024 OLAP 架构峰会 Lakehouse 湖仓一体化架构论坛的同名主题分享。 今天分享的主题是基于 Native 技术加速 Spark 计算引擎,大家将会了解到如何基于 ClickHouse 来改造 Spark 引擎,最终获得较为可观的性能提升。…

day50 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列

1143. 最长公共子序列 提示 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删…

大腾智能,基于云原生的国产工业协同平台

大腾智能是一家基于云原生的国产工业软件与数字化协同平台,专注于推动企业数字化转型与升级,为企业提供一系列专业、高效的云原生数字化软件及方案,推动产品设计、生产及营销展示的革新,实现可持续发展。 大腾智能旗下产品 3D模型…

USB2.0学习4--USB包结构和包类型

目录 1. USB包基本结构 1.1 SOP域(Start Of Packet) 1.2 SYNC域(同步域) 1.3 PID域(标识域) 1.4 地址域(ADDR) 1.5 帧号域(Fram) 1.6 数据域&#xff…

前端也需要知道的一些常用linux命令

前端也需要知道的一些常用linux命令 1.问题背景2.连接工具(SecureCRT_Portable)a.下载工具b.连接服务器c.登录到root账户 3.基本命令a.cd命令和cd ..b.ll命令和ls命令c:cp命令d.rm命令e:rz命令f.unzip命令g.mv命令h.pwd命令(这里没有用到&…