エコーと変数の拡張

エコーと変数の拡張

スクリプトを生成するスクリプトがあります。

echo '#!/bin/sh'>>rule-1  
echo 'compare() (IFS=" "'>>rule-1  
echo '  exec awk "BEGIN{if (!($*)) exit(1)}"'>>rule-1  
echo ')'>>rule-1  
echo '#Bepaal  percentage memory used.'>>rule-1  
echo "PERC_MEM_USED=$(free | grep Mem | awk '{print $3*100/$2}')">>rule-1  
echo "echo 'Percentage memory used :'">>rule-1  
echo 'echo $PERC_MEM_USED'>>rule-1  
echo 'if compare "$PERC_MEM_USED > 90";'>>rule-1  
echo 'then'>>rule-1  
echo "   echo 'Percentage memory is high.'">>rule-1 
echo '   # PSM data'>>rule-1  
echo "   echo  '(PSM)'">>rule-1  
echo "   echo '(CATEGORY)WARNING(/CATEGORY)'">>rule-1  
echo "   echo '(MESSAGE)Percentage memory is high '$PERC_MEM_USED', please contact ---(MESSAGE)'">>rule-1  
echo "   echo '(/PSM)'">>rule-1  
echo 'fi'>>rule-1

実行すると、生成されたスクリプトは次のようになります。

#!/bin/sh  
compare() (IFS=" "  
  exec awk "BEGIN{if (!($*)) exit(1)}"  
)  
#Bepaal  percentage memory used.  
PERC_MEM_USED=11.9055  
echo 'Percentage memory used :'  
echo $PERC_MEM_USED  
if compare "$PERC_MEM_USED > 90";  
then  
   echo 'Percentage memory is high.'  
   echo '(PSM)'  
   echo '(CATEGORY)WARNING(/CATEGORY)'  
   echo '(MESSAGE)Percentage memory is high '', please contact ---(MESSAGE)'  
   echo '(/PSM)'  
fi  

変数は$PERC_MEM_USED行では拡張されません(MESSAGE)。どんなアイデアがありますか?

ベストアンサー1

変数はビルドスクリプトで二重引用符で囲まれているため、拡張を防ぐために実行外のドルecho記号をバックスラッシュします。また、生成されたスクリプトが実行されたときにコマンド置換が実行されることを望むように見えますが、現在はスクリプトが生成されたときに実行されます。この問題を解決するには、その行のすべてのドル記号をバックスラッシュする必要があります。

また、ブロック全体を中かっこで囲み、各行に追加する代わりに、閉じる中括弧の後に(またはおそらく?)>>rule-1を追加できます。>> rule-1>

また、HERE文書に切り替えると、行ごとにエコーと引用符を繰り返す必要はありません。

#!/bin/bash
cat <<'EOF' > rule-1
#!/bin/sh
compare() (IFS=" "
  exec awk "BEGIN{if (!($*)) exit(1)}"
)
#Bepaal  percentage memory used.
PERC_MEM_USED=$(free | grep Mem | awk '{print $3*100/$2}')
echo 'Percentage memory used :'
echo $PERC_MEM_USED
if compare "$PERC_MEM_USED > 90";
then
   echo 'Percentage memory is high.'
   # PSM data
   echo  '(PSM)'
   echo '(CATEGORY)WARNING(/CATEGORY)'
   echo '(MESSAGE)Percentage memory is high '$PERC_MEM_USED', please contact ---(MESSAGE)'
   echo '(/PSM)'
fi
EOF

おすすめ記事