シェルスクリプトで自己追記FizzBuzz
code:shell
n+=:; s=; : ${p=$(<$0)}
$n =~ ^(...)+$ && s=Fizz
$n =~ ^(.....)+$ && s+=Buzz
echo ${s:-${#n}}
${#n} =~ ... || echo "$p">>$0
n+=:
変数nに対して文字列連結
: ${p=$(<$0)}
:何もしないコマンドを置くことで変数pに代入という副作用できる
$0でファイル名を参照して<$0で入力リダイレクションして、$(<$0)は自分のファイル内容の文字列になる ${var=value}は変数varが未定義の時に限り、valueの値を代入する
/icons/point.icon最初の一回だけpが初期化される
[[ $n =~ ^(...)+$ ]]
正規表現で文字数マッチする→Fizz/Buzzの条件を判定する
echo ${s:-${#n}}
${x:-default}でxが空白なら...という変数のif初期化
${#n}で変数nの文字数に評価
→nの文字数がループカウンタ
[[ ${#n} =~ ... ]] || echo "$p">>$0
ループカウンタが3桁(つまり100)になったら終了
変数pにはファイルの内容が文字列として入ってる
echo "$p">>$0→自分自身に追記リダイレクション
元ネタ