エスケープされたスペースを使用して echo を実行するにはどうすればよいでしょうか?

エスケープされたスペースを使用して echo を実行するにはどうすればよいでしょうか?

スペースを含む変数をテキスト ファイルにエコーしたいです。

a=a\ b\ c
echo $a > /tmp/a

上記の結果、 を含むファイルが作成されますa b c。このファイルを読み取る必要がある場合はどうすればよいでしょうかa\ b\ c?

試してみましたprintf %q $aが、それでも私の望みどおりにはならないようです。

注: また、そのコンテンツは私が生成したものではなく、$a私の管理外で渡されたものであると想定してください。エスケープされたスペースで保存されていることを確認する必要があります。

答え1

バックスラッシュは次の文字をエスケープします。あなたの場合、スペースをエスケープしたので、その時点で の内容は次のよう$aになりますa b c。$a の内容にバックスラッシュを含めたい場合は、次のようにエスケープする必要があります。

a=a\\\ b\\\ c

または

a='a\ b\ c'

$a にすでにスペースを含むテキストが含まれており、それをファイルに保存したい場合は、次のようにします。

printf "%q" "$a" > /tmp/a

実行したとき:

printf "%q" $a > /tmp/a

printfに引用符を付けるように指示しました3テキストの一部を分割してグロブ化しました: abc。これらは忠実にエスケープされ (何もせずに)、その後 として /tmp/a にリダイレクトされましたabc

よく読んでみてください:シェル スクリプトが空白文字やその他の特殊文字で動作しなくなるのはなぜですか?何が起こっているのか見てみましょう。

答え2

引用符で囲むだけです。

a="a\ b\ c"

あるいは、エスケープをエスケープします。

a=a\\\ b\\\ c

どちらも同じ結果になります。

答え3

Jeff からのフィードバックに基づく解決策:

echo $a | sed -e "s/ /\\\ /g" > /tmp/a

関連情報