2012-03-04 5 views
0

ドル記号を含む文字列を1つのシェルコマンドに渡して別のシェルコマンドに渡す必要があるパラメータがあります。

例えば、

prog_name.sh abc\$xyz 

prog_name.shは、OracleのPro * Cプログラムへの呼び出しが含まれています

バックスラッシュはprog_name.shする最初の呼び出しの後に取り除かので、私はに戻ってそれを配置する必要がありますされ
proc_exe $1 

proc_exe呼び出しで$が保存され、$xyzが評価されません。これにより、abc$xyzは文字列として正しく渡され、proc_exeの内部で使用されます。

+1

したがって、仮に 'abc; dd if =/dev/null of =/path/to/your/db'はまだ通りますか? – knittl

答えて

2

あなたの実際の目標に応じて:

$ ./prog.sh 'abc\$xyz' # receives: abc\$xyz 

$ ./prog.sh "abc\$xyz" # receives: abc$xyz 
+1

この場合、二重引用符は動作を変更しません。二重引用符は、スペースを含む変数のためのもので、変数置換を実行する必要があります。一重引用符は、スペースリテラルとNO変数置換を実行して文字列リテラルを使用する場合に使用します。 – Dunes

+0

@Dunesうーん、もう少し考えてみると、OPの最終目標は何か分からない。私は両方の例を入れます。ありがとう。 – chrisaycock

+0

私が言ったのは、あなたも '' abc $ xyz ''をして、ドル記号を逃れようとするのを嫌うということでした。 – Dunes

2

これは、通常、ドル記号がでコマンドライン上ではありませんので、あなたが、バックスラッシュを繰り返す必要はありません

prog_name.sh 'abc$xyz' 

注意を動作するはずですproc_exe $1 - 変数は2回以上展開されませんので、

この場合、$1の場合はNSの空白:

proc_exe "$1" 

そのように、パラメータのテキストは必要なく、その周り""なし

proc_exe $1 

または他の変数を行うことはありません、単一のパラメータ

+0

なぜダウンウィーダーケアを説明するでしょうか?引用は必要ありません_is_。あなたは 'メタ引用'を必要とするために 'eval program $ 1'を使う必要があります – sehe

0

としてproc_exeに到着します。

代わりに、

proc_exe "$1" 

を使用すると、あなたは問題ないはずです。

0

通常、Bashに渡される文字列は、自動的に処理されるため、心配する必要はありません。

例: test.sh:! #/ binに/ bashの

./test2.sh $1 

test2.sh:

#!/bin/bash 

echo "In Test 2 $1" 

例コール:

./test.sh 123 \ $ 456 = "テスト2 123 $ 456"

関連する問題