sedが「終了していない 's'コマンド」を返すのはなぜですか?

sedが「終了していない 's'コマンド」を返すのはなぜですか?

だから、次のような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]}")

operation1 つの要素を含む配列です。 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"
# ..^............^^............^^...........^^................^^....^^..............^^..^.^.....^

おすすめ記事