拡張を防ぐためにバックスラッシュを使用せずに出力に感嘆符を表示する方法

拡張を防ぐためにバックスラッシュを使用せずに出力に感嘆符を表示する方法

私は通常感嘆echo符付きの特定の文字列が好きです。でも知るシェルの拡張を防ぐためにエスケープする方法を見つけました。返品バックスラッシュ印刷...

echo "\!" # will print \! instead of just !

他のツールと反対sed他のツールと反対確かに有効な引数の拡張を防ぐために使用される場合は、sedバックスラッシュを印刷します。

echo "test" | sed 's/^\(.*\)$/\1 \!/' # print -> test !
echo "test" | sed 's/^\(.*\)$/\1 !/' # also print -> test !
echo "test" | sed "s/^\(.*\)$/\1 ! /" # also print -> test !, though needed to put a space or use a backslash for it to show correctly

同じことをどのように実行できますか?echoそれとも、他のツールを使用する必要がありますかsed

編集する:

''上記の""例の代わりに使用すると、シェル拡張なしで(バックスラッシュの有無にかかわらず)印刷されechoます。!

  • 人々がコマンドオーバーライドを使用しようとすると、echo以下でのみ機能するため、機能しません""

ベストアンサー1

あなたはそれを逃げなければなりません。または引用してください。両方ではありません。

echo \!
echo "!"

Bashレコード拡張は、エスケープされた感嘆符、一重引用符で囲まれた感嘆符、閉じる二重引用符の前に表示される感嘆符を無視します。バラよりマニュアルの歴史的インタラクティブセクションもっと学ぶ。だから

echo '!'

また、動作し、感嘆符がどこにあるか考える必要はありません。

printf置換を使用して、単一引用符を変数拡張と組み合わせることができますecho。同じコマンドラインで複数の形式の引用を組み合わせることもできます。

echo '!'"$(echo test)"

しかし一般的に、printf比較するecho。他の人が述べたように、履歴拡張を完全に無効にすることもできます。非対話型シェルはデフォルトでは有効になっていません。

おすすめ記事