简单的bash脚本中的错误

问题描述 投票:0回答:2

我有一个小的bash脚本,在我的pi上工作,但由于某些原因在朋友的pi上踢出了错误。

最终的目标是下载一个文件,并重命名为另一个脚本使用。 这种情况每天发生4次,所以部分脚本在开始之前会删除之前的文件。 然后下载新的文件,然后重命名它,这样其他脚本就可以引用一个文件,而不是整天下载的所有四个文件。

下面是这个脚本。

#!/bin/bash

rm -r /NeoSectional/GFSMAV &
sudo wget https://www.weather.gov/source/mdl/MOS/GFSMAV.t00z -P /NeoSectional/
sleep 5
sudo mv /NeoSectional/GFSMAV.t00z /NeoSectional/GFSMAV

所以它应该删除GFSMAV这个文件

然后下载新文件GFSMAV.t00z,并将其放置在NeoSectional目录下。

等五秒钟

然后将名称从GFSMAV.t00z改为GFSMAV。

这是我在我朋友的pi上得到的输出。

getmos0.sh: line 2: $'\r': command not found
getmos0.sh: line 3: $'\r': command not found
--2020-04-22 11:50:03--  https://www.weather.gov/source/mdl/MOS/GFSMAV.t18z
Resolving www.weather.gov (www.weather.gov)... 23.1.244.20, 2600:1406:3c:498::116,     2600:1406:3c:497::116
Connecting to www.weather.gov (www.weather.gov)|23.1.244.20|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3198792 (3.0M) [text/plain]
Saving to: ‘/NeoSectional/\r/GFSMAV.t18z.1’

GFSMAV.t18z.1                     100%   [============================================================>]   3.05M  1.72MB/s    in 1.8s    

2020-04-22 11:50:05 (1.72 MB/s) - ‘/NeoSectional/\r/GFSMAV.t18z.1’ saved [3198792/3198792]

sleep: invalid time interval ‘5\r’
Try 'sleep --help' for more information.
mv: cannot stat '/NeoSectional/GFSMAV.t18z': No such file or directory

由于某些原因,它最终创建了一个名为''$'\r'的目录。

而且它在删除文件时出错了,它试图把文件放到NeoSectinoal\r中,然后因为它放到那个奇怪的目录中,所以它在最后才mv。

我们有chmod +x的bash文件。

有什么办法可以解决这个问题吗?

THANKS

bash raspberry-pi
2个回答
0
投票

我不知道你从上面的评论中是否清楚你的文件是 getmos0.sh 包含 \r\n (回车和换行),而不是像在MS-DOS中那样,在每一行的末尾使用 \n (行进)只像在Unix和Linux中一样。

他们给你的答案都以这个为目标。一个较短的方法是将所有的 \r 的文件,而不需要创建一个临时文件 tmp 是。

sed -i 's/\r$//' getmos0.sh

0
投票

问题在于行分离

Windows使用换行(\n)和回车(\r)(两个字符),而linux只使用换行。

这个问题很可能是在将文件从windows复制到Raspberry Pi时发生的。这就导致了 \rs,而当你试图执行它时,bash无法理解它。

你可以做以下工作之一

  • 用文本编辑器在raspberry pi上打开文件,去掉所有行末的奇怪字符(尤其是类似于 ^M\n)如果有的话,删除换行符,然后重新创建(在编辑器中)

  • 移除所有 \r的命令,自动地使用类似 cat getmos0.sh | sed 's/\r$//' > tmp;mv tmp getmos0.sh.

  • 如果 fromdos 安装后,您可以直接运行 fromdos getmos0.sh. 参见@Roadowl的评论。

你需要和脚本在同一个目录下,并且有写权限才能使用这些解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.