在文件中有一些像这样的多命令行:
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;”的目录。在主文件夹中......
我试图替换“;”使用“&&”,但结果是一样的。
答案 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开始。
答案 3 :(得分:0)
关键是:eval
这里,固定脚本(看第三行):
#!/bin/bash
commandLine="$(cat theFileWithCommandInside) -l *.png"
eval $commandLine
exit 0
答案 4 :(得分:0)
使用<(...)表格
sh<(sed' s / $ / * .png /' theFileWithCommandInside)