Unix / Linux - 特殊変数

こんにちは、将来のプログラマーさんたち!UnixおよびLinuxの特殊変数の世界に誘うこの興奮的な旅に、あなた们的ガイドとして参加できることを嬉しく思います。コンピュータサイエンスを多年間教えてきた者として、これらの概念をマスターすることは、あなたたちのプログラミングの冒険においてゲームチェンジャーになることを保証できます。それでは、始めましょう!

Unix / Linux - Special Variables

特殊変数の紹介

本質的な部分に入る前に、特殊変数とは何かを理解しましょう。UnixおよびLinuxでは、特殊変数はシェル環境や現在のプロセスに関する特定の情報を保持する事前に定義された変数です。まるでシェルの世界の秘密工作員のようで、いつも重要な情報を用意しています!

コマンドライン引数

コマンドライン引数とは?

コマンドライン引数は、スクリプトを実行するときに追加する情報です。ロボットがタスクを開始する前に指示を与えるようなものです。

簡単な例を見てみましょう:

#!/bin/bash
echo "Hello, $1!"

このスクリプトをgreet.shとして保存し、./greet.sh Aliceで実行すると、以下のように出力されます:

Hello, Alice!

ここで、$1は最初のコマンドライン引数を表しています。

複数の引数の使用

わずか一つの引数に限定されることはありません。スクリプトを拡張してみましょう:

#!/bin/bash
echo "Hello, $1! Welcome to $2."

今度は./greet.sh Alice Wonderlandを実行すると、以下のようになります:

Hello, Alice! Welcome to Wonderland.

ここで、$1は「Alice」を、$2は「Wonderland」を表しています。

$0変数

もう一つの特殊変数、$0值得一提です。これはスクリプト自体の名前を表します。スクリプトを以下のように修正してみましょう:

#!/bin/bash
echo "This script is called $0"
echo "Hello, $1! Welcome to $2."

./greet.sh Alice Wonderlandを実行すると、以下のように出力されます:

This script is called ./greet.sh
Hello, Alice! Welcome to Wonderland.

特殊パラメータ $* と $@

では、非常に便利な二つの特殊パラメータ、$*$@について話しましょう。これらはコマンドライン引数のダイナミックなコンビ!

$* パラメータ

$*パラメータは、すべてのコマンドライン引数を一つの文字列として表します。まるで全部の引数を一つのバスケットに入れるようなものです。以下に例を示します:

#!/bin/bash
echo "All arguments using \$*: $*"

このスクリプトに./args.sh apple banana cherryを実行すると、以下のように出力されます:

All arguments using $*: apple banana cherry

$@ パラメータ

$@パラメータは似ていますが、各引数を個別のエンティティとして扱います。それぞれの引数を小さな箱に入れるようなものです。動作を見てみましょう:

#!/bin/bash
echo "All arguments using \$@:"
for arg in "$@"
do
echo $arg
done

これを./args.sh apple banana cherryで実行すると、以下のようになります:

All arguments using $@:
apple
banana
cherry

$* と $@ の違い

「同じに見える」と思うかもしれませんが、ダブルクォートを使うと違いが明確になります。以下にその例を示します:

#!/bin/bash
echo "Using \$*:"
for arg in "$*"
do
echo $arg
done

echo "Using \$@:"
for arg in "$@"
do
echo $arg
done

./difference.sh "Hello World" OpenAI ChatGPTで実行すると、以下のようになります:

Using $*:
Hello World OpenAI ChatGPT

Using $@:
Hello World
OpenAI
ChatGPT

違いが見えますか?"$*"はすべての引数を一つの文字列として扱いますが、"$@"は各引数を保持します。

終了ステータス

最後に、終了ステータスについて話しましょう。UnixおよびLinuxでは、すべてのコマンドは実行終了時に終了ステータスを返します。このステータスは0から255の番号で、0は通常成功を意味し、他の番号はエラーを示します。

$? 変数

最後に実行されたコマンドの終了ステータスは$?変数に格納されます。以下にその動作を見てみましょう:

#!/bin/bash
ls /nonexistent_directory
echo "Exit status of ls command: $?"

echo "Hello, World!"
echo "Exit status of echo command: $?"

このスクリプトを実行すると、以下のようになるかもしれません:

ls: cannot access '/nonexistent_directory': No such file or directory
Exit status of ls command: 2
Hello, World!
Exit status of echo command: 0

lsコマンドは失敗しました(終了ステータス2)、一方echoコマンドは成功しました(終了ステータス0)。

スクリプト内での終了ステータスの使用

終了ステータスを使ってスクリプト内で判断を行うことができます。以下にその例を示します:

#!/bin/bash
ping -c 1 google.com > /dev/null

if [ $? -eq 0 ]
then
echo "Internet is working!"
else
echo "Internet is not working!"
fi

このスクリプトはGoogleにpingを送信し、終了ステータスを確認します。終了ステータスが0(成功)ならば、インターネットが動作していると判断します。

結論

おめでとうございます!Unix/Linuxのプログラミング旅において大きな一歩を踏み出しました。これらの特殊変数は小さく見えるかもしれませんが、あなたたちのプログラミングツールキットにおいて非常に強力なツールです。練習は完璧を生みますので、これらの概念を自分のスクリプトで実験してみてください。

以下は、今回カバーした特殊変数の簡単なリファレンス表です:

変数 説明
$0 スクリプトの名前
$1, $2, ... コマンドライン引数
$* すべての引数を一つの文字列として
$@ すべての引数を個別の文字列として
$? 最後のコマンドの終了ステータス

引き続きコードを書き、学び続け、何より楽しみましょう!次回まで、ハッピースクリプティング!

Credits: Image by storyset