Shell ksh88在heredocs中将单引号更改为双引号?

Shell ksh88在heredocs中将单引号更改为双引号?,shell,ksh,aix,Shell,Ksh,Aix,我似乎遇到了一个ksh88特有的问题,即将单引号改为双引号,但仅在涉及heredocs和命令替换的特定情况下 下面是一个例子: #!/bin/ksh # This example works correctly echo "Example 1:" cat <<EOF The 'quick' brown fox "jumped" over the lazy dog. EOF echo # This example is broken echo "Example 2:" var=$

我似乎遇到了一个ksh88特有的问题,即将单引号改为双引号,但仅在涉及heredocs和命令替换的特定情况下

下面是一个例子:

#!/bin/ksh

# This example works correctly
echo "Example 1:"
cat <<EOF
The 'quick' brown fox "jumped" over the lazy dog.
EOF
echo


# This example is broken
echo "Example 2:"
var=$(cat <<EOF
The 'quick' brown fox "jumped" over the lazy dog.
EOF)
echo "${var}"
echo


# This example works correctly
echo "Example 3:"
var=`cat <<EOF
The 'quick' brown fox "jumped" over the lazy dog.
EOF`
echo "${var}"
echo
的替换似乎在命令运行之前发生。在实际上下文中,heredoc将SQL传递给Oracle。通过将
更改为
,字符串将被转换为标识符,从而中断SQL。在执行上述代码期间启用xtrace也可以观察到这一点

如何在不使用反勾号的情况下防止上述代码段中的
转换



编辑:绘图变厚。用反勾符号替换命令替换名
$(…)
并不会将单引号替换为双引号。因此(可选)问题二:为什么?

这是我几年前发现同一个错误时的注意事项

测试脚本:

#!/bin/ksh
cat <<EOF
  $PWD "$PWD" '$PWD'
EOF
echo `cat <<EOF
  $PWD "$PWD" '$PWD'
EOF
`
echo $(cat <<EOF
  $PWD "$PWD" '$PWD'
EOF
)
  • AIX版本M-11/16/88f
  • Solaris版本M-11/16/88i
(注:单引号替换为双引号,变量未替换)

解决办法:

  • 从here文件外部计算单引号字符串

    abc=xyz
    STR="'$abc'"
    x=$( cat <<EOF
      $abc "$abc" $STR
    EOF
    )
    
    abc=xyz
    STR=“$abc”
    
    x=$(cat所描述的行为听起来像一个bug。将勾号改回
    $(…)
    不应更改输出的内容。您能否升级到?@JonathanLeffler?如果这是一个bug,它看起来非常危险。至于切换到ksh93,这不一定是一个选项。实际脚本需要在多个不同版本的AIX和Solaris服务器上运行。少数有ksh93,但大多数只有ksh88。@AdrianFrühwirth-
    echo${var}
    echo“${var}"
    在上述所有情况下都会产生相同的结果。如果启用xtrace
    #!/bin/ksh-x
    甚至在显示
    var
    之前,您就可以看到它的值。+1表示模型问题。如果只是这样的话!您似乎知道您的ksh,但我在Solaris和AIX方面的经验是,您可能必须使用备用路径,甚至是备用路径我,比如
    dtksh
    来访问ksh93。(我不记得我在AIX上做了什么,但它就在那里)。祝你好运。其他人也看到了这一点。From:“在ksh88中,至少从发行版a到I,你必须意识到$()中有一个微妙的引用问题。嵌入的here文档中的单引号被转换为双引号。”。
     /home/jrw32982 "/home/jrw32982" '/home/jrw32982'
     /home/jrw32982 "/home/jrw32982" '/home/jrw32982'
     /home/jrw32982 "/home/jrw32982" '/home/jrw32982'
    
     /home/jrw32982 "/home/jrw32982" '/home/jrw32982'
     /home/jrw32982 "/home/jrw32982" '/home/jrw32982'
     /home/jrw32982 "/home/jrw32982" "$PWD"
    
    abc=xyz
    STR="'$abc'"
    x=$( cat <<EOF
      $abc "$abc" $STR
    EOF
    )
    
    fn() {
      cat <<EOF
        $abc "$abc" '$abc'
    EOF
    }
    abc=xyz
    x=$(fn)