Por que o sed está voltando com o comando “unterminated '?

0

Então eu tenho um script Bash que se parece com isso:

#!/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

De acordo com as respostas que eu vi até agora, isso deve ser capaz de ser substituído corretamente, mas aparentemente eu não escapei de uma coisa ou outra corretamente.

Meus argumentos não contêm caracteres especiais.

Alguém sabe por que isso está falhando com o erro "comando não terminado"?

    
por Alex 01.09.2015 / 17:22

1 resposta

1

Você precisará extrair as variáveis dos argumentos primeiro para obter os valores substituídos no modelo. Você faz isso de uma maneira muito estranha:

args=("$@")

operation=("${args[0]}")
channel=("${args[1]}")
accountcode=("${args[2]}")
channelname=("${args[3]}")
music=("${args[6]}")
prevchannel=("${args[4]}")
prevchannelname=("${args[5]}")

operation é uma matriz que contém um elemento. O Bash processa $operation como ${operation[0]} . Por que não isso?

operation=$1
channel=$2
accountcode=$3
channelname=$4
prevchannel=$5
prevchannelname=$6
music=$7

Ao declarar o seu template, você deve ter cuidado para escapar de todos os backticks, caso contrário você obtém substituição de comando .

$ 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()\
"

Todas essas continuações de linha significam que você não tem nenhuma nova linha na sua cadeia de modelos.

Então

sed "s/exten => '$prevchannel',n,Queue('$prevchannelname')/'$extentemplate'/" $FILE

Novamente, devido às aspas duplas, você está obtendo a substituição de variáveis e comandos. Você precisará de aspas simples e, em seguida, aspas duplas para substituir as variáveis

sed 's/exten => ''"$prevchannel"'',n,Queue(''"$prevchannelname"'')/''"$extentemplate"''/' "$FILE"
# ..^............^^............^^...........^^................^^....^^..............^^..^.^.....^
    
por 01.09.2015 / 20:44

Tags