命令中有多个引号

时间:2015-11-08 17:40:52

标签: bash

我正在尝试使用多个引号执行命令,但似乎有问题:

sudo su - postgres -c 'psql -U postgres -c "alter user postgres with password 'dummy';"'
ERROR:  syntax error at or near "dummy"
LINE 1: alter user postgres with password dummy;
                                          ^

如果我分两步点击相同的命令,没有问题:

sudo su - postgres                                                                      
postgres@courgette:~$ psql -U postgres -c "alter user postgres with password 'dummy';"
ALTER ROLE

如何正确引用一行中的“虚拟”首先例证?

2 个答案:

答案 0 :(得分:5)

the Bash Reference Manual, §3.1.2.2 "Single Quotes"

  

用单引号括起字符(''')会保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。

所以,你有三个合理的选择:

  • 你可以退出单引号位,只需添加双引号单引号:

    sudo su - postgres -c 'psql -U postgres -c "alter user postgres with password '"'"'dummy'"'"';"'
    
  • 您可以使用双引号"...",在这种情况下,您必须转义任何内部双引号:

    sudo su - postgres -c "psql -U postgres -c \"alter user postgres with password 'dummy';\""
    
  • 您可以使用$'...'(与'...'和"..."不同,因为它支持各种C风格的转义序列),在这种情况下,您必须逃避任何内部单引号:

    sudo su - postgres -c $'psql -U postgres -c "alter user postgres with password \'dummy\';"'
    

答案 1 :(得分:2)

不要使用su运行sudo,而是直接运行psql。这消除了一个级别的引号,以及需要使用-U选项指定用户:

sudo -u postgres psql "alter user postgres with password 'dummy';"

如果由于某种原因无法做到这一点,请使用此处的文档来消除引用级别:

sudo su - postgres -U postgres <<EOF
alter user postgres with password 'dummy'
EOF