gpt4 book ai didi

macos - 如何在另一个 bash 脚本中增加一个全局变量

转载 作者:行者123 更新时间:2023-11-29 09:35:12 28 4
gpt4 key购买 nike

问题,

我想要一个 bash 脚本,它有一个可以从其他 bash 脚本递增的全局变量。

例子:我有如下脚本:

 #! /bin/bash
export Counter=0
for SCRIPT in /Users/<user>/Desktop/*sh
do
$SCRIPT
done
echo $Counter

该脚本将调用文件夹中的所有其他 bash 脚本,这些脚本将具有如下内容:

if [ "$Output" = "$Check" ]
then
echo "OK"
((Counter++))

我希望它在 $Counter 变量等于“OK”时递增它,然后将该值传递回初始批处理脚本,这样我就可以保留该计数器编号并在最后得到总数。

关于如何去做的任何想法?

最佳答案

环境变量只在一个方向传播——从父到子。因此,子进程无法更改在其父进程中设置的环境变量的值。

你可以做的是使用文件系统:

export counter_file=$(mktemp "$HOME/.counter.XXXXXX")
for script in ~user/Desktop/*sh; do "$script"; done

...并且,在单独的脚本中:

counter_curr=$(< "$counter_file" )
(( ++counter_curr ))
printf '%s\n' "$counter_curr" >"$counter_file"

目前这不是并发安全的,但您当前编写的父脚本绝不会一次调用多个子脚本。


假设您跟踪的值仍然相对较小,一种更简单的方法是使用文件大小作为计数器值的代理。为此,递增计数器非常简单:

printf '\n' >>"$counter_file"

...并在 O(1) 时间内检查其值——无需打开文件并读取其内容——就像检查文件大小一样简单;使用 GNU stat:

counter=$(stat -f %z "$counter_file")

请注意,如果使用未正确实现 O_APPEND 的文件系统(例如 NFS),可能需要锁定才能实现并发安全;见Norman Gray's answer (这归功于它的灵感)一个有效的实现。

关于macos - 如何在另一个 bash 脚本中增加一个全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30626393/

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