bash export命令,其中包含一个变量

时间:2013-02-19 19:42:37

标签: bash

我有脚本在许多循环中使用的命令,并希望将其导出。

#!/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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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循环列表从*更改为./*以减少输入