1

我有脚本在许多循环中使用的命令并想要导出它。

#!/bin/bash
export COMMAND=$(many programs $FILE)
# And use this command latter like this:
for FILE in ./*; 
do 
eval $"COMMAND"
done

而且我无法导出这个命令,因为我从这个命令中的程序中得到一个错误(请提供输入)。

如何导出带有变量的 COMMAND?

编辑

我使用了@Charles Duffy 的答案,但还有一个问题:

your_command() {
do_something_with "$1"
do_something_else_with "$1"
}
export -f your_command


for i in $(seq 1 $Times); do 
  for file in ./*; do
     your_command "$file"
  done 
done

When Times=1 循环工作正常,但 when Times=2your_command不保存输出(第一个循环有输出,但第二个循环没有)。

4

2 回答 2

4

command应该是一个函数,而不是一个变量。

your_command() {
  do_something_with "$1"
  do_something_else_with "$1"
}

for file in ./*; do
  your_command "$file"
done

如果您确实需要将其导出(可用于子流程),您可以使用以下方法执行此操作:

export -f your_command
于 2013-02-19T19:45:00.227 回答
1

首先 - 您应该使用一个函数,如其他答案中所述。也就是说,也可以修复你所拥有的东西。您可能不应该使用$(). 按照您的方式,您的“许多程序”将在初始化时立即运行COMMAND,并且您将保存它们的输出,而不是命令行本身。除此之外,当时$FILE还没有设置。这是您的脚本的修改版本,应该可以工作:

#!/bin/bash

COMMAND='many programs "${FILE}"'
# And use this command later like this:
for FILE in *
do 
  eval ${COMMAND}
done

我对您的脚本所做的更改:

  1. 删除不必要的export
  2. 放置{}变量名
  3. 双引号${FILE},以防文件名中有空格
  4. 摆脱了$()并替换为''
  5. 固定缩进以便于阅读
  6. for循环列表更改为*from./*以减少输入
于 2013-02-19T19:47:53.787 回答