在双引号 shell 命令中转义 $

Escaping $ in double quoted shell command

我不知道如何在下面的 shell 语句中屏蔽 $。任何 感谢帮助!

#!/bin/bash
    
local result=`su -m user1 -c "sqlplus -s / as sysdba <<-EOF
  SELECT cdb FROM v$database;
  exit
EOF"
`

你应该单引号 EOF,例如<<-'EOF'

但是您还需要 运行 使用 $() 而不是反引号的子流程。

#!/bin/bash
    
local result=$(su -m user1 -c "sqlplus -s / as sysdba <<-'EOF'
  SELECT cdb FROM v$database;
  exit
EOF")

BashFAQ/082 报告“反引号内的反斜杠 (\) 以不明显的方式处理”

$ echo "`echo \a`" "$(echo \a)"
a \a
$ echo "`echo \\a`" "$(echo \\a)"
\a \a
# Note that this is true for *single quotes* too!
$ foo=`echo '\'`; bar=$(echo '\'); echo "foo is $foo, bar is $bar" 
foo is \, bar is \

因此,如果您不想使用 $(...),则需要 2 个反斜杠,即 \$database,如果您不想使用 $(...) 或单引号 EOF,则不需要少于 6 个反斜杠,即 \\\$database

不要使用反引号。使用 #(...).

local result=$(su -m user1 -c "sqlplus -s / as sysdba <<-EOF
  SELECT cdb FROM v\$database;
  exit
EOF
")

但是无论如何,如果您不想展开任何内容,请使用单引号。

local result=$(su -m user1 -c 'sqlplus -s / as sysdba <<-EOF
  SELECT cdb FROM v$database;
  exit
EOF
')

而且您可以在父 shell 中重定向 - 这会更简单 - 并使用带引号的停用词。

local result=$(su -m user1 -c 'sqlplus -s / as sysdba' <<-'EOF'
  SELECT cdb FROM v$database;
  exit
EOF
")