何をするか

何をするか

!たとえば、フィールド区切りとして使用すると、awk -F!エラー メッセージが表示されますbash: !: event not found。なぜでしょうか。受け入れていますawk -F"\!"。Bash バージョン 3.2.25

答え1

!バッシュのトリガーキャラクターです歴史の拡大有効にすると、!fooコマンドライン上の のようなものが で始まる最新のコマンドに展開されますfoo。または、そのようなコマンドラインが存在しない場合は、次のようにシェルでエラーが発生します。

ただし、単語の最後の文字としては何もしないはずです。これは実際に、私が試した Bash のすべてのバージョンで意図したとおりに動作します。

$ echo 'aa!bb' | awk -F! '{print $1}' 
aa

さらに最近のバージョンでは、!終了の二重引用符の前では何も実行しないため、-F"!"それ以降のバージョンでは機能しますが、3.2 では機能しません。

バックスラッシュまたは一重引用符を使用すると、これをエスケープできます。つまり、 も も\!foo展開'!foo'されません。もちろん、 で履歴展開を完全に無効にして、これを停止することもできますset +H

二重引用符の場合はさらに奇妙です。二重引用符内では、バックスラッシュによって履歴の展開が無効になりますが、バックスラッシュ自体はそのまま残ります。

$ printf '%s\n' "\!foo"
\!foo

この場合、awk -F"\!"awk 自体がバックスラッシュを削除するため機能します。

答え2

これをしているのはシェルではありませんawk!はシェル内の特殊文字です。

何をするか

常に自分の主張を引用してください。例:

awk -F'!'

関連情報