2

pyfg()以下のコードでは、 の出力を正確にエコーされたとおりに渡したいと思います(つまり-htns、との間のスペースはcrl、空白としてではなく文字どおりに解釈されますaoeu()) aoeu()。もちろん、問題は in aoeu()$1is -htns$2is crl、および$3であり、この場合はまったく必要ありませんqjkx。この例がまったく役に立たないことはわかっていますが、これを適用しようとしている実際のアプリケーションは、 below の代わりに外部プログラムを呼び出すため、以下のようなものaoeu()が必要です。

#!/bin/bash
# pass_space_function.sh

aoeu() {
echo "$1" "$2"
}

pyfg() {
echo "-htns crl" "qjkx"
} 

aoeu $(pyfg)

上記の出力を実行すると、次のようになります。

$ ./pass_space_function.sh
-htns crl

私の望ましい出力は次のとおりです。

$ ./pass_space_function.sh
-htns crl qjkx

明確にするために、コードが機能しない理由を正確に理解していますが、自分がやりたいことを実行させる方法についてはよくわかりません。

編集:

#!/bin/bash

aoeu() {
echo 1:"$1" 2:"$2" 3:"$3"
}

pyfg() {
# These variables might be user-provided.
wvz="/usr/lib/scarychacacters_\"@#$:%^&:*(){}[]; a o ;u ;::e i y f.so.4"
bm="/space space space"
snt="/var/cache/normalpath"

printf "%q %q %q" "$wvz" "$bm" "$snt" 
} 

aoeu $(pyfg)

そのコードは、私にとっては1:/usr/lib/scarychacacters_\"@#\$:%\^\&:\*\(\)\{\}\[\]\;\ 2:a\ 3:o\. の空白で明らかに分割されています$wvz

4

2 に答える 2

2

正しい引用の鍵は、何が起こるかを理解することにあります。

たとえばecho "-htns crl" "qjkx"、バイトストリームのみを標準出力に出力するため-htns crl qjkx、最後になります。-htns crlより密接にグループ化された情報qjkxが失われます。

この損失を回避するには、次を使用できますprintf "%q"

pyfg() {
  printf "%q %q" "-htns crl" "qjkx"
}

これにより、引用符付きの出力が生成されます。-htns\ crl qjkxこれは、シェルにとって同じことを意味します"-htns crl" "qjkx"(スペースがバックスラッシュでエスケープされているか、二重引用符で囲まれているかは違いはありません)。

次の側面は、$()あるプログラムの出力を次のプログラムに渡すための の使用です。

典型的な方法は、それを二重引用符で囲むことです:

aoeu "$(pyfg)"

このようにして、すべてが解釈なしで渡されます。これは、ほとんどの場合に望ましいことです。

ただし、あなたの場合、;pyfgの出力を引用する代わりに、引用されたの出力を作成したい場合があります。pyfg重要な違いに注意してください。最初の手段pyfgは引用された出力を生成することを意味し (上記のように)、2 番目の手段はpyfg後で引用される出力を生成することを意味します。pyfg2 番目の方法は、 の出力でどの部分が一緒に属しているかの情報が失われている場合は役に立ちません。

二重引用符をそのままにしておくと、残念ながら、$IFSこのスペースがバックスラッシュでエスケープされていても、出力はスペース (つまり の最初の文字) で分割されます。したがって、代わりに、この場合、シェルが通常のシェル評価メカニズムでeval値を解釈するように強制するために使用する必要があります。$(pyfg)

eval aoeu "$(pyfg)"
于 2013-11-06T12:23:53.650 に答える