簡體   English   中英

Bash-如果某些情況成立,則在while循環中增加計數器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM