我正在尝试在我的bash脚本中保留一个外部计数器。
由于大部分脚本都是针对它的目的,我只会插入一些我似乎无法工作的相关部分。以前的一切都得到了定义。在有人评论猫之前,我也试过(< $ TMPFILE)。该问题似乎没有写入文件。
#!/bin/bash
TMPFILE="/tmp/nettestnum"
if [ -e "$TMPFILE" ]; then I=$(cat $TMPFILE); else I="1"; fi
nettest_start() {
grep -q "/root/bin/nettest" /etc/rc.local
if [ $? -eq 1 ]; then
sed -i 's|touch /var/lock/subsys/local|touch /var/lock/subsys/local \&\& /root/bin/nettest|' /etc/rc.local 2>&-
echo "Script started at $DATEVAL" >> "$LOGFILE" 2>&1
echo "Script will run every $TIMELb minutes, $LIMIT times"
touch "$TMPFILE"
nettest_run
else
echo "Nettest is already started and will relaunch upon next reboot"
fi
}
nettest_run() {
echo "$DATE : Starting scan" >> "$LOGFILE" 2>&1
#
while [[ "$I" -lt "$LIMIT" ]]
do
echo "$DATE : Starting scan" >> "$LOGFILE" 2>&1
#
HOSTS="$(...)"
for myHost in $HOSTS
do
PING=$(ping -f -c $COUNT "$myHost" |grep 'rtt' | awk '{print $4}')
echo "$myHost / $PING" >> "$LOGFILE" 2>&1
done
echo "$DATEVAL : Finished" >> "$LOGFILE" 2>&1
echo "$DATEVAL : Netstat Start" >> "$STATLOG" 2>&1
netstat -s |egrep -i "dropped|loss|reject|timeout|invalid" >> "$STATLOG" 2>&1
echo "$DATEVAL : Netstat Finished" >> "$STATLOG"G 2>&1
echo "." >> "$LOGFILE" 2>&1
sleep "$TIMEL"
let I++ || true
set +C
echo "$I" > "$TMPFILE"
done
}
编辑4:重新添加}并显示两个功能。
我还需要弄清楚如何为循环编写一个退出,但我很确定这只是一个[$? = 0]
编辑: 我在运行状态命令时看到的一些输出示例(内置于脚本中)..
Nettest is enabled on startup
PID number: 6059
Nettest is actively running in memory
On iteration of 100
迭代在第一次运行时显示1。
编辑2:使用完整示例重新编写示例,减去自定义命令。
答案 0 :(得分:1)
最后,我通过在所需的行中添加2>& 1来实现它。
echo "$I" > "$TMPFILE" 2>&1
答案 1 :(得分:0)
试试这个:
if [ -e "$TMPFILE" ]; then I=`cat $TMPFILE`; else I=1; fi
while [[ $I -lt $LIMIT ]]
答案 2 :(得分:0)
while循环创建一个子shell,其中包含所有当前变量的副本。
#!/bin/bash
I=1
CHECK=1 # boolean for demonstration
while CHECK; do
let I++
CHECK=0
done
echo $I # prints 1, not two
这是因为while子shell获取I
变量的副本,它会递增。一旦子shell退出,原始变量就会返回。
您的I
变量正在递增,并充当您的循环计数器。我希望这会给你带来各种问题,以便正确地结束你的循环,并且让这个程序的其他部分看到"对"变量。我认为没有理由不能用等效的for循环替换while循环,并完全避免所有这些问题。