🖥

シェルの偽装 — 条件判定 ( if / then / fi ) は実はコマンドの連続に過ぎないので独自構文に書き換えてみるテスト

2023/08/26に公開

参考

こちらの記事に触発されて書いてみる。

プログラマーの君! 勘違いするな! シェルスクリプトでは読みやすさのためにスペースを置くな!! という話 - Qiita

シェルスクリプトは「コマンド列を書き連ねたもの」だという原則を忘れないで!

fi を end で書けるように

fi は構文ではなくコマンドだ。
なのでエイリアスを作ることも出来る。

スクリプト例

overwrite.sh
#!/bin/sh

alias end=fi

if [ true ]; then
  echo ok
end # 本来なら fi のはず

ちなみに shebang が sh なのは、無設定で alias を使うため。
shebang を bash にした場合は shopt -s expand_aliases を記載すること。

実行結果例

ok

もっと書き換えてみる

#!/bin/sh

alias when=if
alias end=fi
alias so=then

when [ true ]; so
  echo ok
end

[ ] は書き換えられないの?

工夫したら出来るような気もするが試してない。

開きカッコのコマンド ( [ ) は、引数に閉じカッコ ( ] ) を期待するので、こちらも中身の処理まで変える必要がありそう。

参照先の記事にもあるが、 [ はコマンド。だが ] は引数の文字列だ。コマンドではない。似たように見えて違う奴ら。

$ which [
[: shell built-in command

$ which ]
] not found

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2018-07-16

Discussion