我对
Shell比较陌生,我一直在尝试在Shell中使用数组,但效果不佳.我正在尝试编写一个脚本来暂停OpenVZ容器,如果它们在一段时间内达到一定的带宽阈值.
我的剧本:
#!/bin/bash #Thresholds are in bytes per second and count1 must > count2 LOGDIR="/var/log/outbound_ddos" SECS=10 THRESHOLD1=65536000 COUNT1=10 THRESHOLD2=117964800 COUNT2=2 while [ 1 ] do for veid in $(/usr/sbin/vzlist -o veid -H) do # Create the log file if it doesn't already exist if ! test -e $LOGDIR/$veid.log; then touch $LOGDIR/$veid.log fi # Parse out the inbound/outbound traffic and assign them to the corresponding variables eval $(/usr/sbin/vzctl exec $veid "grep venet0 /proc/net/dev" | \ awk -F: '{print $2}' | awk '{printf"CTOUT=%s\n",$9}') # Print the output and a timestamp to a log file echo $(date +%s) $CTOUT >> $LOGDIR/$veid.log # Read last 10 entries into arrays i=0 tail $LOGDIR/$veid.log | while read time byte do times[$i]=time; bytes[$i]=byte let i++ done # Sanity checks and calculations for (( i=0; i<COUNT1; i++ )) do # Sanity check on the time if (( times[$i] > times[$i - 1] + $SECS + 10 )) then continue fi # Calculate differences let "diff[$i] = bytes[$i+1] - bytes[$i]" done # Work out thresholds and suspend where necessary # Higher threshold first t2=0 for (( i=COUNT1-1; i>=0; i-- )) do if [ ! diff[$i] ] then continue else if (( bytes[$i] < THRESHOLD1 * SECS + bytes[$i-1] + 1 )) then continue else let t2++ fi fi done #Lower threshold last t1=0 for (( i=COUNT1-1; i>=0; i-- )) do if [ ! diff[$i] ] then continue else if (( bytes[$i] < THRESHOLD1 * SECS + bytes[$i-1] + 1 )) then continue else let t1++ fi fi done # Suspend where necessary if (( ($t2 >= $COUNT2) || ($t1 >= $COUNT1) )) then vzctl stop veid fi done sleep $SECS done
而错误:
script.sh: line 38: times: bad array subscript script.sh: line 54: bytes: bad array subscript script.sh: line 67: bytes: bad array subscript
我已经尝试了数组下标的几种变体,但我似乎无法摆脱这些错误.
所以在第38行,
原文链接:https://www.f2er.com/bash/383378.htmlif (( times[$i] > times[$i - 1] + $SECS + 10 ))
在迭代期间会引用一次[-1]次.负指数是only very recently part of bash arrays,所以这很可能是你得到错误的原因.
与第54行和第67行类似,您只需按一次负数组下标.调整循环以避免[0 – 1].