4

私は、最も些細な作業であるはずのことから悪夢を見ています。

私の最終的な目標は、bashスクリプトから次のコマンドを発行することです。
sqlite3 my_db.db '.read my_file.sql'

ここには2つの落とし穴があります
。1。一重引用符は必須であり、たとえば二重引用符に置き換えることはできません
。2 my_file.sql.実行時にのみ認識される変数です。

したがって、必要なのは、bashに、一方では変数値を含み、他方ではその値を一重引用符で囲む必要がある文字列を作成させる方法です。

また、AWKやPerlなどの追加ツールに依存しないソリューションを強く望んでいます。本当に必要な場合はsedかもしれません。

ありがとう。


ジョナサンとネルソンに感謝します。

3つの提案をすべて試しましたが、すべて失敗しました。
簡単にするために、問題を次のように減らしました。

  1. 次のスクリプト(tst.sh)を作成しました。
    #!/bin/bash
    file=/tmp/1
    ls "'"$file"'"
    ls \'$file\'
    ls "'$file'"

  2. 次に、次のコマンドを発行します。
    $ touch /tmp/1
    $ ls '/tmp/1'
    /tmp/1
    $ ./tst.sh
    '/tmp/1': No such file or directory
    '/tmp/1': No such file or directory
    '/tmp/1': No such file or directory

引用符が実際に追加されたようですが、結果のコマンドは手動で入力した場合と同じではありませんでした。

何か案は ?

4

5 に答える 5

1

一重引用符は必須ではありません。次のコマンドはすべて、まったく同じ引数で sqlite3 を実行します。

sqlite3 my_db.db '.read my_file.sql'
sqlite3 my_db.db ".read my_file.sql"
sqlite3 my_db.db .read\ my_file.sql
sqlfile="my_file.sql"
sqlite3 my_db.db ".read $sqlfile"

いずれの場合も、引数が sqlite3 に渡される前に、引用符 (/escape) が解析されて削除されます。これはあなたが望むものです。sqlite3 に と の 2 つの引数を取得させたいmy_db.dbとし.read my_file.sqlます。コマンドを囲む引用符を sqlite3 に表示させたくない場合は、次のようになります。

$ sqlite3 my_db.db
SQLite version 3.7.7 2011-06-25 16:35:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> '.read my_file.sql'
   ...>

...ご覧のとおり、これは sqlite3 を混乱させるだけです。

ところで、これは ls の例の問題と同じです: ls の引数の一部として一重引用符を渡しているため、名前に一重引用符が含まれるファイルを探していますが、見つかりません。引数の一部として引用符をコマンドに渡すのではなく、シェルで引用符を削除する必要があります。

于 2012-11-28T16:13:21.867 に答える
0

user1860085 さん、sqlite3コマンドのドキュメントを調べて、シェルが引用符と空白をどのように扱うかを知っていれば、おそらく二重引用符が必要だという結論に達するでしょう。

しかし、本当に一重引用符が必要な場合は、ここに解決策があります:

eval sqlite3 my_db.db \'.read $VARIABLE\'

その場で次のように変更されます。

sqlite3 my_db.db '.read my_file.sql'

しかし、なぜあなたがそれを欲しがるのか分かりません...

于 2012-11-28T16:21:33.443 に答える
0

次のように実行できます。

VAR=my_file.sql
VAR2="'.read $VAR'"
sqlite3 my_db.db $VAR2
于 2012-11-28T14:28:28.833 に答える
0

これは、あなたがやりたいことを実行します(プログラムに一重引用符を取得します)が、二重引用符を使用します:

sqlite3 my_db.db "'".read" "my_file.sql"'"

二重引用符を避けると、次のように記述できます。

sqlite3 my_db.db \'.read\ my_file.sql\'

これらの両方について、2 番目の引数は、以下sqlite3を含む文字列として認識されます。

'.read my_file.sql'

ファイル名が変数 ( file=my_file.sql) にある場合、次のようになります。

sqlite3 my_db.db "'".read" "$file"'"
sqlite3 my_db.db \'.read\ $file\'

これらの表記法は、ファイル名にスペースが含まれている場合、混乱しやすくなります。

しかし、それはあなたが本当に望んでいるものではないと思います。二重引用符の禁止は不可解であり、一重引用符の要件も同様に不可解です。

于 2012-11-28T14:33:00.793 に答える
-2

よし、問題解決!!

欠けていたのは、行の前に小さな「eval」コマンドを追加したことだけです。
したがって、私が示した簡単なスクリプト例では、:
ls "'$file'"を:に変更すると
eval ls "'$file'"
うまくいきました。

すべての返信者に感謝します:-)

于 2012-11-28T16:17:06.430 に答える