シェルスクリプトに挑戦しよう(4)変数の定義と参照“応用力”をつけるためのLinux再入門(24)

シェルスクリプトでは、単にコマンドを実行するだけではなく、条件によって処理を変えたり、繰り返し処理を行ったり、また、通常のコマンドのように引数を受け取って、引数に応じた処理を行ったりすることができます。今回は、シェルスクリプトで「変数」を扱う方法について解説します。

» 2018年10月03日 05時00分 公開
[西村めぐみ@IT]
「“応用力”をつけるためのLinux再入門」のインデックス

“応用力”をつけるためのLinux再入門

変数の定義と参照

 「変数」の扱い方はコマンドラインと同じです。シェルスクリプトの中で新しく変数を使いたい場合は、「変数名=値」のように指定します。「=」記号の前後に空白を入れることはできません。

 定義した変数の値は「$変数名」で参照できます。既存の環境変数やシェル変数も同じように参照します。

  1. #! /bin/bash
  2. STR="abc"
  3. echo "$STR"
▲変数を定義して表示する例(vartest)

  1. $ chmod +x vartest
  2. $ ./vartest
  3. abc 変数「STR」の内容が表示された
▲実行結果(vartest)

●コマンドの実行結果を変数に保存する

 「変数名=`コマンド`」で、コマンドの実行結果を変数に保存することができます。以下のサンプルスクリプトでは、「date」コマンドを使って、変数「TODAY」に今日の日付を8桁の数字で保存しています。

  1. #! /bin/bash
  2. TODAY="`date +%Y%m%d`"
  3. echo "$TODAY"
▲dateコマンドの結果を変数「TODAY」に保存する(setTODAY)

  1. $ chmod +x setTODAY
  2. $ ./setTODAY
  3. 20181003 変数「TODAY」の内容が表示された
▲実行結果(setTODAY)

●スクリプト実行後も変数を使用できるようにする

 シェルスクリプトは、「#!」行の指定に従い、bashが別途起動して実行しています。従って、シェルスクリプトの中で定義した変数は、シェルスクリプトの中だけで使用できます。

 実行後も参照したい場合は、「source」コマンドを使って、シェルスクリプトを“現在動作している”bashに読み込ませる必要があります。

  1. $ ./setTODAY setTODAYを実行する(bashが別途起動して実行している)
  2. 20181003 変数「TODAY」の内容が表示された
  3. $ echo "$TODAY" 変数「TODAY」の内容を確認
  4. 何も表示されない
▲スクリプトをそのまま実行した場合

  1. $ source setTODAY sourceコマンドで現在のシェルにsetTODAYを読み込ませる
  2. 20181003 変数TODAYの内容が表示された
  3. $ echo "$TODAY" 変数TODAYの内容を確認
  4. 20181003 変数TODAYの内容が表示された
▲sourceコマンドでスクリプトを実行した場合

 なお、「変数名=値」でセットした変数は、シェル変数となります。シェル以外からも参照したい場合は、「export」コマンド環境変数にします。exportする場合も、シェルスクリプト終了後も使用するにはsourceコマンドによる操作が必要です。

変数の操作

 変数の一部を使用したり、変数を組み合わせて使用したりできます。

 本稿で紹介しているサンプルは、コマンドラインでも試すことができます。特別書かれていない箇所については、引用符はコマンドライン、シェルスクリプトともに省略可能です。

●変数の一部を使用する

 変数名の一部を使用したい場合は、「${変数名:開始位置:長さ}」のように指定します。なお、先頭は「0」です。

 指定した文字列までを削除したい場合は、「${変数名#文字列}」とします。文字列を後ろから探して削除するならば「${変数名%文字列}」で指定します。文字列の指定にはワイルドカード(*)も使用できます。

 例えば、環境変数「LANG」の、例(1)0文字目から5文字分、例(2)「.」という文字までを削除、例(3)「.」という文字以降を削除するにはそれぞれ次のようにします。なお、操作を指定せず「${変数名}」とした場合は、「$変数名」と同じ意味になります。

  1. #! /bin/bash
  2. echo "$LANG" #環境変数「LANG」の内容を表示
  3. echo "${LANG:0:5}" #(1)LANGの先頭から5文字分を表示
  4. echo "${LANG#*.}" #(2)「.」までを削除
  5. echo "${LANG%.*}" #(3)「.」以降を削除
▲変数「LANG」の一部を表示する(varpart)

  1. $ chmod +x varpart
  2. $ ./varpart
  3. ja_JP.utf8 変数「LANG」の内容
  4. ja_JP ${LANG:0:5}の結果
  5. utf8 ${LANG#*.}の結果
  6. ja_JP ${LANG%.*}の結果
▲実行結果(varpart)

●主な変数の操作
指定方法 操作内容
${変数名:開始位置:長さ} 開始位置から指定した長さ分の文字列を切り出す
${変数名#パターン} パターン部分(前方一致)を削除。#の場合は最短一致、##の場合は最長一致
${変数名##パターン}
${変数名%文字列} パターン部分(後方一致)を削除。%の場合は最短一致、%%の場合は最長一致
${変数名%%文字列}
${変数名:-文字列} 変数の内容を取得。変数がセットされていない場合は指定した文字列を返す
${変数名:=文字列} 変数の内容を取得。変数がセットされていない場合は文字列。変数がセットされて
いない場合は変数に指定した文字列をセットした上で返す
${#変数名} 変数の文字数(配列の場合は要素数)

●変数を連結する

 「echo $変数$変数」のように変数を続けて書くことで、変数の内容をそのまま続けることができます。変数名の部分を明確に表すには「${変数名}」のように、「{~}」で囲みます。

 以下スクリプトの(1)(5)は、全て同じ結果となります。

  1. #! /bin/bash
  2. str1="100"
  3. str2="200"
  4. echo "$str1$str2" #(1)
  5. echo "${str1}${str2}" #(2)
  6. echo "${str1}""${str2}" #(3)
  7. echo $str1$str2 #(4)
  8. echo ${str1}${str2} #(5)
▲変数を連結する(concatvar)

  1. $ chmod +x concatvar
  2. $ ./concatvar
  3. 100200
  4. 100200
  5. 100200
  6. 100200
  7. 100200
▲実行結果(concatvar)

●変数で計算する(exprコマンド)

 変数の値で計算したい場合は「expr」コマンドを使います。

 以下のスクリプトでは、(1)(2)ではそれぞれ「expr 100 + 200」を実行しています。なお、「100」や「+」はそれぞれexprコマンドの引数なので、空白で区切る必要があります。(3)のように空白がないと足し算ではなく、文字列の連結となります。

 計算結果を変数に保存したい場合は、(4)のようにバッククオートを使用します。また、計算結果を判定条件などで使いたい場合は、「let」コマンドも使用できます。

  1. #! /bin/bash
  2. str1="100"
  3. str2="200"
  4. expr "$str1" "+" "$str2" #(1)
  5. expr $str1 + $str2 #(2)
  6. expr $str1+$str2 #(3)
  7. str3=`expr "$str1" "+" "$str2"` #(4)
  8. echo "$str3" #(4)の結果を表示
▲変数で計算する(calcvar)

  1. $ chmod +x calcvar
  2. $ ./calcvar
  3. 300
  4. 300
  5. 100+200
  6. 300
▲実行結果(calcvar)

●実数も使用したい場合

 シェルスクリプトの中で計算する場合は、exprコマンドまたはletコマンドを使うのが一般的ですが、どちらも整数しか扱うことができません。

 小数点以下の数まで必要になる場合は、「bc」コマンドを使用します()。

【※】「bc」も制御構文を使ったスクリプト処理が可能なコマンドです。文法はC言語と似ており、bashとは異なります。


  1. #! /bin/bash
  2. str1=10.5
  3. str2=3.2
  4. echo $str1+$str2 | bc
  5. ans=`echo $str1*$str2 | bc`
  6. echo $ans
▲シェルスクリプトの中でbcコマンドを使用する(calcbc)

  1. $ chmod +x calcbc
  2. $ ./calcbc
  3. 13.7
  4. 33.6
▲実行結果(calcbc)

筆者紹介

西村 めぐみ(にしむら めぐみ)

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.

スポンサーからのお知らせPR

Linux �� OSS 險倅コ九Λ繝ウ繧ュ繝ウ繧ー

譛ャ譌・譛磯俣

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。