题,
我想有一个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",然后将该值传递回初始批处理脚本,这样我就可以保留该计数器编号并在结尾处有一个总计.
关于如何去做的任何想法?
环境变量仅在一个方向上传播 - 从父级到子级.因此,子进程无法更改其父级中设置的环境变量的值.
你可以做的是使用文件系统:
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的答案(这应归功于灵感),以实现工作实施.