Unix/bash
基数変換
16進数→10進数(hex2dec)
a=10; b=11; c=12; d=13; e=14; f=15 A=10; B=11; C=12; D=13; E=14; F=15 dec=(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) hex2dec (){ s=$(echo ${1}|sed 's/\(.\)/\1 /g') q=0 for n in ${s} do q=$(expr 16 \* ${q} + ${dec[${n}]}) done echo -n ${q} }
> echo $(( 0x110 )) 272
10進数→16進数(dec2hex)
hex=(0 1 2 3 4 5 6 7 8 9 a b c d e f) dec2hex () { s=${1} if [ ${s} -gt 15 ]; then dec2hex $(expr ${s} / 16) s=$(expr ${1} % 16) fi echo -n ${hex[${s}]} }
URLエンコード
URLデコード
> echo "http%3A%2F%2Fsakamoto%2Efam%2Ecx%2F" | tr % = | nkf -emQ http://sakamoto.fam.cx/ > echo "http%3A%2F%2Fsakamoto%2Efam%2Ecx%2F" | echo -e "$(sed 's/%/\\x/g')" http://sakamoto.fam.cx/
URLエンコード
> echo "http://sakamoto.fam.cx/| nkf -eMQ | tr = % http%3A%2F%2Fsakamoto%2Efam%2Ecx%2F > echo -n "http://sakamoto.fam.cx" | echo -n ${1-`cat`} | od -t x1 -A n | tr " " % | tr -d "\n" %68%74%74%70%3a%2f%2f%73%61%6b%61%6d%6f%74%6f%2e%66%61%6d%2e%63%78bash-5.0$
ネットワーク
TCP通信の疎通確認
192.168.0.1サーバの80/tcpへ通信できるか確認する
$ echo 0 > /dev/tcp/192.168.0.1/80 $ ←接続できた場合はプロンプトが返ってくる $ echo 0 > /dev/tcp/192.168.0.1/80 ←接続できない場合はずっと待たされる
プロセス置換
プロセスの実行結果をディスクリプタへ書き込み。再利用する。
5秒前のプロセス状態との比較を行う例
$ diff -u <(ps ax) <(sleep 5; ps ax)
<(プロセスA) ・・・プロセスの結果が/dev/fd/xx に書き込まれるイメージ。
つまり、上記は/dev/fd/yと/dev/fd/zを読みこんで比較していると思われる。
null文字
echo コマンドの制御コード評価を有効にするオプション(-e)を利用する。
null文字(\0)の後に数値を繋げると別の意味になるので要注意。
$ echo -e "123\0abc\0" | od -c 000000 1 2 3 \0 a b c \0 \n $ $ echo -en "123\0abc\0" | od -c 000000 1 2 3 \0 a b c \0 $ $ echo -en "abc\0123\0" | od -c 000000 a b c S \0 $ $ echo -en "abc\0\x3123\0" | od -c 000000 a b c \0 1 2 3 \0 $
---
update at 2022/04/16 09:05:29
※注:当サイトは特定環境において確認できた事象のみを記述しています。他の環境での動作は一切保証しません。