簡體   English   中英

增加Bash循環內的變量

[英]Incrementing a variable inside a Bash loop

我正在嘗試編寫一個USCOUNTER計算日志文件中的條目,我正在遞增一個變量( USCOUNTER ),我在循環完成后嘗試使用它。

但在那一刻, USCOUNTER看起來是0而不是實際價值。 知道我做錯了什么嗎? 謝謝!

FILE=$1

tail -n10 mylog > $FILE

USCOUNTER=0

cat $FILE | while read line; do
  country=$(echo "$line" | cut -d' ' -f1)
  if [ "US" = "$country" ]; then
        USCOUNTER=`expr $USCOUNTER + 1`
        echo "US counter $USCOUNTER"
  fi
done
echo "final $USCOUNTER"

它輸出:

US counter 1
US counter 2
US counter 3
..
final 0

您在子shell中使用USCOUNTER ,這就是變量未在主shell中顯示的原因。

而不是cat FILE | while ... cat FILE | while ... ,做while ... done < $FILE 這樣,您可以避免在流水線中設置變量的常見問題 它們為什么在循環結束后消失? 或者,為什么我不能管道數據讀取?

while read country _; do
  if [ "US" = "$country" ]; then
        USCOUNTER=$(expr $USCOUNTER + 1)
        echo "US counter $USCOUNTER"
  fi
done < "$FILE"

注意我也用$()替換了``表達式。

我也在while read line; do country=$(echo "$line" | cut -d' ' -f1)更換了while read line; do country=$(echo "$line" | cut -d' ' -f1) while read line; do country=$(echo "$line" | cut -d' ' -f1) with while read country _ 這允許您while read var1 var2 ... varN說明var1包含行中的第一個單詞$var2 ,依此類推,直到$varN包含剩余內容。

while read -r country _; do
  if [[ $country = 'US' ]]; then
    ((USCOUNTER++))
    echo "US counter $USCOUNTER"
  fi
done < "$FILE"

極簡主義

counter=0
((counter++))
echo $counter

你得到的是final 0因為你的while loop正在子(shell)進程中執行,並且那里所做的任何更改都沒有反映在當前(父)shell中。

正確的腳本:

while read -r country _; do
  if [ "US" = "$country" ]; then
        ((USCOUNTER++))
        echo "US counter $USCOUNTER"
  fi
done < "$FILE"

我在while循環中遇到了相同的$ count變量。

@ fedorqui的答案 (以及其他幾個)是對實際問題的准確答案:子shell確實是問題所在。

但它引出了另一個問題:我沒有管道文​​件內容...但是輸出了一系列的管道和greps ......

我的錯誤示​​例代碼:

count=0
cat /etc/hosts | head | while read line; do
  ((count++))
  echo $count $line
done
echo $count

感謝這個線程的幫助和進程替換

count=0
while IFS= read -r line; do
  ((count++))
  echo "$count $line"
done < <(cat /etc/hosts | head)
echo "$count"
USCOUNTER=$(grep -c "^US " "$FILE")

增量變量可以這樣做:

  _my_counter=$[$_my_counter + 1]

計算列中模式的出現次數可以使用grep來完成

 grep -cE "^([^ ]* ){2}US"

-c計數

([^ ]* )檢測結腸

{2}結腸數

US你的模式

使用以下1行命令在linux中使用短語特征更改許多文件名:

find -type f -name '*.jpg' | rename 's/holiday/honeymoon/'

對於擴展名為“.jpg”的所有文件,如果它們包含字符串“holiday”,請將其替換為“honeymoon”。 例如,此命令會將文件“ourholiday001.jpg”重命名為“ourhoneymoon001.jpg”。

此示例還說明了如何使用find命令發送擴展名為.jpg(-name'* .jpg')的文件列表(-type f),以通過管道(|)重命名。 然后重命名從標准輸入讀取其文件列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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