変数の一部を使用したり、変数を組み合わせて使用したりできます。
本稿で紹介しているサンプルは、コマンドラインでも試すことができます。特別書かれていない箇所については、引用符はコマンドライン、シェルスクリプトともに省略可能です。
変数名の一部を使用したい場合は、「${変数名:開始位置:長さ}」のように指定します。なお、先頭は「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
変数の値で計算したい場合は「expr」コマンドを使います。
以下のスクリプトでは、(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.