< 返回技术文档列表

linux 下运行 shell 脚本报错 line 4 $&#x27; r&#x27; command not found

发布时间:2022-11-17 22:34:27⊙投诉举报
作者:Gakki

问题形容

  • 在 Windows 下编写好 Shell 脚本之后放到 Linux 上运行报错,如:
    line 4 $' r' command not found

问题起因

  • 出现这样的错误,是由于 Shell 脚本在 Windows 系统编写时,每行结尾是 “<换行><回车>”,即 \n\r ;在 Unix 体系中每行结尾只有“<换行>”,即 \n ,所以在 Unix 体系中运行脚本时,会认为 \r 是一个字符,导致运行错误。

处理方案

就是将 Shell 脚本中的 \r 字符去除掉。

方法一:
  • 使用 sed 命令:sed -i 's/\r//' 脚本名
  • 解释命令:
    • sed:可依照脚本的指令来解决、编辑文本文件。主要用来自动编辑一个或者多个文件、简化对文件的反复操作、编写转换程序等。
    • i:会直接修改源文件,要慎用。
    • sed s 替换脚本命令,命令的基本格式为:[address]s/pattern/replacement/flags
      • address:指定要操作的具体行;
      • pattern:指的是需要替换的内容;
      • replacement:指的是要替换的新内容。
      • flags 常用标记:
flags 标记功能
n1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换。例如,一行中有 3 个 A,但客户只想替换第二个 A,这是就用到这个标记;
g对数据中所有匹配到的内容进行替换,假如没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file将匹配后的结果保存指定的 file 文件中;
&用正则表达式匹配的内容进行替换;
\n匹配第 n 个子串,该子串之前在 pattern 中用 () 指定。
\转义(转义替换部分包含:&、\ 等)

如:

  • sed 's/test/trial/2' test.txt:sed 编辑器只替换每行中第 2 次出现的匹配模式。数字 2 作为标记的结果。
  • sed 's/test/trial/g' test.txt:替换所有匹配的字符串。
方法二:
  • 使用命令即刻:dos2unix one-more.sh
  • 报错:-bash: dos2unix: command not found
  • 说明dos2unix还没有安装,运行如下命令进行安装:yum install -y dos2unix

其余

  • 也可以将文件内容打印出来,这样更能直观的发现问题。
  • 在终端运行该命令:
python3 -c "import json; print(json.dumps([{'length': len(line), 'content': line} for line in open('test.sh')], indent=4))"

注:将 test.sh 改为自己的路径与文件名就可。

打印结果打印结果
  • 我们可以从中发现,cat 没有将换行符打印出来,不好发现问题。但通过运行 python 命令,就很直观的发现问题。

/template/Home/Zkeys/PC/Static