3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hello World あたたたた 19日目 Bash編

Last updated at Posted at 2025-12-18

この記事は Hello World あたたたた Advent Calendar 2025 の19日目の記事です.

今日は Bash で Hello World あたたたた を実装して解説していきます.

そもそも「Hello World あたたたた」が何かは 1日目の記事 をご覧ください.

コーディング例

paiza.io (Bash環境) で実際に動かしてみることができます.

#!/bin/bash

hako=""
running=true

while [ "$running" = true ]; do
    x=$((RANDOM % 2))
    
    if [ "$x" -eq 0 ]; then
        char="あ"
    else
        char="た"
    fi

    echo -n "$char"

    hako="${hako}${char}"

    if [[ "$hako" =~ あたたたた$ ]]; then
        echo ""
        echo "お前はもう死んでいる"
        running=false
    fi
done

コードと文法の解説

変数の宣言と代入

hako=""
running=true

ここでは,hako に空文字,running に文字列の true を代入しています.
Bashを含むシェルスクリプトには,厳密な意味での「Boolean型(真偽値型)」というデータ型はありません.変数は基本的にすべて文字列として扱われます.ここではフラグとしてわかりやすく true という文字列を入れています.

注意点として,Bashでは 代入時の = の前後に空白を入れることができません

hako = ""  # これはエラー!

Bashは空白を「コマンドと引数の区切り」として解釈します.そのため,上記のように書くと「hako というコマンドに,="" という引数を渡して実行する」と解釈されてしまい,「command not found」エラーになります.

なお,true はBashではコマンドとしても存在しますが,ここではコマンドの成否を使っているわけではなく,単純に「文字列 true と等しいか」を比較しています.

while文によるループ

while [ "$running" = true ]; do
    # 処理内容
done

while 文を使用することで,条件式が正常終了(終了ステータスが0)である間,ブロック内を繰り返し実行します.

ここでの書き方のポイントは [ ... ] です.これは実は test というコマンドの省略記法(または同等の組み込みコマンド)であるため,内部の条件式の前後には必ずスペースが必要です.
[ の直後と ] の直前,そして演算子 = の前後にも空白を入れないと,構文エラーになります.

乱数生成

x=$((RANDOM % 2))

疑似乱数の生成には,Bashの組み込み変数 RANDOM を使用します.
この変数は参照するたびに,0 から 32767 ($2^{15}-1$) までの整数をランダムに返します.
今回は「あ」か「た」の2択なので,この値を 2 で割った余り (% 2) を計算し,0 か 1 を得ています.

詳しくは公式の Bash Reference Manual でも確認できます.

if文による条件分岐

if [ "$x" -eq 0 ]; then
    char="あ"
else
    char="た"
fi

数値の比較には -eq (equal) を使うのが一般的です(= でも動きますが,= は文字列比較の意味合いが強いです).
0 ならば char に「あ」,それ以外なら「た」を代入します.if文は最後に fi (ifを逆にしたもの) で閉じる必要があります.

出力と文字列結合

echo -n "$char"
hako="${hako}${char}"

echo は標準出力を行うコマンドですが,デフォルトでは改行されてしまいます.オプション -n をつけることで改行を抑止し,「あたた…」と続けて表示されるようにしています.
また,hako="${hako}${char}" のように記述することで,変数の後ろに文字を連結しています.

Bashでは echo -n が利用できますが,より厳密な出力制御が必要な場合は printf を使う方法もあります.

正規表現による終了判定

if [[ "$hako" =~ あたたたた$ ]]; then
    echo ""
    echo "お前はもう死んでいる"
    running=false
fi

変数 hako の末尾が「あたたたた」になったかを判定します.

  • [[ ... ]] : Bash独自の拡張テストコマンドです.従来の [ ... ] よりも高機能で,論理積(&&)などが書きやすく,今回のような正規表現もサポートしています.
  • =~ : 右辺を 正規表現 として評価し,マッチするかを判定する演算子です.
  • あたたたた$ : 正規表現の $ は「行末」を意味します.つまり,文字列の最後が「あたたたた」で終わっている場合のみ真となります.

Bash の歴史

Bash(Bourne-Again SHell)は,Brian Fox によって GNU プロジェクトのために開発された Unix 系シェルで,1989 年に最初の版(初期リリース)が公開されました.

その名の通り,Unix において広く使われてきた Bourne Shell(sh)との高い互換性を持つシェルとして設計されており,Bash という名称は「Bourne」と「生まれ変わり(Born Again)」を掛け合わせたダジャレになっています.

Bash は sh と互換性のある文法を維持しつつ,コマンドライン編集機能,コマンド履歴(ヒストリ)機能,ジョブ制御など,多くの利便性の高い機能を拡張しています.そのため,現在でも多くの Linux ディストリビューションにおいて事実上の標準シェルとして採用されています(ただし,OS や環境によっては他のシェルが標準となっている場合もあります).

このように Bash は,単なる対話的なシェルとしてだけでなく,自動化や環境構築を支える強力なスクリプト言語としても長年にわたって利用され続けているツールです.

感想

Slurm と呼ばれるジョブスケジューラ環境のために,このような Bash における .sh のファイルを頻繁に使用してきました. 今回の「Hello World あたたたた」の実装を通じて,改めて「プログラミング言語」としてのBashの側面を再認識しました.

普段の研究や開発では,複雑な処理は Python などのアプリケーション側に任せてしまい,シェルスクリプトは単なる「実行コマンドの羅列」や「引数の受け渡し」になりがちです. しかし今回,乱数生成や正規表現マッチングといったロジックをBashだけで完結させたことで,[[ ]] の強力さや構文の厳密さ(スペースの重要性など)を深く学ぶ良い機会になりました.

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?