$IFS
印刷できない文字(改行文字など)を含めることができる変数の値を表示したいと思います。
これを行うには、次のコマンドを使用します。
echo -n "$IFS" | hexdump -C
これは私にとってうまくいきます。
しかし、このコマンドを使用するのに問題がありますか?たとえば、echo
印刷できない文字を印刷する前に他の文字に置き換えますか?stdout
それとも同様の問題がありますか?
ベストアンサー1
文字列を視覚的に表現するいくつかの異なる方法:
POSIX
$ printf %s "$IFS" | od -vtc -to1
0000000 \t \n \0
040 011 012 000
0000004
$ printf '%s\n' "$IFS" | LC_ALL=C sed -n l
\t$
\000$
(追加のコンテンツが\n
必要です。そうしないと、sed
最後の行が改行文字で終わらない限り動作は指定されません。)POSIXには、私のzshのようにNULはありませんsh
。入力に NUL が含まれている場合、動作は指定されません。$IFS
sed
シェル組み込み関数
typeset -p
(ksh、zsh、bash、yash)は特定の文字列の明示的な出力を提供できます。$ ksh93 -c 'typeset -p IFS' IFS=$' \t\n' $ zsh -c 'typeset -p IFS' typeset IFS=$' \t\n\C-@' $ mksh -c 'typeset -p IFS' typeset IFS=$' \t\n' $ a=$'\u00e9e\u301\u200b' ksh -c 'typeset -p a' typeset -x a=$'\u[e9]e\u[301]\u[200b]'
ただし、後者(鋭角アクセントと幅0の空白文字を結合するためにUnicodeを使用する場合)の場合、zsh / mkshは役に立ちません(にもかかわらず
LC_ALL=C typeset -p a
)mksh -o utf8-mode
。bash
端末に送信されると、出力は通常明確ではありません。printf %q
printf
GNUprintf
の組み込み機能を使用しksh93
て、次の操作を行いますzsh
。bash
$ a=$'\u00e9e\u301\u200b' bash -c 'printf "%q\n" "$IFS" "$a" ""' $' \t\n' éé '' $ a=$'\u00e9e\u301\u200b' ksh -c 'printf "%q\n" "$IFS" "$a" ""' $' \t\n' $'\u[e9]e\u[301]\u[200b]' '' \ $'\t'$'\n'$'\0' éé '' $ a=$'\u00e9e\u301\u200b' sh -c '/usr/bin/printf "%q\n" "$IFS" "$a" ""' ' '$'\t\n' éé '' $ a=$'\u00e9e\u301\u200b' zsh -c 'LC_ALL=C printf "%q\n" "$IFS" "$a" ""' \ $'\t'$'\n'$'\0' $'\303'$'\251'e$'\314'$'\201'$'\342'$'\200'$'\213' '' $ a=$'\u00e9e\u301\u200b' bash -c 'LC_ALL=C printf "%q\n" "$IFS" "$a" ""' $' \t\n' $'\303\251e\314\201\342\200\213' ''
q
、、qq
のパラメータ拡張フラグqqq
。qqqq
zsh
さまざまな種類の参照については
qqqq
次のとおりです$'...'
。$ a=$'\u00e9e\u301\u200b' zsh -c 'print -r -- ${(qqqq)a}' $'éé' $ a=$'\u00e9e\u301\u200b' zsh -c '(){local LC_ALL=C; print -r -- ${(qqqq)a}}' $'\303\251e\314\201\342\200\213'
次への参照のみを使用してください
q
。q+
必要はい(Unicodeに関する警告はまだ存在しますが)。
さまざまな非標準コマンド:
hex-dumper:
hexdump
、、、...供給する出力(またはksh / zshを使用するか...hd
を使用)。xxd
printf %s "$var"
print -rn -- "$var"
echo -nE - "$var"
zsh
cat -vte
またはcat -A
uconv -x hex
文字のUnicodeコードポイント(エンコードされたバイトの16進値ではない)の場合は、UTF-8でのみ機能します(入力は前処理できますが、iconv -t utf-8
ロケールエンコーディングで有効なテキストである場合のみ)。uconv -x name
役割名の場合recode ..dump
。 16進数と名前ですが、少数のUnicode文字を理解しています(最新バージョンのUnicodeに更新されていません)。ただし、UTF-8以外のロケールでは機能します。