シェルスクリプトでは、単にコマンドを実行するだけではなく、条件によって処理を変えたり、繰り返し処理を行ったり、また、通常のコマンドのように引数を受け取って、引数に応じた処理を行ったりすることができます。今回は、シェルスクリプトで「変数」を扱う方法について解説します。
「変数」の扱い方はコマンドラインと同じです。シェルスクリプトの中で新しく変数を使いたい場合は、「変数名=値」のように指定します。「=」記号の前後に空白を入れることはできません。
定義した変数の値は「$変数名」で参照できます。既存の環境変数やシェル変数も同じように参照します。
- #! /bin/bash
- STR="abc"
- echo "$STR"
- $ chmod +x vartest
- $ ./vartest
- abc ← 変数「STR」の内容が表示された
「変数名=`コマンド`」で、コマンドの実行結果を変数に保存することができます。以下のサンプルスクリプトでは、「date」コマンドを使って、変数「TODAY」に今日の日付を8桁の数字で保存しています。
- #! /bin/bash
- TODAY="`date +%Y%m%d`"
- echo "$TODAY"
- $ chmod +x setTODAY
- $ ./setTODAY
- 20181003 ← 変数「TODAY」の内容が表示された
シェルスクリプトは、「#!」行の指定に従い、bashが別途起動して実行しています。従って、シェルスクリプトの中で定義した変数は、シェルスクリプトの中だけで使用できます。
実行後も参照したい場合は、「source」コマンドを使って、シェルスクリプトを“現在動作している”bashに読み込ませる必要があります。
- $ ./setTODAY ← setTODAYを実行する(bashが別途起動して実行している)
- 20181003 ← 変数「TODAY」の内容が表示された
- $ echo "$TODAY" ← 変数「TODAY」の内容を確認
- ← 何も表示されない
- $ source setTODAY ← sourceコマンドで現在のシェルにsetTODAYを読み込ませる
- 20181003 ← 変数TODAYの内容が表示された
- $ echo "$TODAY" ← 変数TODAYの内容を確認
- 20181003 ← 変数TODAYの内容が表示された
なお、「変数名=値」でセットした変数は、シェル変数となります。シェル以外からも参照したい場合は、「export」コマンドで環境変数にします。exportする場合も、シェルスクリプト終了後も使用するにはsourceコマンドによる操作が必要です。
変数の一部を使用したり、変数を組み合わせて使用したりできます。
本稿で紹介しているサンプルは、コマンドラインでも試すことができます。特別書かれていない箇所については、引用符はコマンドライン、シェルスクリプトともに省略可能です。
変数名の一部を使用したい場合は、「${変数名:開始位置:長さ}」のように指定します。なお、先頭は「0」です。
指定した文字列までを削除したい場合は、「${変数名#文字列}」とします。文字列を後ろから探して削除するならば「${変数名%文字列}」で指定します。文字列の指定にはワイルドカード(*)も使用できます。
例えば、環境変数「LANG」の、例(1)0文字目から5文字分、例(2)「.」という文字までを削除、例(3)「.」という文字以降を削除するにはそれぞれ次のようにします。なお、操作を指定せず「${変数名}」とした場合は、「$変数名」と同じ意味になります。
- #! /bin/bash
- echo "$LANG" #環境変数「LANG」の内容を表示
- echo "${LANG:0:5}" #(1)LANGの先頭から5文字分を表示
- echo "${LANG#*.}" #(2)「.」までを削除
- echo "${LANG%.*}" #(3)「.」以降を削除
- $ chmod +x varpart
- $ ./varpart
- ja_JP.utf8 ← 変数「LANG」の内容
- ja_JP ← ${LANG:0:5}の結果
- utf8 ← ${LANG#*.}の結果
- ja_JP ← ${LANG%.*}の結果
指定方法 | 操作内容 |
---|---|
${変数名:開始位置:長さ} | 開始位置から指定した長さ分の文字列を切り出す |
${変数名#パターン} | パターン部分(前方一致)を削除。#の場合は最短一致、##の場合は最長一致 |
${変数名##パターン} | |
${変数名%文字列} | パターン部分(後方一致)を削除。%の場合は最短一致、%%の場合は最長一致 |
${変数名%%文字列} | |
${変数名:-文字列} | 変数の内容を取得。変数がセットされていない場合は指定した文字列を返す |
${変数名:=文字列} | 変数の内容を取得。変数がセットされていない場合は文字列。変数がセットされて いない場合は変数に指定した文字列をセットした上で返す |
${#変数名} | 変数の文字数(配列の場合は要素数) |
「echo $変数$変数」のように変数を続けて書くことで、変数の内容をそのまま続けることができます。変数名の部分を明確に表すには「${変数名}」のように、「{~}」で囲みます。
以下スクリプトの(1)~(5)は、全て同じ結果となります。
- #! /bin/bash
- str1="100"
- str2="200"
- echo "$str1$str2" #(1)
- echo "${str1}${str2}" #(2)
- echo "${str1}""${str2}" #(3)
- echo $str1$str2 #(4)
- echo ${str1}${str2} #(5)
- $ chmod +x concatvar
- $ ./concatvar
- 100200
- 100200
- 100200
- 100200
- 100200
以下のスクリプトでは、(1)と(2)ではそれぞれ「expr 100 + 200」を実行しています。なお、「100」や「+」はそれぞれexprコマンドの引数なので、空白で区切る必要があります。(3)のように空白がないと足し算ではなく、文字列の連結となります。
計算結果を変数に保存したい場合は、(4)のようにバッククオートを使用します。また、計算結果を判定条件などで使いたい場合は、「let」コマンドも使用できます。
- #! /bin/bash
- str1="100"
- str2="200"
- expr "$str1" "+" "$str2" #(1)
- expr $str1 + $str2 #(2)
- expr $str1+$str2 #(3)
- str3=`expr "$str1" "+" "$str2"` #(4)
- echo "$str3" #(4)の結果を表示
- $ chmod +x calcvar
- $ ./calcvar
- 300
- 300
- 100+200
- 300
シェルスクリプトの中で計算する場合は、exprコマンドまたはletコマンドを使うのが一般的ですが、どちらも整数しか扱うことができません。
小数点以下の数まで必要になる場合は、「bc」コマンドを使用します(※)。
【※】「bc」も制御構文を使ったスクリプト処理が可能なコマンドです。文法はC言語と似ており、bashとは異なります。
- #! /bin/bash
- str1=10.5
- str2=3.2
- echo $str1+$str2 | bc
- ans=`echo $str1*$str2 | bc`
- echo $ans
- $ chmod +x calcbc
- $ ./calcbc
- 13.7
- 33.6
西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.
Linux �� OSS 險倅コ九Λ繝ウ繧ュ繝ウ繧ー