2016-10-06 50 views
1

我有一个带while循环的脚本,它读取一个文件并收集一些值。循环停止后,一些变量可以再次被操纵:echo和printf不打印分配在bash循环中的变量

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" 

如果我分别回显每个变量 - 我看到正确的结果。如果我尝试回声或在一行printf的变量,我只看到哪里设置循环之外的变量:

4200W 
1266.7 
DC 
Not_Pr. 
--- 
Type  Tot.cap. In use  N+1 prt. N+N prt. 
    Not_Pr. 

+0

您的脚本中或您正在读取的命令的输出中有DOS行结束符。 – chepner

+0

你是说这是问题吗?我怎样才能改变这个? –

+0

http://stackoverflow.com/tags/bash/info – chepner

回答

1

删除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的作用如下:

[email protected]:/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  --- 
+0

谢谢。我在设置POWER变量时删除了DOS行结尾,并且它正常工作。非常感谢。 ( –