一重引用符で囲んでコマンドにパラメータを渡す

一重引用符で囲んでコマンドにパラメータを渡す

スクリプトを実行しようとしています。

#!/bin/sh 
A=multichain-cli chain97 issue 1XRnkvTc1Ev3q8UnSyynu1Qb9ss1E3aJWZn2bQ '{"name":"Test_Asset","open":true}' 100 echo "$A" 
exit 

Test_Assetをパラメータとして渡そうとします。

#!/bin/sh 
B=$1 A=multichain-cli chain97 issue 1XRnkvTc1Ev3q8UnSyynu1Qb9ss1E3aJWZn2bQ '{"name":"$B","open":true}' 100 echo "$A" 
exit

$ Bという名前で資産が作成されます。文字通り$BではなくBの価値で資産を作成したいと思います。

答え1

一重引用符の中には何も拡張されません。したがって、単一引用符を削除する必要があります。欲しいものは何でも構いません二重引用符Split+glob を適用したくない場合は、変数が拡張されるため、次のようになります。

A=$(multichain-cli issue '{"name":'"$ASSET"',"open":true}' "$D")
#                         ''''''''  """"""  '''''''''''''
printf '%s\n' "$A"

''''"""""どの部分が一重引用符であり、どの部分が二重引用符であるかを示します。)

おそらく$ASSETJSONコードの内容を二重引用符の中に入れたいので、それを含める必要があります(リテラル、つまり一重引用符の部分内)。

A=$(multichain-cli issue '{"name":"'"$ASSET"'","open":true}' "$D")
#                         '''''''''  """"""  ''''''''''''''

$ASSETシェル引用に使用される二重引用符(ここでは拡張時に分割+グローブを防ぐため)をそのまま渡された二重引用符と混同しないでくださいmultichain-cli

$ASSET二重引用符自体やバックスラッシュ、改行、その他の制御文字など、JSON構文に特殊なその他の文字を含めることを検討できます。 ASCII以外の文字の場合multichain-cli

あるいは、すべてのものに対して二重引用符シェル引用符を使用することもできます。@Bexショー、これは、渡すテキストの中で"s($、とも必要です)をバックスラッシュにエスケープする必要があることを意味します\`multichain-cli`...`

答え2

努力する

ASSET="$1"
D="$2"
A="$(multichain-cli issue "{\"name\":$ASSET,\"open\":true}" "$D")"
echo "$A"
exit

変数置換が発生してはいけません。言葉引用符(つまり、単一の ')。二重引用符を使用し、バックスラッシュを使用して出力から必須二重引用符をエスケープします\

答え3

返信ありがとうございます。解決策としてファイルにコマンドを作成し、ファイルを実行しました。仕組みは次のとおりです。

#!/bin/sh
ASSET=$1
X=`echo "'{\"name\":\"$ASSET\",\"open\":true}'"`
A="multichain-cli chain97 issue $X 100"
echo "$A" >test.sh
B=`sh test.sh`
echo "$B"
exit

関連情報