gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:17:06 25 4
gpt4 key购买 nike

我似乎遇到了一个特定于 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

这是输出(请注意示例 2 的不同之处):
Example 1:
The 'quick' brown fox "jumped" over the lazy dog.

Example 2:
The "quick" brown fox "jumped" over the lazy dog.

Example 3:
The 'quick' brown fox "jumped" over the lazy dog.
'"替换似乎发生在命令运行之前。在实际上下文中,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
)

不同 shell 的输出:
  • Linux KSH M 版 1993-12-28 q
  • Linux Bash 3.00.15(1)

  • (注意:按预期工作)
     /home/jrw32982 "/home/jrw32982" '/home/jrw32982'
    /home/jrw32982 "/home/jrw32982" '/home/jrw32982'
    /home/jrw32982 "/home/jrw32982" '/home/jrw32982'
  • AIX 版本 M-11/16/88f
  • Solaris 版本 M-11/16/88i

  • (注意:单引号替换为双引号,变量未替换)
     /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
    )
  • 在函数中使用 here-file 而不是直接使用
    fn() {
    cat <<EOF
    $abc "$abc" '$abc'
    EOF
    }
    abc=xyz
    x=$(fn)
  • 关于shell - ksh88 在heredocs 中将单引号更改为双引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25569857/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com