에코 및 변수 확장

에코 및 변수 확장

스크립트를 생성하는 스크립트가 있습니다.

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

변수는 빌드 스크립트에서 큰따옴표로 묶여 있으므로 확장을 방지하기 위해 run 외부에 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

답변2

조로바님, 감사합니다.

이 변수는 빌드 스크립트에서 큰따옴표로 묶여 있으므로 외부 에코를 실행할 때 확장됩니다. 확장을 방지하기 위한 백슬래시 달러 기호입니다. 또한 생성된 스크립트가 실행될 때 명령 대체가 실행되기를 원하는 것처럼 보이지만 현재는 스크립트가 생성될 때 실행됩니다. 이 문제를 해결하려면 해당 줄의 모든 달러 기호를 백슬래시해야 합니다. ....이것은 효과가 있었습니다 :)

관련 정보