このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトの変数

シェルスクリプトの変数

 シェルスクリプトでは、他のプログラミング言語と同様に、値を格納するための変数を利用できます。これらの変数をシェル変数と呼びます。シェル変数を使うことで、スクリプト内で値を一時的に保存したり、繰り返し使用したりすることが可能になります。

シェル変数の例

 実はこれまでにもいくつかのシェル変数を利用してきました。たとえば、環境変数である PATH もシェル変数の一種です。

PATH="$PATH:~/bin"

解説

  • PATH:コマンドの検索パスを指定する環境変数です。
  • "$PATH:~/bin":既存の PATH の末尾に ~/bin ディレクトリを追加しています。
  • =:シェル変数への代入を行います。

上記のように、シェル変数に値を代入するには「変数名=値」という形式で指定します。

変数の値を参照する

 変数の値を参照するには、変数名の前に $ を付けます。これにより、シェルスクリプト内で変数がその値に置き換えられて実行されます。

例:変数 msg の値を表示するスクリプト

ステップ1:msg.sh の作成

user01@ubuntu:~$ nano msg.sh

msg.sh の内容

#!/bin/bash

msg="Hello Linux"
echo $msg

解説

  • msg="Hello Linux":変数 msg に文字列 "Hello Linux" を代入しています。
  • echo $msg:変数 msg の値を表示します。

ステップ2:実行権限の付与

user01@ubuntu:~$ chmod +x msg.sh

解説

  • chmod +x msg.shmsg.sh に実行権限を付与します。

ステップ3:スクリプトの実行

user01@ubuntu:~$ ./msg.sh

出力結果

Hello Linux

解説

  • 変数 msg の値が表示されました。

変数の書き方の注意点

 シェルスクリプトで変数を利用する際には、いくつかの注意点があります。他のプログラミング言語に慣れている人ほど間違えやすいポイントでもあるので、注意してください。

1.代入時には $ を付けない

誤った例

$msg="Hello Linux"

エラー内容

./msg.sh: 行 3: msg: コマンドが見つかりません

解説

  • 変数に値を代入する際には、変数名の前に $ を付けません。
  • $ を付けるのは、変数の値を参照するときだけです。

正しい例

msg="Hello Linux"

2.= の前後にスペースを入れない

シェルスクリプトでは、= の前後にスペースを入れるとエラーになります。

誤った例

msg = "Hello Linux"

エラー内容

./msg.sh: 行 3: msg: コマンドが見つかりません

解説

  • シェルはスペースで区切られた部分をコマンドと引数として解釈します。
  • 上記の例では、msg がコマンド、="Hello Linux" が引数として解釈され、不正なコマンドとして扱われます。

正しい例

msg="Hello Linux"

3.変数名の区切りを明示する

 変数の値に文字列を連結したい場合、変数名と文字列の境界が曖昧になると、意図しない動作になることがあります。

誤った例:変数展開と文字列の連結

ステップ1:rename.sh の作成
user01@ubuntu:~$ nano rename.sh

rename.sh の内容

#!/bin/bash

filename=savedata.dat
echo $filename_backup
ステップ2:実行権限の付与
user01@ubuntu:~$ chmod +x rename.sh

解説

  • $filename_backup はシェルから filename_backup という変数を参照しようとします。
  • filename_backup は未定義のため、空文字列となり、何も表示されません。
ステップ3:スクリプトの実行
user01@ubuntu:~$ ./rename.sh

実行結果

(何も表示されない)
user01@ubuntu:~$

正しい例:${} を使って変数名を明示する

ステップ4:rename.shの修正

変数名の部分を「${}」で囲むと変数名の区切りを明示することができます。

user01@ubuntu:~$ nano rename.sh

修正したrename.sh の内容

以下のようにrename.shを編集します。

#!/bin/bash

filename=savedata.dat
echo ${filename}_backup

解説

  • ${filename} によって、filename という変数名を明示的に指定します。
  • これにより、savedata.dat_backup と正しく連結されます。
ステップ5:スクリプトの実行
user01@ubuntu:~$ ./rename.sh

出力結果

savedata.dat_backup

解説

  • 期待通りに文字列が連結され、ファイル名が表示されました。

4.変数名の大文字・小文字

  • 変数名は大文字と小文字が区別されます。
  • 慣習的に、環境変数は大文字、ユーザー定義のシェル変数は小文字で記述します。

不要なファイルの削除

作業が終わったら、不要なファイルを削除しておきましょう。

user01@ubuntu:~$ rm msg.sh rename.sh

まとめ

  • シェル変数は、シェルスクリプト内で値を保持するために使用します。
  • 変数への代入変数名=値 の形式で行い、代入時には $ を付けません。
  • 変数の値を参照する際には、$変数名 または ${変数名} と記述します。
  • = の前後にスペースを入れないように注意してください。
  • 変数名の区切りを明示するために ${} を使用すると、安全に文字列を連結できます。
  • 変数名の大文字・小文字は区別されます。慣習的に環境変数は大文字、ユーザー定義のシェル変数は小文字を使用します。

 これらのポイントを押さえておくことで、シェルスクリプトでの変数の扱いがスムーズになります。変数を適切に活用して、より柔軟で効率的なシェルスクリプトを作成していきましょう。