【问题标题】:Read and execute lines with spaces from file in bash从 bash 文件中读取并执行带空格的行
【发布时间】:2014-03-19 12:28:26
【问题描述】:

当我尝试从文件中读取一些行并一一执行时,我在 bash shell 脚本中遇到了问题。当该行有一个带空格的参数时,就会出现问题。代码:

while read i
do
   $i
done < /usr/bin/tasks

任务文件:

mkdir Hello\ World
mkdir "Test Directory"

上述两条指令在直接从终端执行时完美运行,只创建了两个目录,分别称为“Hello World”和“Test Directory”,但从脚本读取和执行指令时不会发生同样的情况,表示创建了四个目录。

话虽如此,我希望我的代码尽可能简单,如果可能的话,我宁愿不使用 cat 命令。提前感谢您的帮助。

【问题讨论】:

  • 您在这里的真正目标是什么?如果您尝试添加日志记录、错误处理等,那么有更好的方法来做。

标签: linux bash shell


【解决方案1】:

尽可能简单?您正在重新实现.(或source,因为bash 允许您拼写)命令:

. /usr/bin/tasks

source /usr/bin/tasks

要一次执行一行,请使用eval

while IFS= read -r i; do
    eval "$i"
done

这假定文件的每一行都包含一个或多个可以单独执行的完整命令。

【讨论】:

  • 代码已编辑。无论如何,知道如何解决空格问题吗?
  • 空格应该没有问题。如果/usr/bin/tasks 中的命令在命令行上以这种方式键入时可以正常工作,那么如果您只是源文件,它们应该可以工作。
  • 简单地获取文件效果很好,但我确实需要使用while循环从文件任务中一次执行一行(抱歉,如果我之前没有提到这一点)。这可能吗?
  • @user3437174,为什么?有些程序不能一次执行一行——例如,任何具有跨行的流控制结构的程序。
  • @user3437174 ...此外,如果您有重定向运算符或语法引号,那么它们也不会按照您当前的方式工作。在这些情况下,您必须使用 eval - 您当然可以一次使用一行,正如 chepner 在这里演示的那样。
猜你喜欢
  • 2014-01-13
  • 2013-02-28
  • 2012-09-09
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多