为什么 bash 在单引号之间扩展历史记录/感叹号

为什么 bash 在单引号之间扩展历史记录/感叹号

我正在创建一个脚本来从头开始配置服务器,其中一部分是 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'\'';'

相关内容