BASH : 数组作为字符串缓冲区

Sly*_*lyx 3 bash shell-script bash-script

我设计了一个基于数组缓冲区来存储数据并在行计数器达到 MAX 值时写入数据,而不是显示(或写入)每个生成的结果。这是脚本:

#!/bin/bash
#Buffer Management
BUFFERCURSOR=0
BUFFERMAXSIZE=5
function bufferReset (){
    unset BUFFERVAR
    BUFFERCURSOR=0
}
function bufferAppend () {
    (( BUFFERCURSOR++ ))
    BUFFERVAR[$BUFFERCURSOR]="$1"
}
function bufferDisplay () {
    for ((i=1;i<=$BUFFERCURSOR;i++)); do printf "%s\n" "${BUFFERVAR[$i]}" ; done
}
#Buffer Management End:
for ((i=1;i<=8;i++)) ; do
    line=`printf "%3s" "$i ==> $(echo $i | md5sum|awk '{print $1}')"` #Example of a string to append
    bufferAppend "$line"
    if [ "$BUFFERCURSOR" == "$BUFFERMAXSIZE" ] ;    then
        bufferDisplay
        bufferReset
    fi
done
# Display remaining elements in the "buffer"
bufferDisplay
bufferReset
Run Code Online (Sandbox Code Playgroud)

所以输出是:

1 ==> b026324c6904b2a9cb4b88d6d61c81d1
2 ==> 26ab0db90d72e28ad0ba1e22ee510510
3 ==> 6d7fce9fee471194aa8b5b6e47267f03
4 ==> 48a24b70a0b376535542b996af517398
5 ==> 1dcca23355272056f04fe8bf20edfce0
7 ==> 84bc3da1b3e33a18e8d5e1bdd7a18d7a
8 ==> c30f7472766d25af1dc80b3ffc9a58c7
Run Code Online (Sandbox Code Playgroud)

为什么跳过第 6 个元素?

Hau*_*ing 6

通过将脚本启动为

bash -vx ./script
Run Code Online (Sandbox Code Playgroud)

您在主程序和函数中使用相同的变量,这是一个非常糟糕的主意。bufferDisplay将 i 的值保留为 6,然后i++执行主循环的 。

避免这种情况的最佳方法是在所有函数中使用单独的名称空间。函数中的每个变量不是有意来自外部名称空间的变量必须声明为

local i
Run Code Online (Sandbox Code Playgroud)

你也可以使用不同的名字;尤其是这么小的节目。但这种local方法不太容易出错。