我正在创建一个脚本来从头开始配置服务器,其中一部分是 postgres。我遇到的问题之一是,如果随机密码有感叹号,它似乎会被 bash 扩展:
我想运行以下 postgres 命令:
alter user root with encrypted password 'D1£example!2eNZY6P$9examplePassword';
但从 bash 脚本中使用:
psql -c "command;"
使用:
runuser -l postgres -c "above cammand"
所以我明白了:
psqlcmd1="psql -c \"""alter user root with encrypted password 'D1£LF1A\!2eNZY6P$9examplePassword';""\""
runuser -l postgres -c "$psqlcmd1"
但 bash 扩展了 !即使它在单引号之间?
另外,我尝试过以下方法基于此如果运气不好的话,要转义单引号:
runuser -l postgres -c "psql -c 'alter user root with encrypted password '"'"'D1£example!2eNZY6P$9examplePassword'"'"';'"
答案1
psqlcmd1="psql -c \"""alter user root with encrypted password 'D1£LF1A\!2eNZY6P$9examplePassword';""\""
关闭历史扩展后, 的psqlcmd1
值为
psql -c "alter user root with encrypted password 'D1£LF1A\!2eNZY6PexamplePassword;"
在双引号内,唯一不独立的字符是\"$`
, plus !
(如果启用了历史扩展)。请特别注意,'
内部双引号代表其自身:它不启动字符串文字,双引号已经启动了字符串文字。另请注意,由于$
启动了变量扩展,$9
因此已扩展;它的值是当前函数脚本的第9个参数,如果参数少于9个则为空。
另请注意,"foo""bar"
与 是相同的"foobar"
:它是两个字符串文字连接在一起,因此它也可以写为单个字符串文字。
\"$`
在双引号内,如果您希望结果字符串包含该字符,则需要在字符前添加反斜杠。这不适用于!
:是脚本中的"!"
字符串,但如果启用则调用历史扩展;始终是字符串。您需要使用单引号或不使用引号。最简单的方法是使用单引号文字:单引号内的所有字符均代表其自身,但单引号除外。要在单引号文字中包含单引号,请结束该文字,然后使用反斜杠引用单引号,并开始单引号文字;或者换句话说,要在单引号文字中包含单引号,请编写。!
"\!"
\!
!
'\''
psqlcmd1='alter user root with encrypted password '\''D1£example!2eNZY6P$9examplePassword'\'';'