Bash:在脚本中执行多命令行字符串

时间:2015-03-12 15:05:11

标签: linux bash unix

在文件中有一些像这样的多命令行:

cd /home/user; ls

在bash脚本中,我想执行这些命令,为最后一个添加一些参数。例如:

cd /home/user; ls   -l *.png

我认为做这样的事就足够了:

#!/bin/bash
commandLine="$(cat theFileWithCommandInside)   -l *.png"
$commandLine
exit 0

但它说:

/home/user;: No such file or directory

换句话说,“;”字符并不意味着“命令的结束”:shell正试图找到一个名为“user;”的目录。在主文件夹中......

我试图替换“;”使用“&&”,但结果是一样的。

5 个答案:

答案 0 :(得分:2)

为什么不在脚本中执行命令本身,而不是"导入"他们?

#!/bin/bash
cd /home/user; ls -l *.png
exit 0

答案 1 :(得分:2)

将命令包装到函数中:

function doLS() {
    cd user; ls $@
}

$@扩展为传递给函数的所有参数。如果您(或片段作者)添加了期望预定义数量的参数的函数,您可能会发现位置参数$1$2,......非常有用。

作为主脚本的维护者,您必须确保提供此类代码段的每个人都提供了" interface"你的代码使用(即他们的代码定义你的程序调用的函数,它们的函数处理程序通过的参数)。

使用source.将该功能导入正在运行的shell中:

#!/bin/bash
source theFileWithCommandInside
doLS -l *.png
exit 0

我想在;主题上添加一些想法:

  

换句话说,&#34 ;;"字符不再意味着"结束了   命令":shell正在尝试查找名为" user;"的目录。在   主文件夹......

;不用于以C风格语言终止语句。相反,它用于分隔应在列表内按顺序执行的命令。在子shell中执行两个命令的示例:

( command1 ; command2 )

如果列表是的一部分,则必须由;继承:

{ command1 ; command2 ; }

在您的示例中,将不会执行标记化和通配(替换*)(正如您可能预期的那样),因此您的代码将无法成功运行。

答案 2 :(得分:1)

你的问题是执行存储在string中的命令。有数千种间接执行的方法。但最终,bash必须参与其中。

那么为什么不明确调用bash来完成这项工作呢?

bash -c "$commandLine"

来自doc:

  

-c string

     

如果存在-c选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从$ 0开始。

http://linux.die.net/man/1/bash

答案 3 :(得分:0)

关键是:eval

这里,固定脚本(看第三行):

#!/bin/bash
commandLine="$(cat theFileWithCommandInside)   -l *.png"
eval $commandLine
exit 0

答案 4 :(得分:0)

使用<(...)表格

sh<(sed' s / $ / * .png /' theFileWithCommandInside)