修改shell脚本中的导出变量

时间:2012-12-02 12:11:14

标签: linux bash shell global-variables

我有一个shell脚本,看起来像下面的代码片段:

...
export updates=0

processFiles() {
    updates=$((updates+1))
}

export -f processFiles
find $path -exec /bin/bash -c "processFiles '{}'" \;

echo $updates

用法是计算要保留的更新,插入和文件的数量。不幸的是,最后一个回声总是打印0。

我已经尝试过在函数中使用export - 但是没有用。

1 个答案:

答案 0 :(得分:1)

如果您的搜索条件足够简单,则可以直接使用bash,而不是使用find。如,

for file in *; do
    processFiles "$file"
done

将在当前目录的所有文件和目录上执行函数processFiles(隐藏的目录除外),参数为每个文件和目录的名称。如果需要递归地将它应用于所有文件和目录以及子目录(隐藏的子目录除外),请使用globstar shell选项:

#!/bin/bash

shopt -s globstar
shopt -s nullglob

updates=0

processFiles() {
    ((++updates))
}

for file in **; do
    processFiles "$file"
done

echo "$updates"

如果您只想要文件而没有目录,请在for循环中插入:

    [[ -f "$file" ]] || continue

如果file不是文件(即,如果它是其他内容,如目录),它将继续循环。

要仅匹配通过展开变量path获得的目录中的文件,请编写for循环:

for file in "$path"/*; do

(或"$path"/**如果你正在使用globstar并想要递归)。

如果您需要更复杂的搜索条件,则可以始终使用extglob选项。如果您还需要包含隐藏文件,请使用dotglob选项。

您可以在参考手册中找到有关bash的更多信息,特别是这些部分:

最后一点说明:如果你真的不喜欢这个100%bash解决方案,如果你仍然希望在OP中的脚本上做一些事情,那么不要使用bash变量,而是使用(临时)文件代替存储从一个进程传递到另一个进程所需的值。这是一种廉价的IPC方法,效果很好,但安全实施起来比较困难。