[英]While loop fail to read all line from file
所以我得到了這個從遠程服務器執行備份命令的 bash 腳本,每個服務器主機名都在名為/tmp/quarantine.list
文件中定義。 內容是這樣的:
server1
server2
server1
和server2
是我的遠程服務器的 ssh 別名,所以如果我需要訪問它們中的任何一個,我只需運行例如ssh server1
。
我需要備份/tmp/quarantine.list
每個服務器,所以我使用while
循環循環每一行。 這是我的代碼。
# Reading from /tmp/quarantine.list
while IFS= read -r list; do
if [ "$list" == "server4" ]; then
users="adminjoe"
fi
tempfile="${logdir}/rsync_$list.log"
SECONDS=0
set +x
if rsync -ca --stats --info=progress2 --remove-source-files $list:/home/${users}/backup/20* $backup_location/$list >> $tempfile 2>&1; then
ssh $list "find /home/${users}/backup/20* -type d -empty -delete"
else
echo "Error while running rsync"
exit 1
fi
set -x
elapsed_time=$SECONDS
transferred_size=$(gawk 'BEGIN { FS=":" } {gsub(/^[ \t]+|[ \t]+$/, "", $2)} /Total transferred file size/ { print $2 }' $tempfile | tr -cd "[:digit:]")
echo "Backup of $list done at $(/bin/date +'%Y-%m-%d_%H:%M:%S') --> $(bytesToHumanReadable $transferred_size)" | tee -a "${HOME}/backup.log"
echo "<b>$list --> $(bytesToHumanReadable $transferred_size)</b>" >> $konten
echo "$transferred_size $list" >> $summaryfile_size
echo "$elapsed_time $list" >> $summaryfile_time
done < "/tmp/quarantine.list"
rm "/tmp/quarantine.list"
問題是我的腳本只選擇/tmp/quarantine.list
的第一行,例如,如果隔離中有兩個遠程。
server2
server6
該腳本僅處理server2
,而server6
保持不變。 奇怪的是,當我將--dry-run
選項放入 rsync 時,它將/tmp/quarantine.list
處理/tmp/quarantine.list
中的所有行!
--dry-run
+ echo 'Backup of server2 done at 2021-10-28_16:55:26 --> 3.28 GB'
Backup of server2 done at 2021-10-28_16:55:26 --> 3.28 GB
++ bytesToHumanReadable 3280769140
++ S=("bytes" "kB" "MB" "GB" "TB" "PB" "EB" "YB" "ZB")
++ local i=3280769140 d= s=0 S
++ (( i > 1000 && s < 9-1 ))
++ printf -v d .%02d 14
++ i=3280769
++ s=1
++ (( i > 1000 && s < 9-1 ))
++ printf -v d .%02d 76
++ i=3280
++ s=2
++ (( i > 1000 && s < 9-1 ))
++ printf -v d .%02d 28
++ i=3
++ s=3
++ (( i > 1000 && s < 9-1 ))
++ echo '3.28 GB'
+ echo '<b>server2 --> 3.28 GB</b>'
+ echo '3280769140 server2'
+ echo '1883 server2'
+ IFS=
+ read -r list
+ rm /tmp/quarantine.list
--dry-run
+ echo 'Backup of server2 done at 2021-10-28_16:07:14 --> 3.28 GB'
Backup of server2 done at 2021-10-28_16:07:14 --> 3.28 GB
++ bytesToHumanReadable 3280769140
++ S=("bytes" "kB" "MB" "GB" "TB" "PB" "EB" "YB" "ZB")
++ local i=3280769140 d= s=0 S
++ (( i > 1000 && s < 9-1 ))
++ printf -v d .%02d 14
++ i=3280769
++ s=1
++ (( i > 1000 && s < 9-1 ))
++ printf -v d .%02d 76
++ i=3280
++ s=2
++ (( i > 1000 && s < 9-1 ))
++ printf -v d .%02d 28
++ i=3
++ s=3
++ (( i > 1000 && s < 9-1 ))
++ echo '3.28 GB'
+ echo '<b>server2 --> 3.28 GB</b>'
+ echo '3280769140 server2'
+ echo '32 server2'
+ IFS=
+ read -r list
+ '[' server6 == server4 ']'
如您所見,后者繼續使用server6
,而不是前者。 我只是想知道我在這里做錯了什么?
如果文件的最后一行不以換行符結尾,就會發生這種情況。 然后read
實際上會讀取該行,但它會返回一個非零狀態(參考: https : //www.gnu.org/software/bash/manual/bash.html#index-read )。 此非零狀態導致while
循環結束。
處理這個的慣用方法是:
while IFS= read -r list || [[ -n $list ]]; do
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.