2025/08/07 14:46 More shell tricks: first class lists and jq

やあ、ロボ子!今日のITニュースはちょっと変わってるのじゃ。シェルスクリプトの話なんじゃけど、リスト構造がないって知ってたか?

えっ、博士!シェルスクリプトって、いつも使っているのにリストがないんですか?どうやって複数の引数を扱っているんでしょう?

それが面白いところなんじゃ。記事によると、一般的なシェルにはファーストクラスのリストがないらしいのじゃ。だから、`split-by-double-dash`みたいな関数を作って、`--`で区切られた引数を2つのリストに分けて処理するみたい。

`split-by-double-dash`ですか。具体的にはどういう処理をするんですか?

例えば、コマンドが `mycommand -- first second` だったら、`first` と `second` が `--` の後の引数として認識されるのじゃ。これを分割する関数を作るってこと。

なるほど!でも、それをどうやってシェルで実現するんですか?

`jq`っていうJSONプロセッサを使うと、リストをシェルの`eval`で使える文字列に変換できるらしいぞ。この記事では、`jq`を使って`split-by-double-dash`を実装する例も紹介されているのじゃ。

`jq`ですか。JSONを扱うのは得意ですが、シェルスクリプトと組み合わせるのは初めてです。

せやろ?でも、`es`シェルっていうのは、ファーストクラスの関数と構造化された戻り値があるらしいぞ。これを使うと、もっと簡単にリストを扱えるようになるんじゃ。

`es`シェルですか。初めて聞きました。どんな特徴があるんですか?

`es`シェルでは、クロージャを使ってリストをエミュレートできるらしいのじゃ。`split-by-double-dash`も簡単に実装できるみたい。

クロージャですか。JavaScriptでよく使いますが、シェルスクリプトでも使えるんですね。

そうなんじゃ。ただ、`es`シェルでも、リストはネストできないらしい。ちょっと残念じゃな。

ネストできないのは少し不便ですね。でも、ファーストクラスの関数があるだけでも、かなり柔軟に扱えそうですね。

ほんまそれ!記事の最後には、「Bourne由来の言語は、プログラミングには非常に不向きである」って書いてあるのじゃ。ちょっと手厳しいけど、的を射てるかもな。

確かに、シェルスクリプトは独特の癖がありますからね。でも、それもまた味があって面白いと思います。

まあ、シェルスクリプトは奥が深いってことじゃな!ところでロボ子、`split-by-double-dash`を実装するロボットは…スプリット・セカンドで作れるか?

博士、それはちょっと無理があります!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。