_変数_とは、データを入れておく場所のことです。 Bashが扱うデータには、文字列と配列の2種類があります。 配列については、あとで説明します。
変数への代入は、次のように書きます。
name="value"
重要:イコールの前後に_スペースを入れてはいけません_!
次の例のようにスペースがあると、
x = 10
bashはxというコマンドを、=と10という2つの引数を付けて呼び出そうとします!
変数は_パラメーター_と呼ばれることもあります。 このドキュメントでは、この2つの用語を同じ意味で使います。
bashが使用したり設定したりする重要なパラメーターには、次のようなものがあります。
PATH:外部コマンドを探すときに使う、コロンで区切られたディレクトリの一覧です。IFS:「内部フィールドセパレーター」です。
これがどのように使われるかは、あとで見ていきます。PWD:現在の作業ディレクトリです。
pwdコマンドの出力と同じ値になります。RANDOM:0から32767までの疑似乱数の整数です。BASH_VERSION:実行中のbashのバージョン文字列です。変数名は、_英大文字、英小文字、数字、アンダースコア_で構成されます。 先頭を数字にすることはできません。
パラメーターの値は、$varnameという構文で取得します。
x=10
echo "The value of x is $x"
変数名が周りのテキストと紛れないようにするには、変数名を波括弧({})で囲みます。
たとえば、10x10という文字列を出力するには、次のようにします。
echo "${x}x$x"
# or
echo "${x}x${x}"
読みやすさや一貫性のために、ほとんどの場面で波括弧を使うことを勧めているスタイルガイドもあります。
コマンドと引数のレッスンで説明したように、コマンドは引数を受け取ることができます。 Bashスクリプトも例外ではありません。 現在実行中のbashに渡される引数は、_位置パラメーター_と呼ばれます。 これらは、次の特別なパラメーターで取り出せます。
$1:1番目の位置パラメーター$2 ... $9:それ以降のパラメーター${10} ...:2桁以上の数字には波括弧が必要です。$0:現在のスクリプトの名前です。シェル関数への引数も同じく位置パラメーターで、扱い方もまったく同じです。 関数については、あとのレッスンでさらに詳しく見ていきます。
位置パラメーターを扱うのに役立つ_特別なパラメーター_がいくつかあります。
$#:位置パラメーターの_数_に展開されます。"$@":すべての位置パラメーターを、それぞれ別の単語として並べたリストに展開されます。"$*":すべての位置パラメーターを、ある文字でつなげた1つの文字列に展開されます。
$IFS変数の_最初の文字_です。デフォルトではスペースです。"$@"は、位置パラメーターを安全に引用したまま別のコマンドに渡す、もっとも安全な方法です。
位置パラメーターをループで処理するときにも、これを使います。
for arg in "$@"; do
do_something_with "$arg"
done
実際には、"$*"よりも"$@"のほうがよく使われます。
bashスクリプトでよく行う操作のひとつに、コマンドの出力を受け取って変数に保存する、というものがあります。 これには_コマンド置換_を使います。
var=$(command)
たとえば、文字列を大文字にするには、次のようにします。
text="Hello world!"
uppercase=$(echo "$text" | tr '[:lower:]' '[:upper:]')
echo "$uppercase"
# => HELLO WORLD!
Bashには、外部コマンドを呼び出さなくても済むように、変数や文字列を操作する組み込みの機能がたくさん用意されています。
テキストを大文字にする。
前のセクションでは、trを使ってテキストを大文字にする方法を紹介しました。
bashでこれを行うには、次のようにします。
echo "${text^^}"
同じように、${text,,}とすると値を小文字にできます。
変数が空のときに、デフォルト値を用意する。
default="nothing here"
result=""
echo "${result:-$default}"
# => nothing here
検索と置換。
text="Hello world!"
echo "${text//[aeiou]/X}"
# => HXllX wXrld!"
ほかにも興味深いパラメーター展開がたくさんあります。部分文字列の取り出し、文字列の長さの取得、デフォルト値の_代入_、値の先頭や末尾からのテキストの削除など、さまざまです。 詳しくはマニュアルを読んでください。