2

我需要运行这个命令

psql -c "create database $var with encoding 'unicode';" -U edumate template1

来自不同用户下的脚本。su 语法是su postre -c 'some command'这样的,所以需要另一个引号。另请注意 psql 命令$var内部有变量。

所以 'some command' = psql -c "create database $var with encoding 'unicode';" -U 教育模板1

并且“某些命令”也必须用引号引起来(我猜)

4

3 回答 3

7

任何时候你都可以使用一个技巧,让 shell 接受同时包含单引号和双引号的东西作为单个参数。因为 shell 不允许您转义引号,所以您需要将其转换为多个相邻的引号字符串,根据需要在单引号和双引号之间切换以保护里面的内容。这很丑陋,但它有效。例如,拥有

   He said "It's done"

是一个单一的参数,你可以邻接三个字符串:

   'He said "It'   - protect this substring with single quotes
   "'"             - protect this substring with double quotes
   's done"'       - protect this substring with single quotes

要得到:

   'He said "It'"'"'s done"'

在您的情况下,这会非常难看:

su postre -c 'psql -c "create database '"$var with encoding 'unicode';"'" -U edumate template1'
于 2010-08-06T04:13:47.380 回答
1

您可以尝试sudo代替su 例如

sudo psql -c "create database $var with encoding 'unicode';" -U edumate template1

(注意:我还没有完全测试过这个命令,因为我现在没有 psql)

于 2010-08-06T01:37:30.803 回答
0

我会将其输入到脚本文件中(将其输入到 vi 等编辑器中并将其保存到文件中)。然后, chmod +x 然后做你的su -c '<filename>'

如果您不想将其保存到文件中,那么您必须使用\"\'在命令中转义引号,具体取决于您决定使用哪个引号su -c

于 2010-08-06T01:37:56.090 回答