2014-01-11 126 views
1

我是一个新手,shell脚本,我有以下问题:参数替换

如果我进入外壳

cat << EOF 
'"$10^2$"' 
EOF 

我希望(和希望)得到的东西像

"$10^2$" 

,但实际上它使用的参数替换和我

'"0^2"' 

为什么它参数替换(我用单引号!?)?我怎样才能得到理想的输出?

回答

0

逃离美元符号:

cat << EOF 
'"\$10^2$"' 
EOF 

OUTPUT:

"$10^2$" 

否则$1是由外壳扩展,仅仅只显示为空字符串输出和所得到的输出为'"0^2$"'

更新:否则你SE这种形式的定界符,以避免变量扩展:

cat <<'EOF' 
'"$10^2$"' 
EOF 
'"$10^2$"' 

说明:作为每人的bash:

<<[-]word 
    here-document 
delimiter 

否参数扩展,命令替换,算术扩展,或在字进行路径扩展。如果引用了单词中的任何字符,则 分隔符是单词上的引号删除的结果,并且此文档中的行不会被展开。 If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion.在后一种情况下,字符序列\将被忽略,并且必须使用 \以引用字符\,$和`。

请参阅上面的粗体文本,以解释为什么变量在您的示例中得到扩展,但不是当我使用引用'EOF'时。

+0

谢谢你的解决方案。为什么扩展,尽管我把表达式放在单引号中? – user3185454

+0

现在查看更新的答案。 – anubhava

+0

好吧,这听起来不错:)所以,尽管我把表达式放在** single **引号中,bash解释了字符串?我原本以为它会被解释,当我把它放在双引号中,并且在我把它放在单引号中时不会被解释... – user3185454