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

Tec*_*1an 2 macos bash shell

题,

我想有一个bash脚本,它将有一个可以从其他bash脚本增加的全局变量.

示例:我有一个如下的脚本:

 #! /bin/bash
export Counter=0
   for SCRIPT in /Users/<user>/Desktop/*sh
    do
        $SCRIPT
    done
echo $Counter
Run Code Online (Sandbox Code Playgroud)

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

if [ "$Output" = "$Check" ]
    then
       echo "OK"
      ((Counter++))
Run Code Online (Sandbox Code Playgroud)

我希望它然后递增$ Counter变量,如果它等于"OK",然后将该值传递回初始批处理脚本,这样我就可以保留该计数器编号并在结尾处有一个总计.

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

Cha*_*ffy 6

环境变量仅在一个方向上传播 - 从父级到子级.因此,子进程无法更改其父级中设置的环境变量的值.

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

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

......并且,在个别脚本中:

counter_curr=$(< "$counter_file" )
(( ++counter_curr ))
printf '%s\n' "$counter_curr" >"$counter_file"
Run Code Online (Sandbox Code Playgroud)

这当前不是并发安全的,但是当前编写的父脚本一次不会调用多个子节点.


假设您跟踪的值仍然相对较小,更简单的方法是使用文件的大小作为计数器值的代理.为此,递增计数器就像这样简单:

printf '\n' >>"$counter_file"
Run Code Online (Sandbox Code Playgroud)

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

counter=$(stat -f %z "$counter_file")
Run Code Online (Sandbox Code Playgroud)

请注意,如果使用未正确实现的NFS等文件系统,则可能需要锁定以实现并发安全性O_APPEND; 请参阅Norman Gray的答案(这应归功于灵感),以实现工作实施.