2012-02-24 7 views
1

私のbashスクリプトは、スペースやその他の奇妙な文字でファイル名を取得します。ファイル名にエスケープ文字をスペースで置き換えてbashスクリプトで端末に出力

これらのファイル名を正しい場所にエスケープしてターミナルに戻すにはどうすればいいですか?同じまたは別のスクリプトのパラメータとして再利用できるように、ファイル名をコピー&ペーストするだけです。

私は次のように読み込み、テストスクリプトを書きました:次のように

#! /bin/bash 

    echo "" 
    echo "testing the insertion of '\' in filenames having spaces" 
    echo "the parameter you gave was: '$1'" 
    echo "when printed directly the filename looks like: '$1'" 
    echo "when printed with echo \$(printf '%q' $x) it looks like: " $(printf '%q' $1) 

は、スクリプトを実行するには、行ってきました:私は、スクリプトの農産物を見たいと思って何

bash test.sh this\ filename\ has\ spaces 
    testing the insertion of '\' in filenames having spaces 

    the parameter you gave was: 'this filename has spaces' 
    when printed directly the filename looks like: 'this filename has spaces' 
    when printed with echo $(printf '%q') it looks like: thisfilenamehasspaces 

は次のとおりです。

when printed directly the filename looks like: 'this\ filename\ has\ spaces' 

シンプルだと思われますが、Googleの問題は難しいです。すべての助けに感謝します。ありがとう。

+1

パラメータをprintfに提示するときは、パラメータを二重引用符で囲む必要があります。 – potong

+0

私は出力にエスケープ文字を挿入しようとしているので、ユーザがbashシェルのコマンドラインに出力をカットアンドペーストできるようにしています。 – rfreytag

答えて

1

この:

printf '%q' $1 

はこのことを意味:printf '%q'はその引数を連結しているので、これを意味し、

printf '%q' this filename has spaces 

printf '%q' thisfilenamehasspaces 

何をしたいが、このです:

printf '%q' "$1" 

にはthis filename has spacesがすべて1つの引数であることを伝えるので、内部のスペースを引用します。

私はまた、二重引用符の内側のコマンド置換を置くことをお勧めしたい:

echo "when printed with echo \$(printf '%q' $x) it looks like: $(printf '%q' "$1")" 

この場合には必要でないことが起こるが、ファイル名は、これまで原因となるキャラクターを持っている場合に必要になりますどのprintf '%q'バックスラッシュの代わりに$'...'スタイルの引用符を使用します。

+0

検索にかなりの時間を節約していただきありがとうございます。 – rfreytag

+0

@rfreytag:ようこそ! – ruakh

関連する問題