그래서 다음과 같은 Bash 스크립트가 있습니다.
#!/bin/bash
extentemplate="
exten => `$prevchannel`,n,Queue(`$prevchannelname`)\
exten => `$prevchannel`,n,Hangup()\
\
;`$channelname`\
exten => `$channel`,1,Answer()\
exten => `$channel`,n,ResetCDR()\
exten => `$channel`,n,Set(CDR(accountcode)=`$accountcode`)\
exten => `$channel`,n,Set(CDR(userfield)=inbound)\
exten => `$channel`,n,Set(MONITOR_FILENAME=`$channelname`_\${UNIQUEID})\
exten => `$channel`,n,Set(CALLERID(name)=`$channelname`)\
exten => `$channel`,n,Queue(`$channelname`)\
exten => `$channel`,n,Hangup()\
"
FILE="/etc/asterisk/extensions.pap.confTEST"
args=("$@")
operation=("${args[0]}")
channel=("${args[1]}")
accountcode=("${args[2]}")
channelname=("${args[3]}")
music=("${args[6]}")
prevchannel=("${args[4]}")
prevchannelname=("${args[5]}")
if [ $operation = "add" ] ; then
sed "s/exten => `$prevchannel`,n,Queue(`$prevchannelname`)/`$extentemplate`/" $FILE
fi
지금까지 본 답변에 따르면 올바르게 대체할 수 있어야 하지만 분명히 뭔가 올바르게 또는 다른 것을 이스케이프 처리하지는 않습니다.
내 매개변수에는 특수 문자가 포함되어 있지 않습니다.
"종료되지 않은 's' 명령" 오류로 인해 실패하는 이유를 아는 사람이 있습니까?
답변1
매개변수에서 변수를 추출해야 합니다.첫 번째템플릿에서 바꿀 값을 가져옵니다. 당신은 매우 이상한 방식으로 이 작업을 수행합니다.
args=("$@")
operation=("${args[0]}")
channel=("${args[1]}")
accountcode=("${args[2]}")
channelname=("${args[3]}")
music=("${args[6]}")
prevchannel=("${args[4]}")
prevchannelname=("${args[5]}")
operation
하나의 요소를 포함하는 배열입니다. Bash는 $operation
이를 정확하게 처리합니다 ${operation[0]}
. 왜 안 될까요?
operation=$1
channel=$2
accountcode=$3
channelname=$4
prevchannel=$5
prevchannelname=$6
music=$7
템플릿을 선언할 때 모든 백틱을 이스케이프 처리하도록 주의해야 합니다. 그렇지 않으면 다음과 같은 오류가 발생합니다.명령 대체.
$ extentemplate="\
exten => \`$prevchannel\`,n,Queue(\`$prevchannelname\`)\
exten => \`$prevchannel\`,n,Hangup()\
\
;\`$channelname\`\
exten => \`$channel\`,1,Answer()\
exten => \`$channel\`,n,ResetCDR()\
exten => \`$channel\`,n,Set(CDR(accountcode)=\`$accountcode\`)\
exten => \`$channel\`,n,Set(CDR(userfield)=inbound)\
exten => \`$channel\`,n,Set(MONITOR_FILENAME=\`$channelname\`_\${UNIQUEID})\
exten => \`$channel\`,n,Set(CALLERID(name)=\`$channelname\`)\
exten => \`$channel\`,n,Queue(\`$channelname\`)\
exten => \`$channel\`,n,Hangup()\
"
이 모든 줄 연속은 템플릿 문자열에 실제 개행 문자가 없음을 의미합니다.
그 다음에
sed "s/exten => `$prevchannel`,n,Queue(`$prevchannelname`)/`$extentemplate`/" $FILE
이번에도 큰따옴표로 인해 변수 및 명령 대체가 발생합니다. 변수를 바꾸려면 작은 따옴표와 큰 따옴표가 필요합니다
sed 's/exten => `'"$prevchannel"'`,n,Queue(`'"$prevchannelname"'`)/`'"$extentemplate"'`/' "$FILE"
# ..^............^^............^^...........^^................^^....^^..............^^..^.^.....^