所以我有一个 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"
# ..^............^^............^^...........^^................^^....^^..............^^..^.^.....^