2016-10-06 4 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" 

私は別に、各変数をエコー場合 - 私は正しい結果を参照してください。私はエコーや1行で変数を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" 

これを実行すると、 2番目の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行を削除し、それだけで動作します。どうもありがとうございます。 ( –

関連する問題