7

bashシェル内からアスタリスクを付けてMySQLステートメントを実行します。

query=`cat <<EndOfMySQL
INSERT tmp_table
SELECT * FROM table
;
EndOfMySQL
`

echo $query

echo $query | mysql database

問題は、アスタリスクが現在のディレクトリ内のファイルのリストに置き換えられ、クエリが誤ってしまうことです。この動作を回避する方法は?バックティックを使用するか、を使用するかは関係ありません$()。のようなエスケープシーケンスを期待します\*が、少なくともこれは機能しません。

4

3 に答える 3

6

区切り文字列を引用符で囲むことにより、ヒアドキュメントでのパラメータ拡張、コマンド置換、および算術拡張を防ぐことができます。

... <<\EndOfMySQL
...
EndOfMySQL

単一の文字をエスケープすると、上記の拡張も防止されます。

編集:ヒアドキュメントの行はファイル名の生成(グロブ)の対象ではないことに注意してください!

この場合の問題は、 mysqlに渡された変数を引用しなかったことだと思います。

echo $query | mysql database

する必要があります:

echo "$query" | mysql database

またはそれ以上:

printf '%s\n' "$query" | mysql database

使ってみませんか:

query='INSERT into tmp_table
SELECT * FROM table;'
printf '%s\n' "$query" | mysql

または(シェルがヒア文字列をサポートしている場合、 bashの最近のバージョンはそれらをサポートしています):

mysql <<< "$query"
于 2012-11-07T10:49:45.110 に答える
2

*および他のグロブ文字が拡大するのを防ぐため。グロブを無効にする–ヒアドキュメントset -fの前に使用する

ヒアドキュメントの区切り文字のいずれかの文字をエスケープすることはNo parameter expansion、、、、またはが実行されるcommand substitutionarithmetic expansionpathname expansionことを意味します–ただし、pathname expansion注意が必要です。

からman bash

  • パス名の拡張—単語分割後、*-fオプションが設定されていない限り、bashは各単語の文字*、?、および[をスキャンします。これらの文字のいずれかが表示された場合、その単語はパターンと見なされ、パターンに一致するファイル名のアルファベット順にソートされたリストに置き換えられます。

  • Shell Builtin Commnds — set -f–パス名の拡張を無効にします。

からhelp set

  • -f–ファイル名の生成(グロブ)を無効にします。
于 2015-05-28T23:18:32.813 に答える
0

アスタリスクをbashヒアドキュメントに渡す方法は?

これを行うためのトリックはありません-ヒアドキュメントはアスタリスクで正常に機能します。

この質問は、症状の誤解に基づいています(これはここで犯しやすい間違いです)。

アスタリスクの問題は、ヒアドキュメントやの実行とは何の関係もありませんcat。の*間に展開されecho $queryます。

に置き換えcattee temp.txt、生成されたファイルの内容を確認することで、これを自分で証明できます。


ただし、他のタイプの展開(デフォルトで)処理されるため、アスタリスクを展開たい場合は、次のようにすることができます。

SELECT $(echo *) FROM table

ヒアドキュメントの名前を引用符で囲んで、拡張を完全に無効にすることができます。

cat <<'EndOfMySQL'

参照:ヒアドキュメントをBashスクリプトでファイルに書き込むにはどうすればよいですか?

于 2020-06-29T00:30:39.710 に答える