【问题标题】:Embedded Linux shell (BusyBox) check over list of files if they exist and run commands嵌入式 Linux shell (BusyBox) 检查文件列表是否存在并运行命令
【发布时间】:2014-05-01 08:54:35
【问题描述】:

我正在尝试下载文件列表(文本文件,每行一个文件名,文件名中没有空格或换行符),然后检查每个文件是否存在并相应地运行命令。第一部分似乎工作得很好,从 web 服务器下载文件,第一个 echo 输出文件名。但文件存在检查不起作用。

#!/bin/sh
wget -qO- http://web.server/x/files.txt | while read file
do
        echo $file
        if [ -f $file ]; then
                echo $file exists
        else
                echo $file does not exist
        fi
done

在第二个文件(temp.txt)确实存在的目录中执行时的输出:

file1.tmp
 does not exist
temp.txt
 does not exist
file3.tmp
 does not exist
file4.tmp
 does not exist

第二个文件确实存在,并且 if 语句中的 echo 命令显然也不识别 $file 变量。

感谢任何帮助,我尝试将其与此处找到的信息拼凑在一起。一个问题可能是这不是一个完整的 linux 系统,而是带有 BusyBox v1.22.1 的嵌入式 Linux (OpenELEC)。

更新:感谢评论者,我们发现代码基本上可以正常工作,因为来自 Web 服务器的 files.txt 仅包含 unix EOL - 它不适用于windows CRLF 行尾。

现在如何让脚本工作而不管来自网络服务器的文件中的行结尾是什么?

【问题讨论】:

  • 您是否也在完整的 Linux 系统上对此进行了测试,以验证这是否是问题所在?
  • 没试过,因为我需要让它在嵌入式系统上运行。
  • 您应该首先尝试以帮助隔离问题。在尝试移植之前,我通常会确保某些东西在完整的 linux 上运行。
  • 另外,你的代码对我来说看起来非常好,除了你通常应该做if [ -f "$file" ]
  • @merlin2011 在这种情况下不会产生影响,但建议这样做,因为文件名中没有空格或可扩展字符。

标签: linux shell embedded


【解决方案1】:

dos2unix 是一个将 Windows 行尾转换为 Unix 行尾的实用程序。您可以像这样在脚本中使用它:

wget -qO- http://web.server/x/files.txt | dos2unix | while read file

或者:

while read line; do
    ...
done < <(wget -qO- http://web.server/x/files.txt | dos2unix)

【讨论】:

  • 谢谢,第一个工作正常。在busybox系统上,第二个语法
猜你喜欢
  • 1970-01-01
  • 2016-05-25
  • 2014-09-12
  • 2019-02-06
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多