簡體   English   中英

bash中的變量遞增

[英]Variable incrementing in bash

請考慮以下腳本:

#!/bin/bash

num=0
cat file | while read line; do
    echo "$line"
    lines[$num]="$line"
    ((num++))
    echo "num = $num"
done

echo "end num = $num"

i=0
while [ $i -lt $num ]; do
    echo "${lines[$i]}"
    ((i++))
done

通常,它應該逐行讀取文件,將結果存儲在一個數組中,然后通過數組並逐行打印。 問題是變量$ num在第一個循環退出后以某種方式重置。 這個腳本的輸出對我來說是(使用帶有一些隨機垃圾的文件):

dsfkljhhsdfsdfshdjkfgd
num = 1
fdfgdfgdfg
num = 2
dfgdfgdfgdfg
num = 3
dfgdfgdfgdfgdfg
num = 4
dfgdfgdfgdfgdfgd
num = 5
fgdfgdfgdfg
num = 6
dfgdfgdfgdfg
num = 7
dfgdfgdfgdfgdfg
num = 8
dfgdfgdfgdfg
num = 9
dfgdfgdgdgdg
num = 10
dfgdffgdgdgdg
num = 11
end num = 0

為什么是這樣? 如何記住變量? 我在SUSE Linux 10上使用bash 3.1.17。

為什么? 這是因為:

cat file | while read line; do
    echo "$line"
    lines[$num]="$line"
    ((num++))
    echo "num = $num"
done

在單獨的進程中運行while語句,具有自己的環境,而不是觸及父環境。 同樣地,你會發現lines數組也不存在。

以下簡化腳本顯示了此操作:

#!/bin/bash
export xyzzy=42
echo urk | while read line; do
    xyzzy=999
    echo $xyzzy
done
echo $xyzzy

該腳本的輸出是:

999
42

因為變量設置為999是在子進程中完成的。

最重要的是,如果您希望信息反映在當前流程(腳本)中,您需要腳本中完成工作或找到其他方法從子流程中獲取信息。

如果您使用輸入重定向而不是啟動子流程管道,它應該可以按您的意願工作。 這是因為while位然后在當前進程的上下文中完成,而不是在管道中的單獨進程。 例如:

#!/bin/bash
export xyzzy=42
while read line; do
    xyzzy=999
    echo $xyzzy
done <<EOF
hello
EOF
echo $xyzzy

將產生:

999
999

對於您的具體情況,請替換:

done <<EOF
hello
EOF

有:

done <file

要添加到上一個答案:並且為了避免(和UUOC),你需要這樣的東西:

while ...; do
  ...
done < file

只需將變量保存在同一環境中即可。 在第4行,刪除“cat file |”。 在第9行,追加“<file”。 你的結束數現在將包含預期的11,而lines數組將通過你的第二個循環一次打印一個元素。

暫無
暫無

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

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