問題
スクリプトに指定されたパラメーターをそのまま使用したいと思います-引用符とすべてを使用します。これまでのところ、私が見つけたすべての解決策は引用符を取り除くか、微妙に異なることをします。
シナリオ
たとえば、コマンドラインパラメータとして文字列を受け入れるツールがあります
./tool --formula="AG EF phi;"
さらに、スクリプトを呼び出すラッパースクリプトがあります。その呼び出しは
wrap.sh ./tool --formula="AG EF phi;"
このスクリプトは次のようなことをします
# preparation phase
# ...
# call tool and remember exit code
$*
result=$?
# evaluation phase
# ...
exit $result
残念ながら、ツールは次のように呼ばれます
./tool --formula=AG EF phi;
これは上記と同じではなく、構文エラーが発生します。私が見つけた唯一のハックは私に次のようなものを与えるでしょう
./tool "--formula=AG EF phi;"
これも間違っています。
詳細
具体的には、問題を例示するためのダミーコードを次に示します。
まず、Cプログラム「tool.c」。
#include <stdio.h>
int main(int argc, char** argv) {
int i;
for (i = 0; i < argc; i++) {
printf("%d: %s\n", i, argv[i]);
}
return 0;
}
次に、ラップスクリプト「wrap.sh」:
#!/bin/bash
echo $*
$*
exit $?
これが私が試したことです:
$ ./tool --formula="Foo bar"
0: ./tool
1: --formula=Foo bar
$ ./wrap.sh ./tool --formula="Foo bar"
./tool --formula=Foo bar
0: ./tool
1: --formula=Foo
2: bar
$ ./wrap.sh ./tool --formula="\"Foo bar\""
./tool --formula="Foo bar"
0: ./tool
1: --formula="Foo
2: bar"
$ ./wrap.sh ./tool --formula="\"Foo bar\""
./tool --formula="Foo bar"
0: ./tool
1: --formula="Foo
2: bar"
$ ./wrap.sh "./tool --formula=\"\\\"Foo bar\\\"\""
./tool --formula="\"Foo bar\""
0: ./tool
1: --formula="\"Foo
2: bar\""
そして、これが私が欲しいものです(ラップスクリプトの必要な変更のために):
$ ./wrap.sh ./tool --formula="Foo bar"
0: ./tool
1: --formula=Foo bar
提案
引用符をエスケープ
Shabazが提案したように引用符をエスケープすると、変数$*
には正しく引用符で囲まれた文字列が含まれます。たとえば、次のようになります。
wrap.sh ./tool --formula="\"AG EF phi;\""
そしてwrap.sh
コードで:
echo $*
を生成します
./tool --formula="AG EF phi;"
ただし、実行$*
すると、上記のように正確なエラーが発生します。の引数はformula
「AG」の後に削除されます。さらに、引用符をエスケープしないと便利です。
別のシェルが役立ちますか?