[英]echo and printf don't print variables assigned in a loop in bash
我有一個帶有 while 循環的腳本,可以讀取文件並收集一些值。 循環停止后,可以再次操作一些變量:
POWER=$(expect cisco_stats lab-asr9k-2 | awk '!/Total:/ || ++n <= 1' | egrep -v "show envi|CEST|RSP[0-1]")
while read -r line
do
if [[ $line == "Total:"* ]]
then t_use=$(echo "$line" | awk '{print $NF}')
continue
fi
if [[ $line == *"Type:"* ]]
then acdc=$(echo "$line" | awk '{print $NF}')
continue
fi
if [[ $line == "Total Power Capacity:"* ]]
then t_cap=$(echo "$line" | awk '{print $NF}')
continue
fi
if [[ $line == "Supply Protected Capacity"* ]]
then np1_av=$(echo "$line" | awk '{print $NF}')
npn_av="---"
break
fi
if [[ $line == "N+1 Supply Protected"* ]]
then np1_av=$(echo "$line" | awk '{print $NF}')
continue
fi
if [[ $line == "N+N Supply Protected"* ]]
then npn_av=$(echo "$line" | awk '{print $NF}')
break
fi
done <<< "$POWER"
if [[ $np1_av == *"Protected"* ]]
then np1_av="Not_Pr."
fi
if [[ $npn_av == *"Protected"* ]]
then npn_av="Not_Pr."
elif [ -z ${npn_av+x} ]
then npn_av="---"
fi
echo "$t_cap"
echo "$t_use"
echo "$acdc"
echo "$np1_av"
echo "$npn_av"
printf "%-10s %-10s %-10s %-10s %-10s\n" "Type" "Tot.cap." "In use" "N+1 prt." "N+N prt."
printf "%-10s %-10s %-10s %-10s %-10s\n" "$acdc" "$t_cap" "$t_use" "$np1_av" "$npn_av"
如果我分別回顯每個變量 - 我會看到正確的結果。 如果我嘗試在一行中 echo 或 printf 變量,我只會看到在循環之外設置的變量:
4200W
1266.7
DC
Not_Pr.
---
Type Tot.cap. In use N+1 prt. N+N prt.
Not_Pr.
要刪除文件結尾的 DOS 行,您可以使用它;
POWER=$(expect cisco_stats lab-asr9k-2 | awk '!/Total:/ || ++n <= 1' | egrep -v "show envi|CEST|RSP[0-1]" | sed 's/\r//' )
sed 's/\\r//'
是刪除文件中的回車
例如;
#!/bin/bash
# add carriage return variables
t_cap=$(echo '4200W' | sed 's/$/\r/')
t_use=$(echo 'DC' | sed 's/$/\r/')
acdc=$(echo 'Not_Pr.' | sed 's/$/\r/')
npn_av=$(echo '---' | sed 's/$/\r/')
np1_av=$(echo 'np1_av' | sed 's/$/\r/')
printf "%-10s %-10s %-10s %-10s %-10s\n" "Type" "Tot.cap." "In use" "N+1 prt." "N+N prt."
printf "%-10s %-10s %-10s %-10s %-10s\n" "$acdc" "$t_cap" "$t_use" "$np1_av" "$npn_av"
# remove carriage returns
t_cap=$(echo $t_cap | sed 's/\r//')
t_use=$(echo $t_use | sed 's/\r//')
acdc=$(echo $acdc | sed 's/\r//')
np1_av=$(echo $np1_av | sed 's/\r//')
npn_av=$(echo $npn_av | sed 's/\r//')
printf "%-10s %-10s %-10s %-10s %-10s\n" "Type" "Tot.cap." "In use" "N+1 prt." "N+N prt."
printf "%-10s %-10s %-10s %-10s %-10s\n" "$acdc" "$t_cap" "$t_use" "$np1_av" "$npn_av"
運行時; 第二個 printf 的工作原理如下;
user@host:/tmp/test$ ./test.sh
Type Tot.cap. In use N+1 prt. N+N prt.
- np1_av
Type Tot.cap. In use N+1 prt. N+N prt.
Not_Pr. 4200W DC np1_av ---
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.