2009-07-27 2 views
0

シェルスクリプトを継承しました。それがすることの1つは、ファイル名のリストを解析することです。bashパラメータの展開が元の文字列に変更されます

fs_item="`echo ${fs_item%/}`" 

このコマンドは1つのスペースを入れて、ファイル名にスペースを置き換える(それはこの場合には、私が思うに、最後のスラッシュの後のすべてを削除することです仕事だことから一部):リスト内のすべてのファイル名の場合には、コマンドに続くん:

in: aa bbbb    ccc 
out: aa bbbb ccc 

この時点からファイル名は壊れています。

質問:どういうわけか、スペースを置き換えないようにbashに伝えることはできますか?

+0

あなたがラインfs_itemをしたくない場合、これは...私には不明である=「'エコー$ {fs_item%/}'」。 – nos

+0

私はコメントを追加しました。コマンドは何か他の理由のためにあります。スペースを置き換えるためのbot –

+0

$ {foo%/}は、末尾にスラッシュがあれば削除します。末尾にスラッシュが複数ある場合は、最後のスラッシュだけが削除されます。 –

答えて

0

エコーは本当に必要ですか?動作する必要のあるいくつかの引用符を追加し、あなたの実際の問題が何か違う場合

fs_item="${fs_item%/}" 

、あなたはエコー(または他のいくつかのコマンド呼び出し)を取り除くことができません:あなたは、単にそれを削除することができ

fs_item="`echo \"${fs_item%/}\"`" 

バックスティックのechoコマンドを実行すると、スペースが消えます。内部フィールド区切り文字にはスペース文字が含まれているため、1つ以上のスペースのシーケンスで区切られた単語は、別の引数としてechoに渡されます。 echoはただ一つのスペースで区切られた引数を表示します。

我々は内部フィールドセパレータ対象にしているので、IFSを変更することも動作します(ただし、通常は別の場所にスクリプト内の他の可能性の望ましくない影響を持っている)必要がありますが:

IFS=$'\n' 

これは、内部フィールドセパレータを設定し、改行文字。その後、空白はリストの区切り文字とみなされなくなります。 echoコマンドは、ファイル名に改行文字が含まれていない限り、引数を1つだけ受け取り、空白はそのまま残ります。

+0

引用符を追加するだけで、難読化のレイヤーが追加されます。エコーをパージする必要があります。 –

+0

元の質問のコメントに基づいて、私は実際の問題が明らかにそのように単純化することは不可能かもしれないと思う。しかし、十分に公正な私は私のポストでこれを言及します。 –

0

IFSを別のものに設定してみてください。 IFS = "、"

1

バックテックとエコーコマンドを削除します。それは何も追加せず、あなたがここで解決しようとしている問題を引き起こすので、この状況では役に立たないよりも悪いです。その行を削除し、その後、スペースを置き換えるために

fs_item="${fs_item%/}" 
関連する問題