見出し画像

俺的シェル芸のよく使うコマンド

この記事は、mast Advent Calendar 2023 の15日目の記事です!
14日目は🍏さんの記事『年末だし時間割でブロック崩しをして忘年しよう!』でした~

前書き

皆さん、シェル芸してますか。私は、しています。
シェル芸とは、「マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。あるいはそのときのコマンド入力のこと。」
(USP友の会会長・上田隆一による定義)である。

Unix系OSのシェル上でのワンライナーのことらしい。 そんなシェル芸、X(旧Twitter)上には「#シェル芸」などのハッシュタグとともにワンライナーを投稿すると実行結果を返してくれるシェル芸botなるものが存在していた。(API有料化につき停止してしまいました…)

現在では自分で環境を整備するか、Jiro4989様の提供しているwebsh(Webブラウザ上でシェル芸botの実行環境を提供するWebアプリ)などでシェル芸で遊ぶことができる。

そんなシェル芸で自分がよく使うコマンドを紹介しようと思います
なお、オプションは全部紹介できる知識がないので抜けてたり書いてたりします。許してね。

俺的最もよく使うコマンドたち

まずはシェル芸するときによく使うコマンドたちを詰め込んだサンプルコードをば

k="キロロ";echo-sd $(echo $k|sed 's/ロ/ラ/g'|grep -o .)|lolcat -f --freq=1|textimg -sF 150

出力

まぁこんなもんですね、一つ一つ解読していきましょう。

変数

k="キロロ";

変数"k"にキロロという文字を詰め込んでいます。
変数を指定した後、$(変数名)と書くと変数が使えます。

echo-sd

echo-sd 

突然の死ジェネレータです。引数に渡している文字列を突然の死のAAで囲って出力してくれます。
サンプルコードでは引数にechoコマンドを使用しています。こういう時は$()で囲ってコマンドを入力します。変数に入れるときもtext=$(echo ~~~)みたいな形で使えます。

echo-sd mast 
> _人人人人_
> > mast <
>  ̄Y^Y^Y^Y^ ̄

echo

echo $k

echo は文字列を標準出力してくれます。$kには"キロロ"が入っていますので"キロロ"と出力します。

sed

sed 's/ロ/ラ/g'

sed 's/~/~/'は正規表現を用いて文字列の置換を行うことができます。echo ~~~の後にパイプラインを付け、続けてsedコマンドを入力することでechoでの出力に対して置換を行ってくれます。最後に"g"を入れることで文字列のすべての対象となる文字に適用します。ない場合は、最初にマッチする文字列のみに適用します。

echo "キロロ"|sed 's/ロ/ラ/g'
>キララ
echo "キロロ"|sed 's/ロ/ラ/'
>キラロ

またsではなくyを用いることで1文字ずつ対応させて置換することができます

echo "キロロ"|sed 'y/キロ/ギラ/'
>ギララ

grep

grep -o .

grepはパターンにマッチした行を標準出力してくれます
今回は . にマッチするものなので1文字ずつマッチして一文字ずつ標準出力されます。

echo キロロ|grep -o .
> キ
> ロ
> ロ
echo -e "キロロ\nギロロ\nカロロ"|grep -o キ.*
> キロロ

lolcat

lolcat -f --freq=1

文字を虹色にしてくれる。-fは必ずつけます。
ターミナル上で実行した場合は勝手にカラフルになってくれるが、シェル芸bot,Webshなどではtextimgと併用する。
--freq=の後に数字を入れることでカラフル度が増します。

textimg

textimg -sF 150

Terminal上の色のついたテキストを画像に再現しますオプション次第でアニメーションgifにしたりすることができます。

その他使いがちコマンド

shuf

入力行をランダムにシャッフルして出力
-e 必須
-n(数字) 上から(数字)番目まで出力
-r 重複あり

shuf -ren 7 {"a","i"}
a
a
i
i
a
i
a

tr

文字の置換を行います。一文字ずつしか置換できないので自分はsedコマンドを愛用しています。(日本語変換が怪しめ)
-dオプションで文字の削除ができるのでそっちはよく使ってます。

echo "kiroro"|tr "r" "l" 
> kilolo
echo "kiroro"|tr -d "r"
> kioo

$((RANDOM))

ランダムな数字を出力。% (任意の数字) を加えるとその数字までのうちランダムな数字を出力
ちなみに$((~~~))は数式を入力するとき使います。

echo $((RANDOM % 40))
> 10

発展編

上のコマンドたちとちょっとほかのコマンドを組み合わせることでいろんなことができます!!!

1. 掲示板みたいなやつ

t="おれの名はサンジ、海の一流料理人だ";n="";array=$(echo $t|grep -o .);(for i in $array;do echo "$n"$i;if [ `echo -n $i|wc -c` = 3 ];then n=$n' ';else n=$n' ';fi;done;yes $t|head -n7)|lolcat -f --freq=2|textimg -sal1 -d15 -F150

2. スーモ

d=$(echo ダン💥{,,});s=$(echo $(echo $(echo スモ{🌝,🌚}){,,})$(echo ス$(echo 〜{,,})モ){⤴,⤵🌞});echo あ❗️ スーモ❗️🌚$dシャーン🎶$s|tr -d " "
> あ❗️スーモ❗️🌚ダン💥ダン💥ダン💥シャーン🎶スモ🌝スモ🌚スモ🌝スモ🌚スモ🌝スモ🌚ス〜〜〜モ⤴スモ🌝スモ🌚スモ🌝スモ🌚スモ🌝スモ🌚ス〜〜〜モ⤵🌞

3.NCODICE

ncodice()(k=NCODICEチャレンジ;(echo-sd $k!!!;e=echo;q="== 0";m=1;for i in `seq 1 $1`;do n+=($(shuf -e -n1 {お2,ま3,ち5,ん7,こ11,う13}));m=$(($m*$($e ${n[$(($i-1))]}|tr -cd '[[0-9]')));done;$e ${n[@]}|tr -d '[0-9]';(if [ $(($m%455)) $q ];then $e UNCHI;fi;if [ $(($m%1001)) $q ];then $e UNKO;fi;if [ $(($m%231)) $q ];then $e MANKO;fi;if [ $(($m%462)) $q ];then $e OMANKO;fi;if [ $(($m%385)) $q ];then $e CHINKO;fi;if [ $(($m%1225)) $q ];then $e CHINCHIN;fi;if [ $(($m%2450)) $q ];then $e OCHINCHIN;fi)|awk '$1=$1' FS=|lolcat -f -F 1)|textimg -s -F150);ncodice 10

4. 文字が回るやつ

echo -ne "\x1b[1;37;40mPorn\x1b[38;5;232m\e[48;5;208mhub\x1b[0m"|textimg -o p.png;convert -background black -gravity center -extent 100x100 p.png o.png;for((i=0;i<360;i+=20));do convert -rotate $i o.png i$((i+1000)).png;done;convert -gravity center -extent 100x100 -delay 5 -loop 0 i*.png images/aaa.gif
某サイト

5.グラフ表示の奴

(echo -e あーっ!!! お客様ーっ!! 困ります!!!;shuf -ren 100 {{困り,お客}ます,{困り,お客}様ーっ,{困,お客,あ}-っ}{!!,!!!,!!!!!,!!!!})|tr "\n" " "|sed 's/.$//;s/\s/->/g;s/.*/digraph{&}/'|circo -Tpng>/images/0.png

お客様ー!

難読化編

実はecho では -eオプションを使用するとASCIIコードが使えるようになります。

echo -e "\0113\0111\0122\0117\0122\0117"
> KIRORO

さらにシェルスクリプトには特別な変数が用意されています。
$#       スクリプトに与えた引数の数
$$  このシェルスクリプトのプロセスID
$!   最後に実行したバックグラウンドプロセスID
などなど….
これに数式として扱ってあげるとこんなことができます。

echo -e "\\$#$(($$/$$))$((($$+$$)/$$))$((($$+$$+$$+$$+$$)/$$))\\$#$(($$/$$))$(($$/$$))$(((($$+$$)/$$)*($$+$$+$$)/$$))\\$#$(($$/$$))$(($$/$$))$((($$+$$+$$)/$$))\\$#$(($$/$$))$(($$/$$))$((($$+$$+$$+$$+$$+$$+$$)/$$))"
> UNKO

最後に…

こんなしょうもな記事ですまんかった。

もっといろんなやつ見たいよ~という方はぜひシェル芸botを覗いてみてください。

それでは!!!!


浅香ひなた


この記事が気に入ったらサポートをしてみませんか?