立即逃离两个美元符号

x3n*_*r0s 2 bash

我有一个在 Bash 脚本中运行的 SQL 语句。它包含连续两个美元符号的实例,例如:

psql -U $username -h $DATABASE_HOST $DATABASE_NAME -c "DO $$ DECLARE myVar varchar; END$$"
Run Code Online (Sandbox Code Playgroud)

怎样才能摆脱这两种情况呢?

Tom*_*ech 5

只需在每个前面加一个反斜杠即可:

psql -U "$username" -h "$DATABASE_HOST" "$DATABASE_NAME" -c \
  "DO \$\$ DECLARE myVar varchar; END\$\$"
Run Code Online (Sandbox Code Playgroud)

(实际上,由于第二个$后面跟着空格,shell 不会尝试扩展它,但第二个反斜杠不会造成伤害)。

或者,在字符串周围使用单引号,以便 shell 按字面解释它:

psql -U "$username" -h "$DATABASE_HOST" "$DATABASE_NAME" -c \
  'DO $$ DECLARE myVar varchar; END$$'
Run Code Online (Sandbox Code Playgroud)

正如Biffen在评论中所说,始终引用变量是一个好习惯。

如果您发现$$仍在扩展,那么我猜这段代码被解析了两次。在这种情况下,您需要\\\$\\\$在双引号内进行双转义 ( ),或\$\$在单引号内使用(或者更好的是,如果不需要,请避免解析两次)。