String Bash,在命令构造中转义引号,

String Bash,在命令构造中转义引号,,string,bash,String,Bash,我有一个数字数组-sipPeers 我想通过该数组进行迭代,并将每个值传递到命令中 星号-rx“sip显示对等1234”-其中1234显然是一个扩展 sip show peer的输出通过管道传输并操作两次,以输出一个值,我希望将其存储在第二个数组sipUserAgent中 temp="asterisk -rx \"sip show peer "${sipPeers[q]}"\" | grep Useragent | awk \'{print$3}\'" #(1) echo $temp #(2)

我有一个数字数组-
sipPeers

我想通过该数组进行迭代,并将每个值传递到命令中

星号-rx“sip显示对等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):

如果我复制并粘贴echo的命令,它就会运行,但是当脚本执行时,我会得到那个错误。在某个地方,
字符在scipt执行时会改变其含义?

第一个问题 在步骤(1)中编写:
awk\'{print$3}\'

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

问题是错过了逃逸
$3

使用(1)中的
awk\'{print\$3}\\
重试

第二个问题
sipUserAgent[q]=$($temp)
尝试调用命令
asterisk\uux…

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

实例 给出:

测试:未找到命令

给出:

试验

关于代码样式的注意事项 如果可能,最好通过
eval
避免复杂的命令创建和执行。 更好的方法是编写更简单的代码(如果适用)。 因此,您应该使用(戈登·戴维森在另一个回答中也提到):

第一个问题 在步骤(1)中编写:
awk\'{print$3}\'

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

问题是错过了逃逸
$3

使用(1)中的
awk\'{print\$3}\\
重试

第二个问题
sipUserAgent[q]=$($temp)
尝试调用命令
asterisk\uux…

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

实例 给出:

测试:未找到命令

给出:

试验

关于代码样式的注意事项 如果可能,最好通过
eval
避免复杂的命令创建和执行。 更好的方法是编写更简单的代码(如果适用)。 因此,您应该使用(戈登·戴维森在另一个回答中也提到):


我不知道在命令替换期间如何转义引号,但一种解决方法是使用
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
通常被认为是不好的做法。

我不知道在命令替换过程中如何转义引号,但解决方法是使用
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
通常被认为是不好的做法。

在执行命令之前不要尝试将命令存储在变量中。执行此操作时会遇到各种各样的问题,并且会遇到一些问题(请参阅)。只需将管道直接放在
$(…)中即可
它所属的位置:

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

在执行该命令之前,不要尝试将其存储在变量中。执行该命令时会遇到各种各样的问题,并且您会遇到一些问题(请参阅)。只需将管道直接放在它所属的
$(…)
中即可:

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

谢谢,我试过使用fixed awk命令,但问题出在前面的命令(2)中。星号传递的是双引号,而不仅仅是引号中的值。我得到的错误是“没有这样的命令”“sip”“”。双引号是通过sip命令传入的。谢谢你,德克,这解决了我的问题。我将尝试这里发布的每一个解决方案,并向您汇报,但目前评估方法有效。SipUserAgent[q]=$(eval$temp)我已经将这一条标记为正确,因为我从中了解到了更多,但原则上我认为戈登的答案基本上是下一次更好的选择。:)谢谢大家@鲁道夫:我把你的评论写在了答案里。谢谢,我试过使用fixed awk命令,但问题在前面的命令(2)中。星号传递的是双引号,而不仅仅是引号中的值。我得到的错误是“没有这样的命令”“sip”“。双引号与命令sip一起传递。谢谢你,德克,这解决了我的问题。我将尝试这里发布的每个解决方案并报告,但目前eval方法有效。SipUserAgent[q]=$(eval$temp)我认为这一点是正确的,因为我从中学到了更多,但原则上我认为戈登的回答基本上是下次采取的更好的方法。:)谢谢大家!@Rudolf:我把你的评论写在了答案中。
$ 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
sipUserAgent[q]=$(asterisk -rx "sip show peer ${sipPeers[q]}" | grep Useragent |  awk '{print $3}')