1

我有一个数字数组 - sipPeers

我想遍历该数组并将每个值传递给命令

asterisk -rx "sip show peer 1234"- 其中 1234 显然是一个扩展名。

的输出通过sip show peer管道传输和操作两次以输出一个我想存储在第二个数组中的值sipUserAgent

temp="asterisk -rx \"sip show peer "${sipPeers[q]}"\" | grep Useragent |  awk \'{print$3}\'" #(1)
echo $temp #(2)
sipUserAgent[q]=$($temp) #(3)

一次迭代的输出将构造的命令生成为字符串 (2) 并尝试执行它 (3):

asterisk -rx "sip show peer 564" | grep Useragent | awk '{print }'
No such command '"sip' (type 'core show help sip' for other possible commands)

如果我复制并粘贴 echo'd 命令,它会运行,但是当脚本执行时,我会收到该错误。"当 scipt 执行字符时,字符在某处改变了含义?

4

3 回答 3

3

在执行命令之前,不要尝试将命令存储在变量中。这样做会遇到各种各样的问题,并且您会遇到其中的几个问题(请参阅BashFAQ #50:我正在尝试将命令放入变量中,但复杂的情况总是失败!)。只需将管道直接放在$( ... )它所属的位置即可:

sipUserAgent[q]=$(asterisk -rx "sip show peer ${sipPeers[q]}" | grep Useragent |  awk '{print $3}')
于 2013-03-07T11:43:14.250 回答
1

第一个问题

在步骤 (1) 中,您编写:awk \'{print$3}\'

在 (2) 的输出中,您会收到:awk '{print }'

问题是错过了逃脱$3

再次尝试awk \'{print\$3}\'在 (1)

第二个问题

sipUserAgent[q]=$($temp)尝试调用命令asterisk_-rx...

这肯定不是你想要的。解决方案是使用eval-help eval有关更多信息,请参阅。

例子

cmd="echo TEST"
$(${cmd})

给出:

测试:找不到命令

cmd="echo TEST"
eval ${cmd}

给出:

测试

代码风格注意事项

如果可能,最好避免通过eval. 如果适用,最好编写更简单的代码。所以你应该使用(正如戈登戴维森在另一个答案中提到的那样):

sipUserAgent[q]=$(asterisk -rx "sip show peer ${sipPeers[q]}" \
 | grep Useragent \
 |  awk '{print $3}' \
)    
于 2013-03-07T11:00:21.520 回答
0

我不知道在命令替换期间转义引号的方法,但一种解决方法是使用eval. 请参见以下示例:

$ cat test.sh 
echo "$1"
$ temp="./test.sh \"2 34 434\" "
$ echo "$temp"
./test.sh "2 34 434"
$ result=$(eval $temp)
$ echo "$result"
2 34 434
$ result=$($temp)
$ echo "$result"
"2

请注意,eval在大多数情况下,使用通常被认为是不好的做法,如果可以避免的话。

于 2013-03-07T11:19:54.797 回答