bashが一重引用符間の履歴/感嘆符を拡張するのはなぜですか?

bashが一重引用符間の履歴/感嘆符を拡張するのはなぜですか?

私は最初からサーバーを構成するスクリプトを作成していますが、その一部はpostgresです。私が経験している問題の1つは、任意のパスワードに感嘆符があると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;"

二重引用符内で、スタンドアロン以外の唯一の文字は\"$`プラスです!(履歴拡張が有効になっている場合)。特に、'内部二重引用符はそれ自体を表します。文字列リテラルを開始せず、二重引用符はすでに文字列リテラルを開始します。また、$変数拡張は有効になっているため拡張されます$9。この値は、現在の関数スクリプトの9番目の引数、または9つ未満の引数の場合は空です。

また、"foo""bar"これは次のとおりです"foobar"。 2つの文字列リテラルが連結されているため、単一の文字列リテラルとして作成することもできます。

\"$`結果文字列にその文字を含めるには、二重引用符内の文字の前にバックスラッシュを追加する必要があります。これは以下には適用されません!。スクリプトの文字列です"!"が有効な場合は、履歴拡張が呼び出されます。一重引用符を使用するか、引用符を使用しないでください。最も簡単な方法は、一重引用符リテラルを使用することです。一重引用符を除いて、一重引用符内のすべての文字は自分自身を表します。一重引用符リテラル内に一重引用符を含めるには、リテラルを終了し、バックスラッシュを使用して一重引用符を囲み、一重引用符リテラルを開始します。つまり、一重引用符リテラル内に一重引用符が含まれます。書く。!"\!"\!!'\''

psqlcmd1='alter user root with encrypted password '\''D1£example!2eNZY6P$9examplePassword'\'';'

関連情報