bashのシェルスクリプトをプログラミングする際に必要となる情報をまとめています。
※目次をクリックすると目次の下部にコンテンツが表示されます。
- 1.変数
- 2.環境変数
- 3.制御構造([…])
- 4.if文
- 5.for文、while文
- 6.数値演算
- 7.関数
- 8.コマンド置換(`…`、$(…))
- 9.文字列演算子(${…})>
- 10.パイプ
- 11.リスト
変数
●変数の宣言、割り当て
・シェルでは変数を宣言せずに使用する。
・環境変数は通常大文字が使われ、ユーザーが定義する変数には通常小文字が使われる。
・変数に初期値を割り当てる等、変数を最初に使用した時点で、その変数が作成される。
・変数の割り当て時、等号の両側に空白を入れてはいけない。
・空白を含む文字列は引用符で囲む必要がある。
●変数のデータ型
・デフォルトでは、すべての変数は文字列型として扱われる。
●変数の値の取得
$varnameまたは${varname}
・変数名の前に”$”文字を付ける事で変数の内容を取得することが出来る。
・$varnameは${varname}の簡易形。
変数名の後にアルファベット、数字、アンダースコア以外の文字が続く場合は、ブレースを省略できる。
●クォート、変数の置き換え
〇シングルクォート
・シングルクォート内で$変数を使用した場合に、変数の内容に置き換わらない。
〇ダブルクォート
・ダブルクォート内で$変数を使用した場合に、変数の内容に置き換わる。
・シェルでは変数を宣言せずに使用する。
・環境変数は通常大文字が使われ、ユーザーが定義する変数には通常小文字が使われる。
・変数に初期値を割り当てる等、変数を最初に使用した時点で、その変数が作成される。
・変数の割り当て時、等号の両側に空白を入れてはいけない。
・空白を含む文字列は引用符で囲む必要がある。
●変数のデータ型
・デフォルトでは、すべての変数は文字列型として扱われる。
●変数の値の取得
$varnameまたは${varname}
・変数名の前に”$”文字を付ける事で変数の内容を取得することが出来る。
・$varnameは${varname}の簡易形。
変数名の後にアルファベット、数字、アンダースコア以外の文字が続く場合は、ブレースを省略できる。
●クォート、変数の置き換え
〇シングルクォート
・シングルクォート内で$変数を使用した場合に、変数の内容に置き換わらない。
〇ダブルクォート
・ダブルクォート内で$変数を使用した場合に、変数の内容に置き換わる。
環境変数
●環境変数の概要
・環境変数の名前は通常は大文字。
・シェルスクリプトの実行が開始されると、いくつかの変数は、あらかじめ環境に含まれている値で初期化される。
●よく使用される環境変数
・$HOME
現在のユーザーのホームディレクトリ。
・$PATH
コマンドを検索するディレクトリのリストをコロンで区切ったもの。
・$IFS
内部フィールドセパレータ。シェルが入力を読み取るときに語の区切りとして使う文字のリスト。通常は、空白、タブ、改行文字。
・$0
シェルスクリプトの名前。
・$#
渡されたパラメータの数。
・$$
シェルスクリプトのプロセスID。
・$?
前のコマンドの終了ステータス。
・環境変数の名前は通常は大文字。
・シェルスクリプトの実行が開始されると、いくつかの変数は、あらかじめ環境に含まれている値で初期化される。
●よく使用される環境変数
・$HOME
現在のユーザーのホームディレクトリ。
・$PATH
コマンドを検索するディレクトリのリストをコロンで区切ったもの。
・$IFS
内部フィールドセパレータ。シェルが入力を読み取るときに語の区切りとして使う文字のリスト。通常は、空白、タブ、改行文字。
・$0
シェルスクリプトの名前。
・$#
渡されたパラメータの数。
・$$
シェルスクリプトのプロセスID。
・$?
前のコマンドの終了ステータス。
制御構造([…]、[[…]])
●[ condition ]制御構造(またはtest EXPRESSION)
・conditionが真かどうかを示す終了ステータスを返す。
・”[“、”]”と”condition”の間にスペースが必要。
●[ condition ]制御構造で、よく使用される演算子
〇論理演算子
・EXPRESSION1 -a EXPRESSION2
AND
・EXPRESSION1 -o EXPRESSION2
OR
〇ファイル属性演算子
・-e FILE
FILEが存在する
・-x FILE
FILEが存在し、ファイルに実行権限(ディレクトリの場合はsearch)権限が与えられている。
・-f FILE
FILEが存在し、かつ通常ファイル。
・-d FILE
FILEが存在し、かつディレクトリである。
・-h FILE
FILEが存在し、かつシンボリックリンクである。
・-s FILE
FILEが存在し、空ではない。
〇文字列比較演算子
・-n STRING
STRINGがNULLではない。長さが0より大きい。
・-z STRING
STRINGがNULL。長さが0。
・STRING1 = STRING2
・STRING1 != STRING2
〇数値評価演算子
・INTEGER1 -eq INTEGER2
・INTEGER1 -ge INTEGER2
・INTEGER1 -gt INTEGER2
・INTEGER1 -le INTEGER2
・INTEGER1 -lt INTEGER2
・INTEGER1 -ne INTEGER2
●[[ expression ]]
以下の記事参照。
bashでパターンマッチを使って条件評価
・conditionが真かどうかを示す終了ステータスを返す。
・”[“、”]”と”condition”の間にスペースが必要。
●[ condition ]制御構造で、よく使用される演算子
〇論理演算子
・EXPRESSION1 -a EXPRESSION2
AND
・EXPRESSION1 -o EXPRESSION2
OR
〇ファイル属性演算子
・-e FILE
FILEが存在する
・-x FILE
FILEが存在し、ファイルに実行権限(ディレクトリの場合はsearch)権限が与えられている。
・-f FILE
FILEが存在し、かつ通常ファイル。
・-d FILE
FILEが存在し、かつディレクトリである。
・-h FILE
FILEが存在し、かつシンボリックリンクである。
・-s FILE
FILEが存在し、空ではない。
〇文字列比較演算子
・-n STRING
STRINGがNULLではない。長さが0より大きい。
・-z STRING
STRINGがNULL。長さが0。
・STRING1 = STRING2
・STRING1 != STRING2
〇数値評価演算子
・INTEGER1 -eq INTEGER2
・INTEGER1 -ge INTEGER2
・INTEGER1 -gt INTEGER2
・INTEGER1 -le INTEGER2
・INTEGER1 -lt INTEGER2
・INTEGER1 -ne INTEGER2
●[[ expression ]]
以下の記事参照。
bashでパターンマッチを使って条件評価
if文、case文、select文
●if文
〇構文
〇構文
if condition then statements elif then statements else statements fi
●case文
〇構文
case variable in pattern [ | pattern] ...) statements;; pattern [ | pattern] ...) statements;; ・・・ esac
〇使用例
case "$1" in start) start;; stop) stop;; status) status -p "$mypidfile" $prog;; restart) restart;; condrestart|try-restart) condrestart;; reload) exit 3;; force-reload) restart;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" exit 2 esac
●select文
bashのselect制御構造
for文、while文
●for文
〇構文
〇構文
for variable in values do statements done
・ある範囲の値に対して繰り返し操作を行う場合に使う。
・値には、任意の文字列の集合を指定できる。
・指定する値は、プログラムの中にあらかじめ記述しておくこともできるが、通常はシェルによるファイル名の展開結果などを利用する。
※以下の記事も参照。
・bashのfor文で配列やセパレータ付き文字列から各要素を取り出す
・bashのfor文を使ってディレクトリ内のファイル一覧とディレクトリ一覧を出力
●while文
〇構文
while condition do statements done
〇一定の回数実行する場合の例
cnt=1 while [ "$cnt" -le 20 ] do statements cnt=$(($cnt+1)) done
●until文
〇構文
until condition do statements done
数値演算
●数値演算子
・加算乗除、剰余:+、-、*、/、%
・ビットシフト:<<、>>
・論理積、和:&、|
・論理否定:~、!
・排他的論理和:^
●let文
〇構文
let intvar=expression
・数値演算式を評価した後、結果を変数に代入
●$((…))
・数値演算式として解釈する。
※以下の記事も参照。
bashでの式の評価と算術演算
・加算乗除、剰余:+、-、*、/、%
・ビットシフト:<<、>>
・論理積、和:&、|
・論理否定:~、!
・排他的論理和:^
●let文
〇構文
let intvar=expression
・数値演算式を評価した後、結果を変数に代入
●$((…))
・数値演算式として解釈する。
※以下の記事も参照。
bashでの式の評価と算術演算
関数
〇構文
function_name () { statements }
〇定義する場所
・関数は呼び出す前に定義して必要がある。
〇関数の引数
・関数が呼び出されると、スクリプトの位置パラメータ$*、$@、$#、$1、$2などは関数のパラメータに置き換えられる。
関数に渡された引数は、これらのパラメータから読み取られる。
関数の実行が終了すると、パラメータはもとの値に戻される。
〇戻り値
・関数の中でreturnコマンドを使うと関数から数値を返すことができる。
・関数から文字列を返すには、関数の中で変数に文字列を格納する。
〇ローカル変数
・キーワードlocalを使うと、シェルの関数の中でローカル変数を宣言できる。
コマンド置換(`…`、$(…))
〇構文
`Linux-command`
$(linux-command)
コマンドの標準出力を変数の値として利用することができる。
〇使用例
・$(pwd)の値は、カレントディレクトリ
・$(ls $HOME)の値は、ホームディレクトリにあるすべてのファイルの名前。
・$(ls $(pwd))の値は、カレントディレクトリにあるすべてのファイルの名前。
`Linux-command`
$(linux-command)
コマンドの標準出力を変数の値として利用することができる。
〇使用例
・$(pwd)の値は、カレントディレクトリ
・$(ls $HOME)の値は、ホームディレクトリにあるすべてのファイルの名前。
・$(ls $(pwd))の値は、カレントディレクトリにあるすべてのファイルの名前。
文字列演算子(${…})
●文字列演算子の用途
・変数の存在を確定する(定義されており、値がNULLではない)。
・変数にデフォルトの値を設定する。
・変数に値が設定されなかったときのエラーをキャッチする。
・変数の値からパターンと一致する部分を取り除く。
1)置換演算子
・変数の存在を評価し、ある条件のもとでデフォルトの値を置換する。
・下記①から④においては”:”はオプションで、省略された場合は、varnameの存在のみ評価し、NULLは評価しない。
①${varname:-word}
・変数が定義されていない場合にデフォルトの値を使用する。
・varnameが存在しNULLではない場合、その値を返す。それ以外の場合はwordを返す。
使用例)
pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
②${varname:=word}
・変数が定義されていない場合にデフォルトの値を割り当てる。
・varnameが存在しNULLではない場合、その値を返す。それ以外の場合はvarnameにwordを設定して返す。
③${varname:?word}
・変数が定義されていない場合に発生するエラーをキャッチする。
・varnameが存在しNULLではない場合、その値を返す。それ以外の場合はvarnameのあとにwordを出力し、現在のコマンドあるいはスクリプトを中止する。
④${varname:+word}
・他の値を使用する。
・varnameが存在しNULLではない場合、wordを返す。それ以外の場合はNULLを返す。
⑤${varname:offset:length}
・文字列の一部を取り出す。
・offsetの位置からlength文字の長さのサブ文字列を$varnameの値から取り出す。
2)パターン照合演算子
・変数の値である文字列の一部をパターンと照合するのに使用。
①${varname#pattern}
・varnameの先頭を起点として、patternに一致するvarnameの最短部分を削除し、残りの部分を返す。
②${varname##pattern}
・varnameの先頭を起点として、patternに一致するvarnameの最長部分を削除し、残りの部分を返す。
③${varname%pattern}
・varnameの末尾を起点として、patternに一致するvarnameの最短部分を削除し、残りの部分を返す。
④${varname%%pattern}
・varnameの末尾を起点として、patternに一致するvarnameの最長部分を削除し、残りの部分を返す。
⑤${varname/pattern/string}、${varname//pattern/string}、
・varnameの値でpatternと最も長く一致する部分をstringと置換する。
・最初の構文では最初に一致した部分だけが置換され、二つ目の構文では一致する部分はすべて置換される。
※以下の記事も参照。
bashのパターンマッチ演算子の使い方
3)長さを返す演算子(${#variable})
〇${#variable}
・変数の値の長さを返す。
・変数の存在を確定する(定義されており、値がNULLではない)。
・変数にデフォルトの値を設定する。
・変数に値が設定されなかったときのエラーをキャッチする。
・変数の値からパターンと一致する部分を取り除く。
1)置換演算子
・変数の存在を評価し、ある条件のもとでデフォルトの値を置換する。
・下記①から④においては”:”はオプションで、省略された場合は、varnameの存在のみ評価し、NULLは評価しない。
①${varname:-word}
・変数が定義されていない場合にデフォルトの値を使用する。
・varnameが存在しNULLではない場合、その値を返す。それ以外の場合はwordを返す。
使用例)
pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
②${varname:=word}
・変数が定義されていない場合にデフォルトの値を割り当てる。
・varnameが存在しNULLではない場合、その値を返す。それ以外の場合はvarnameにwordを設定して返す。
③${varname:?word}
・変数が定義されていない場合に発生するエラーをキャッチする。
・varnameが存在しNULLではない場合、その値を返す。それ以外の場合はvarnameのあとにwordを出力し、現在のコマンドあるいはスクリプトを中止する。
④${varname:+word}
・他の値を使用する。
・varnameが存在しNULLではない場合、wordを返す。それ以外の場合はNULLを返す。
⑤${varname:offset:length}
・文字列の一部を取り出す。
・offsetの位置からlength文字の長さのサブ文字列を$varnameの値から取り出す。
2)パターン照合演算子
・変数の値である文字列の一部をパターンと照合するのに使用。
①${varname#pattern}
・varnameの先頭を起点として、patternに一致するvarnameの最短部分を削除し、残りの部分を返す。
②${varname##pattern}
・varnameの先頭を起点として、patternに一致するvarnameの最長部分を削除し、残りの部分を返す。
③${varname%pattern}
・varnameの末尾を起点として、patternに一致するvarnameの最短部分を削除し、残りの部分を返す。
④${varname%%pattern}
・varnameの末尾を起点として、patternに一致するvarnameの最長部分を削除し、残りの部分を返す。
⑤${varname/pattern/string}、${varname//pattern/string}、
・varnameの値でpatternと最も長く一致する部分をstringと置換する。
・最初の構文では最初に一致した部分だけが置換され、二つ目の構文では一致する部分はすべて置換される。
※以下の記事も参照。
bashのパターンマッチ演算子の使い方
3)長さを返す演算子(${#variable})
〇${#variable}
・変数の値の長さを返す。
パイプ