Shell ksh88在heredocs中将单引号更改为双引号?
我似乎遇到了一个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=$
#!/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
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)