]Linux/shでゲームをつくるシェルで書いたサンプルゲーム(2019-12-20)サンプルスクリプトサンプルの解説とにかく、いつもshの文法を忘れるのでとりあえずこれ一個あれば概ね(おおむ)思い出せそうなサンプルスクリプトが欲しくて作ってみました。つめこんで解説が長いメモになっています。自分で何か探す際の検索ワードのヒントになればと思います。#!/bin/shこのファイルを何で(=shで)実行するかの宣言になります。それぞれの実行環境にあわせて正しいPATHを指定しましょう。-print」とかで確認して書きます。#!」みたいに探すと詳細な解説が得られます。#!」のように先頭に一文字余分なスペースを入れてfileコマンドに渡すと、ただのtextファイルと識別されるのではないでしょうか。スクリプトをデバッグしたい時はこの一行目にオプションをつけてみましょう。このスクリプトファイル」で実行するとか。+x」でOFFにすることができます。好きだからOSにデフォルトで入っているものなら動く確率が高いから、です。perlとかだと、別途インストールしないと入っていない可能性もあります。使う起動スクリプトとかも「/bin/sh」が多いのだと思ってます。stones!コメント行です。shでは#から右がコメントになります。c」のようにechoコマンドを実行すると、"c"が表示されないのが確認できると思います。c"」のようにクウォートで囲めば#より右も表示されます)scriptコマンドやらアプリのログ機能やらで何か作業メモを取っているときは「#なにかのめも」みたいに書けばコマンドプロンプト上でもメモを残せます。なっているのが多かったりしますが、"#"で始まっていれば、うっかりコピペミスしてもコメント扱いされて助かったりする時もまれにあります。このサンプルスクリプトの話に戻って、コメントとして、それっぽい英文で書いたとおり、このシェルスクリプトは「飛んできた石にぶつかるゲーム」(?)です*2。起動して、Enterキーで主人公?を操作して遊んで下さい。PATH=$PATHPATHはコマンドを実行する際に、どこからどの順番で探すかを定義する変数です。ここでは少し、セキュリティ的なメモをします。今回は何も指定していませんが(PATH=$PATH)本来は必要に応じて「PATH=/usr/bin:/sbin:/bin」のように利用する変数をきっちり上書きします...安全面を考慮するために。発動してしまったりします*3。ように"\"でエスケープしてオリジナルのコマンドを呼ぶようにしたり工夫する必要があります。本当はユーザが自分で正しいPATHを設定したのに、スクリプト内でPATHを上書きしてしまった結果、コマンドが(PATHから)見つかりません状態になることもあるので、そのへんは、用途の問題になります......で、結局どうすれば良いの?ずばり答えが知りたい方は、セキュアプログラミングとかshellスクリプトの(入門ではなく)詳細な解説本をご覧ください。*4大事な話は体系的に知っておいたほうが良い気がするので...一度は本に目を通してみても損は無いと思います。LANG=C環境変数を設定する時はexportコマンドを使います。dateコマンドの出力を「DAY=`date`」のように拾ったときに意図せず日本語になるのを防ぐために、LANGを指定しています。始まるものがいくつかあって、そちらの宣言が優先されるのでご注意を。余談ですが、コマンドプロンプトはシェル変数PS1です。画面出力をそのまま他のアプリの入力として使う場合は(例:TeraTermマクロでプロンプトをwaitする時など)あらかじめPS1を使いやすいのに変えたりしますね。POSITION_X=12あとで使う変数を定義します。自分がどんな変数を使っているのかを一箇所で整理しておけば、あとでコードを読んでも思い出しやすいかな〜?、というのが目的です。ちなみに、もしこのサンプルスクリプトを改変して遊ぶ場合は、この12という数字は重要になります。(STONE_SPEEDの公倍数で、STONE_Xと確実に重なる位置を指定する)print_back()まずシェル関数について説明します。Enterしてみると、実行結果を確認できると思います。$2とかを使えば拾えます。起動スクリプトに定義しています。関数を使う時は「あらかじめ」宣言する必要があるので、シェルスクリプト内では順番に気をつけましょう(使用する場所よりも常に前)*5宣言したシェル関数の内容は、変数とおなじくsetコマンドで確認できます。"\033[2J\033[H"制御シーケンスです。(制御シーケンスっていうのが何なのかについてはこちらを参照)ここでは画面消去([2J)とカーソル位置リセット([H)を使っています。画面消去はclearコマンド、カーソル関連はtputコマンド等でも実行できます、たぶん。多用するクセがあります。制御シーケンスでカーソル移動してから(\033[縦位置;横位置H)文字「*」や「+」をプリントしています。H」では要らないスペースが入ってしまうので、あえて括弧つきで変数指定します。条件;」と同じ意味になります。他のプログラミング言語と同じノリで「[条件]」とスペースを空けずに括弧でくくるとエラーになるので気をつけましょう。改行を入れて(もっと読みやすく)書くならセミコロンは不要です。