如何在报价中扩展报价中的bash参数?

Gho*_*r21 0 bash

这是我正在尝试做的bash脚本行:

psql -c 'GRANT ALL PRIVILEGES ON DATABASE "$PROJECT_ID" to "$PROJECT_ID";'
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它不起作用,因为bash不会解释单引号内的任何内容.交换单引号和双引号不会出于同样的原因.

解?

编辑:我所说的关于交换的内容是不正确的 - 这对我来说是一个糟糕的假设; 但是,由于确保psql语句仍然有效,不想交换.

Cha*_*ffy 5

如果您确定此SQL语句中的双引号是正确的:

psql -c 'GRANT ALL PRIVILEGES ON DATABASE "'"$PROJECT_ID"'" to "'"$PROJECT_ID"'";'
Run Code Online (Sandbox Code Playgroud)

这就是为什么这样做的原因:字符串引用shell是在逐个字符的基础上完成的; 我们不需要以相同的方式引用整个字符串,因此可以将几个不同引用的字符串子集连接在一起.

在这种情况下,那些子串是:

'GRANT ALL PRIVILEGES ON DATABASE "'
"$PROJECT_ID"
'" to "'
"$PROJECT_ID"
'";'
Run Code Online (Sandbox Code Playgroud)

因此,当我们想要将文字"作为字符串的一部分传递时,我们将它用单引号括起来; 当我们想要扩展变量时,我们将它放在双引号中.

  • 或者:`psql -c"将DATABASE \"$ PROJECT_ID \"上的所有特权授予\"$ PROJECT_ID \";"` (2认同)