Bash引用问题

时间:2011-02-02 10:10:08

标签: bash

A="echo 'q'"

$A 

我得到了结果'q'

但如果我直接输入echo'q',那就是q(没有单引号)

所以,我想知道在双引号中面对单引号时bash会遵循什么规则。

最初的问题是

A="curl http://123.196.125.62/send -H 'Host: poj.org' -e http://poj.org/send"

$A

我卷曲了:(6)无法解析主人'poj.org''

如果我只是在终端输入命令就可以了。

P.S。我想使用$ A来排除A

中的命令

3 个答案:

答案 0 :(得分:6)

请参阅BashFAQ/050:我正在尝试将命令放在变量中,但复杂的情况总是会失败!

最好避免将命令放在变量中,因为你经历过的原因,等等。

你应该使用一个函数并传递参数。

为什么要这样做而不是直接执行命令?

如果必须这样做,请使用数组:

A=(curl http://123.196.125.62/send -H 'Host: poj.org' -e http://poj.org/send)
${A[@]}

关于双引号内单引号的处理,它们按字面处理,并作为字符串其余部分的一部分。以下是man bash的相关段落:

  

用双引号括起字符可保留字面值          引号中的所有字符,$,`,\和的除外,          启用历史记录扩展时,!字符$和`保留          它们在双引号内的特殊含义。反斜杠保留了它          只有当后跟下列其中一个字符时才有特殊含义:          $,`,“,\或<newline>。双引号可以引用双倍          引用前面的反斜杠。如果启用,则扩展历史记录          将被执行,除非!出现在双引号中的是转义          使用反斜杠。之前的反斜杠!没有删除。

答案 1 :(得分:4)

如果你想“保存”一个命令以便以后执行,你可以 NOT 想要一个变量。你想要一个功能。

a() { curl http://123.196.125.62/send -H 'Host: poj.org' -e http://poj.org/send; }

将代码置于变量错误,因为变量是数据而不是代码的容器。此外,您发现问题是因为$A NOT 执行A中的bash代码,它真正做的是将A的值拆分为单词,然后它对这些单词执行 Pathname Expansion ,并且作为这两个操作的结果,它执行由第一个结果单词命名的程序,并将其他单词作为参数传递。在您的特定情况下,会发生这种情况(我使用[]来表示“单位”):

A:                        [echo 'q']
after wordsplitting:      [echo] ['q']
after pathname expansion: [echo] ['q']

现在bash会查找名为echo的程序,并将参数'q'传递给它。

这不是执行bash代码,因为如果你执行echo 'q'作为bash代码,bash会在完成后删除单引号。同样,你不能做管道,重定向等。像这样,因为它们也是bash语法(就像你的单引号一样)。

回顾:从不将代码放入bash变量中。 永远不会保持参数不带引号(如果你认为这样做会修复某些东西,你错了,你只是让事情变得更糟,去解决真正的问题)。解决方案是使用function

答案 2 :(得分:2)

在这种情况下,你最好使用反引号:

A=`curl http://123.196.125.62/send -H 'Host: poj.org' -e 'http://poj.org/send'`