私はASCII番号(16進数)を使用していくつかの文字を出力しようとしましたprintf
。次のようになります。
#!/bin/bash
hexchars () { printf '\x%s' $@ ;}
hexchars 48 65 6c 6c 6f
Expected output:
Hello
何らかの理由でこれは機能しません。どんなアイデアがありますか?
編集する:
Isaacが提供した回答(許可された回答)に基づいて、次の機能を使用しました。
chr () { local var ; printf -v var '\\x%x' $@ ; printf "$var" ;}
サブシェルを避けて速度を向上させるために、彼の答えを少し書き直しました。
Result:
~# chr 0x48 0x65 0x6c 0x6c 0x6f
Hello
~# chr 72 101 108 108 111
Hello
~# chr {32..126}
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
この関数の逆関数は、次のようなchr
関数になると思います。
asc () { printf '%d\n' "'$1" ;}
asc A
65
chr 65
A
それとも厳格な16進変形が必要な場合...
chrx () { local var ; printf -v var '\\x%s' $@ ; printf "$var\n" ;}
ascx () { printf '%x\n' "'$1" ;}
chrx 48 65 6c 6c 6f
Hello
ascx A
41
ありがとうございます!
ベストアンサー1
ああ、もちろんです。 2つのステップを踏むだけです。これは2段階のタンゴと同じです。
$ printf "$(printf '\\x%s' 48 65 6c 6c 6f)"; echo
Hello
または他のオプション:
$ test () { printf "$(printf '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
または、「引数なし」の印刷を防ぐには、次の手順を実行します。
$ test () { [ "$#" -gt 0 ] && printf "$(printf '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
$
引数は1から127までの10進値と見なされます(ヌル引数は計算されますが印刷されません)。