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 个元素?
通过将脚本启动为
bash -vx ./script
Run Code Online (Sandbox Code Playgroud)
您在主程序和函数中使用相同的变量,这是一个非常糟糕的主意。bufferDisplay将 i 的值保留为 6,然后i++执行主循环的 。
避免这种情况的最佳方法是在所有函数中使用单独的名称空间。函数中的每个变量不是有意来自外部名称空间的变量必须声明为
local i
Run Code Online (Sandbox Code Playgroud)
你也可以使用不同的名字;尤其是这么小的节目。但这种local方法不太容易出错。
| 归档时间: |
|
| 查看次数: |
1563 次 |
| 最近记录: |