[英]Bash - increment a counter in a while loop if something is true
我想在while循環中增加一個計數器,一旦該循環完成,就回顯該計數器。 僅當$DATE >= $SINCE
,$ COUNTER才應遞增
last -f /var/log/btmp |
while read line; do
set -- $line
[[ $1 == "$CURRENTUSER" ]] || continue
[[ $(date -d "$4 $5 $6 $7" +%Y%m%d%H%M%S) -ge $SINCE ]] && echo "FAILED LOGIN $line" && ((COUNTER+=1))
echo $COUNTER //echos 1, 2 etc
done
echo "Top counter:"$COUNTER //echos 0
您的問題是與此行:
[[ $(date -d "$4 $5 $6 $7" +%Y%m%d%H%M%S) -ge $since ]] && echo "$line && COUNTER=$[$COUNTER +1]"
您將需要類似:
[[ $(date -d "$4 $5 $6 $7" +%Y%m%d%H%M%S) -ge $since ]] && echo "$line" && ((COUNTER+=1))
如果要顯示和遞增,則:
[[ $(date -d "$4 $5 $6 $7" +%Y%m%d%H%M%S) -ge $since ]] && echo "$line $((COUNTER+=1))"
問題是范圍之一。 進入while表示$ COUNTER超出范圍。 一個很好的解釋是http://mywiki.wooledge.org/BashFAQ/024
解決方案來自克里斯對此帖子的評論:
http://www.edwardawebb.com/linux/scope-issue-bash-loops 在此處輸入鏈接描述
COUNTER=0
STDOUT=$(last -f /var/log/btmp)
while read line; do
set -- $line
[[ $1 == "$CURRENTUSER" ]] || continue
[[ $(date -d "$4 $5 $6 $7" +%Y%m%d%H%M%S) -ge $SINCE ]] && echo "FAILED LOGIN $line" && ((COUNTER+=1))
done <<EOF
$STDOUT
EOF
echo "counter:$COUNTER"
管道命令在各自的子外殼中執行。 變量修改被限制在該子Shell中,並且不會傳播回父Shell。
使用bash
來避免陷阱的一種常見解決方法是使用流程替換 :
while read line; do
set -- $line
[[ $1 == "$CURRENTUSER" ]] || continue
[[ $(date -d "$4 $5 $6 $7" +%Y%m%d%H%M%S) -ge $SINCE ]] && echo "FAILED LOGIN $line" && ((COUNTER+=1))
echo $COUNTER //echos 1, 2 etc
done < <(last -f /var/log/btmp)
# ^^^^^^^^^^^^^^^^^^^^^^^^^^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.