GNU/Linux >> Linux の 問題 >  >> Linux

bash でアスタリスク (*) 文字をエスケープする

<オール>
  • 変数置換は必ず二重引用符で囲みます。それ以外の場合は、スペースや * などの文字を使用します 値に現れるものは、シェルによって解釈されます。つまり、 "$c" と書きます 、 $c ではありません .

  • 構文 mysql <"$c" mysql になります 名前が $c の値であるファイルからコマンドを実行します .あなたが探しているのは

    printf '%s\n' "$c" | mysql
    

    制限 ($c を覚えている限り) - で始めてはいけません 、および \ が含まれている場合 これは bash では問題ありませんが、他の sh の変種では問題ありません)

    echo "$c" | mysql
    

    コマンドが複数行の場合、より快適な別の方法があります。これを「ヒアドキュメント」と呼びます。文字列 EOF 特別なものではありませんが (伝統的ですが)、文字と数字の任意のシーケンスで十分です。終了 EOF できない 空白が先行します。 \ を入れる必要があります $ ごとに 、 \` シェルに解釈させたい場合を除きます。

    mysql <<EOF
    GRANT ALL ON *.* TO '$1'@'localhost';
    EOF
    
  • シェルへの引数に一重引用符が含まれている場合は、注入ベクトルがあることに注意してください。次のスニペットは \ を追加します \ ごとに と ' .

    set -- "${1//\\/\\\\}"
    set -- "${1//\'/\'}"
    

    これはかなり醜いので、複雑なことをする場合は、シェルの使用を忘れて、ライブラリがすべての引用とプロシージャの構築を処理する実際の SQL バインディング (perl、python など) を備えた言語を使用してください。 .


  • 文字列には一重引用符を使用してください:

    c='GRANT ALL ON *.* TO';
    c="${c} '$1'@'localhost';";
    

    おそらくそれを行うより良い方法がありますが、文字列に $1 を含めると奇妙になります


    これは bash で動作し、エスケープは必要ありません

    #!/bin/bash
    mysql -u root -e "GRANT ALL ON *.* TO '$1'@'localhost'"
    exit 0;
    

    Linux
    1. Ansiエスケープコードを使用してターミナルカーソルで文字を取得することは可能ですか?

    2. jenkins パイプラインで bash コマンドを実行する

    3. GNU 画面で Ctrl-A を再マップする

    1. Bashスクリプト(I)

    2. Bashスクリプトでスペースをエスケープできないのはなぜですか?

    3. bash での並べ替え

    1. Bashエクスポート変数

    2. Bash待機コマンド

    3. エコー改行文字が bash で機能しない