スクリプトを生成するスクリプトがあります。
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