gpt4 book ai didi

linux - 在 shell 脚本中修改导出的变量

转载 作者:太空狗 更新时间:2023-10-29 12:35:08 27 4
gpt4 key购买 nike

我有一个类似于以下代码片段的 shell 脚本:

...
export updates=0

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

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

echo $updates

用途是计算更新、插入和要保留的文件的数量。不幸的是,最后的 echo 总是打印 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 的更多信息,尤其是以下部分:

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

关于linux - 在 shell 脚本中修改导出的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com