All articles in bash

breakとcontinue

繰り返し制御breakとcontinueはfor文,while文,until文(このページではこの三つをループと呼ぶ)で使用できるコマンドである.breakcontinue break breakはループを抜けるように指示する.while :doecho hogebreakdone上の例で:はtrueコマンドと同じである.trueコマンドは必ずtrueを返す.すなわち上の例は無限ループだが,hogeと一回表示したあとbreak文でループを抜ける.breakは一つの数値パラメータをとることができる.この数値(正の整数)で抜けるループの数を指定することができる. continue continueは次の繰り返しに飛ぶように指示する.while :doecho hogecontinueecho fugadone上の例も無限ループである.hogeを表示したあと,continueによって次の繰り返しに飛ぶ.したがって,fugaと表示されることはない.continueも一つの数値パラメータをとることができる.この数値(正の整数)でどのループの次の繰り返しに飛ぶかを指定できる.

for文

BASHスクリプトにおけるfor文の書き方for文seq for文 for文の構文を以下に示す.for 変数 in 値(複数可)do文(複数可)donefor文では変数名に値を代入しdoとdoneに囲まれた文を実行する.doneまで来ると,次の値を変数に代入してまたdoとdoneに囲まれた文を実行する.以下に例を示す.for x in a b c d e f gdoecho $x seq

スクリプトの実行と環境

スクリプトが実行される際の環境について.スクリプトの実行bashのオプション別スクリプトによるshの環境の定義や変更(sourceコマンド)別shプロセスへの環境の引き渡し(exportコマンド)shの実行制御(setコマンド)shのパラメータ変数の設定(setコマンド,shiftコマンド)環境の削除(unsetコマンド) スクリプトの実行 ユーザがシステムにログインすると,普通は/bin/shというプログラムが起動する.そしてそのプログラムのコマンドプロンプトを通して人がシステムと対話する.ユーザはこのコマンドプロンプトからいくつかのコマンドを実行していくが,それらのプロセスは最初のshプロセスの子プロセスということになる.だから,shのコマンドプロンプトから実行したスクリプトもshの子プロセスとしてのshプロセスなのだ.スクリプトを起動するshプロセスとスクリプト自身であるshプロセスが別なので,当然環境が異なる.ここでいう環境とは,以下のものを指す.bashのオプションパラメータ,変数とその値定義されている関数 bashのオプション 別スクリプトによるshの環境の定義や変更(sourceコマンド) 別shプロセスへの環境の引き渡し(exportコマンド) (以下の文章は”スクリプト”を”プロセス”と書いた方が正確かもしれない)sourceコマンドはイメージ的には子スクリプトの環境定義を親プロセスに渡すものであった(実際は子スクリプトのプロセスは作成されず子スクリプトが実行するコマンドを親スクリプトが実行する).逆に親スクリプトの環境を子プロセスに変数の定義を引き渡すにはexportコマンドを使用する.a=hogeexport b=fugaecho $a $bbashecho $a $b一回目のechoではhoge fugaと出力されるが,二回目のechoではexportされた変数bの値であるfugaしか出力されない. shの実行制御(setコマンド) bashのオプションを先述したが,例えばスクリプト中のある部分だけデバッグしたくなった場合,オプションと同様の実行制御を途中で切替えられると便利である.これにはsetコマンドを使用する.以下にsetコマンドのオプションを示す.-nまたは-o noexecsh -nと同様-vまたは-o verbosesh -vと同様-xまたは-o xtracesh … More スクリプトの実行と環境

展開

BASHの変数展開機能は豊富で使いこなせると効率的なプログラミングができる.ただし,BASH独自の機能が多いので,他のシェルスクリプトへの移植性が下がる.展開コマンド実行evalコマンド算術展開変数展開 展開 何かを入力したとき,それが何なのかを突き止めてくれる,それが展開である.ls $HOMEとした場合,$HOMEが何なのかを突き止めて(この場合,変数の値を調べて),ls /home/hogeとしてくれるのが展開である. コマンド実行 あるコマンドに引数に別のコマンドの実行結果を代入することができる.それには$(command)とする.以下に例を示す.set $(date)while [ “$1” != “” ]doecho $1shiftdoneこれを実行すると,パラメータ変数にdateコマンドの実行結果が割り当てられ,それらを順に表示する.setコマンドの引数にdateコマンドの出力が渡されているのである. evalコマンド evalコマンドは引数を読み込んで一つのコマンドを生成する.そしてそのコマンドを実行する.以下に例を示す.a=dateeval b=’$(‘$a’)’echo $bまずaにdateという文字列を代入する.evalコマンドにはまず変数aが展開されてb=$(date)が渡される.そしてevalコマンドはb=$(date)というコマンドを実行する.そして最終的にbにdateコマンドの出力が代入され,その値がechoコマンドによってbの値が出力去れる.もしevalがなければbの値は$(date)という文字列になってしまう.この例を応用していくと,変数に動的に代入された,コマンドを示す文字列を実行することができる. 算術展開 算術展開は計算をして,その値に展開してくれる.算術展開は$((式))である.例を以下に示す.x=10echo … More 展開

BASHでの変数について

BASHスクリプトにおける変数の取扱について説明する.値の代入と参照クォート環境変数パラメータ変数配列宣言局所変数 値の代入と参照 変数は宣言せずに使用できる.以下の文では,変数xに文字列hogeを代入している.x=hogeこのとき,等号の両側にスペースをいれてはいけない.この変数xの内容を参照するには,変数の前に$を付ける.echo $x変数の値は文字列型として扱われる.そして数値の操作をするときに数値文字列を数値に変換する.また,大文字と小文字は区別される.変数の開放にはunsetを使用する.$ x=100$ echo $x100$ unset x$ echo $x クォート パラメータは空白,タブ,改行コードで区切られる.変数にこれらの値を代入するには,その値をダブルクォーテーションで囲う.x=”hoge foo”$変数名をダブルクォーテーションで囲うと,その変数の値は展開される.したがって,以下の二つの結果は等しい.echo $xecho “$x”逆に$変数名をシングルクォートで囲うとその変数の値は展開されない.したがって,以下の結果は$xである.echo ‘$x’この機能は,シングルクォートで囲った部分をBASHに解釈させたくない場合に使う.例えば,xで始まる全パッケージをインストールしたい場合は以下を実行する.echo -e ‘\a’\$変数名だと,\が$の持つ特別な意味を書き消す.したがって,以下の結果は$xである.echo \$x\もBASHに解釈させたくない特殊文字を使用するときに使う.以下の文はechoコマンドに\aを渡している.echo … More BASHでの変数について

シグナルのトラップ

シグナルとは非同期で生成されるイベントである.シグナルはシステムによって生成される.ユーザがプロセスを生成するには,ctrl-zとかctrl-cなど,そしてkillコマンドなどがある.BASHスクリプトではtrapコマンドによってプロセスがどのシグナルを受け取ったらどんな処理を行うかをあらかじめ登録しておくことができる.trapコマンド trapコマンド

BASHスクリプト

BASHスクリプトは強力なのでうれしい.日常生活で,ガリガリBASHスクリプトを書いて快適ライフを送るのだ.基本編応用編実践編 基本編 ちょっとBASHスクリプトプログラミングやってみる用.基本的な構文が中心.スクリプトの作成2003-07-20T15:13+09:00 matsuBASHスクリプトファイルの作成方法リダイレクトとパイプ2003-07-20T15:13+09:00 matsuリダイレクトとパイプによって,入力や出力の流れを制御することができる.BASHでの変数について2004-03-14T23:45+09:00 matsuBASHスクリプトにおける変数の取扱について説明する.条件,ステートメントブロックとif文2003-07-20T15:13+09:00 matsuBASHスクリプトでの条件式とステートメントブロックについて説明し,それをもとにif文の書き方を説明する.for文2003-07-20T15:13+09:00 matsuBASHスクリプトにおけるfor文の書き方while文とuntil文2003-07-20T15:13+09:00 matsuBASHスクリプトにおけるwhile文とuntil文breakとcontinue2003-07-20T15:13+09:00 matsu繰り返し制御breakとcontinueはfor文,while文,until文(このページではこの三つをループと呼ぶ)で使用できるコマンドである.case文2003-07-20T15:13+09:00 matsuBASHスクリプトにはswitch文に相当するのとしてcase文がある関数2003-07-20T15:13+09:00 matsuBASHスクリプトでも当然(?)関数を定義して呼び出すことができる.select2006-01-17T01:00+09:00 matsuselectを使用すると,メニューを表示してユーザに選択を促すようなスクリプトの記述が容易になるようなので,ためしてみた.応用編込み入ったプログラミング用.ちょっと込み入った話や重要なコマンドの紹介.スクリプトの実行と環境2003-07-20T15:13+09:00 matsuスクリプトが実行される際の環境について.シグナルのトラップ2003-07-20T15:13+09:00 matsuシグナルとは非同期で生成されるイベントである.シグナルはシステムによって生成される.ユーザがプロセスを生成するには,ctrl-zとかctrl-cなど,そしてkillコマンドなどがある.BASHスクリプトではtrapコマンドによってプロセスがどのシグナルを受け取ったらどんな処理を行うかをあらかじめ登録しておくことができる.展開2003-07-26T11:21+09:00 matsuBASHの変数展開機能は豊富で使いこなせると効率的なプログラミングができる.ただし,BASH独自の機能が多いので,他のシェルスクリプトへの移植性が下がる.実践編基本編,応用編を踏まえて実際にBASHスクリプトを作成してみる.バックアップをCDRに焼く2003-07-20T15:13+09:00 matsuここまでの記述をもとに,バックアップをCDRに焼くBASHスクリプトを作成してみる.TV番組欄チェックスクリプト2003-08-25T20:45+09:00 matsu私はとあるキーワードがTV番組欄にないか,しょっちゅうチェックしている.この単調なルーチンワークを自動化すべく,スクリプトを作成した.Context Switch for … More BASHスクリプト

条件,ステートメントブロックとif文

BASHスクリプトでの条件式とステートメントブロックについて説明し,それをもとにif文の書き方を説明する.条件ステートメントブロックtestと[ ]if文条件部の応用 条件 ステートメントブロック testと[ ] if文 if文は複雑な条件分岐を表現するのに使用する.また,条件分岐があるコードの可読性が増す(と思う).test -d hoge && echo true || echo falseはecho falseが実行される条件がtest -d hogeの結果なのか,echo trueの結果なのか不安になったりする.この例をif文を使用して書くと,以下のようになる.if … More 条件,ステートメントブロックとif文

リダイレクトとパイプ

リダイレクトとパイプによって,入力や出力の流れを制御することができる.リダイレクトとは標準ファイルディスクリプタファイルへの追加書き込みパイプ リダイレクトとは プロンプトからコマンドを実行したとき,多くの場合はディスプレイに出力される.こととき標準出力はディスプレイになっている.コマンドの実行結果を例えばhogeというファイルに出力したいときは,以下のようにする.command > hogeこれは,標準出力をファイルhogeに指定している.標準出力だけでなく,標準エラー出力や標準入力も切替えることができる.これがリダイレクトである. 標準ファイルディスクリプタ ファイルディスクリプタとは,プログラムがファイルやデバイスにアクセスする際に使用する整数である.標準ファイルディスクリプタを以下に示す.0 : 標準入力1 : 標準出力2 : 標準エラー出力先の例は以下と等価である.command 1> hoge標準エラー出力をファイルhogeにリダイレクトする場合は,以下のようにする.command 2> hoge標準出力と標準エラー出力をファイルhogeにリダイレクトする場合には,以下の二つの方法がある.command > hoge 2>&1command … More リダイレクトとパイプ