修改shell脚本中导出的变量



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

...
export updates=0
processFiles() {
updates=$((updates+1))
}
export -f processFiles
find $path -exec /bin/bash -c "processFiles '{}'" ;
echo $updates

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

我已经尝试过在函数中使用导出,但没有成功。

如果搜索条件足够简单,您可以直接使用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的信息,特别是以下部分:

  • 商店内置:http://www.gnu.org/software/bash/manual/bashref.html#The-Shopt Builtin
  • 图案匹配:http://www.gnu.org/software/bash/manual/bashref.html#Pattern-匹配
  • 条件表达式:http://www.gnu.org/software/bash/manual/bashref.html#Bash-条件表达式

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

相关内容

  • 没有找到相关文章

最新更新