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
中的命令答案 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'`