bashメモ
bash のマニュアル
http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html
+ α
の個人的な復習。shは眼中外。bash依存。使わない機能も眼中外。
定義
- メタ文字
- | & ; ( ) < > スペース タブ
変数(正確にはパラメタ)
変数宣言
#変数 hoge の宣言 $ declare hoge #代入しつつ宣言(値: hoge) $ declare hoge=hoge #サブシェルでも見えるようにする。 $ declare -x hoge #または export hoge #変数の削除 $ unset hoge $ echo $hoge $ #readonlyの変数 $ declare -r rhoge=hoge #または、readonly rhoge=hoge $ rhoge=fuga --> bash: rhoge: readonly variable $ unset rhoge --> bash: unset: rhoge: cannot unset: readonly variable #配列 $ declare -a ahoge=(a b c d) #単に ahoge=(a b c d) でもOK。 $ echo ${ahoge} a #要素の取得 $ echo ${ahoge[0]}:${ahoge[1]}:${ahoge[2]}:${ahoge[3]} a:b:c:d #全要素の取得(個別分割) $ echo ${ahoge[@]} a b c d #全要素の取得(ひとまとめ) $ echo "${ahoge[*]}" a b c d #配列の要素数 $ echo ${#ahoge[@]} 4
変数展開
bashはマクロ言語。bashの変数を展開して、最後はコマンドとして実行する。
展開順序: ブレース展開、チルダ展開、パラメータ・変数・算術式展開、コマンド置換 (左から右へ)、単語分割、パス名展開
#展開順序重要。たとえば、パラメタ置換後に、チルダ展開とか、パラメタ展開後のパラメタ展開はムリ。
展開が不可解なときは、set -x とやっておくと、展開過程が見られる。
ブレース展開
$ ls file{1,2,3}.txt -> ls file1.txt file2.txt file3.txt
チルダ展開
~→$HOME
パラメータ・変数・算術式展開
$ hoge=hogev $ echo ${hoge} hogev $ fuga=fugav #変数の値が空文字である場合、xxxを使う。値の置き換えは行わない。 $ echo ${hoge:-xxx} hogev $ echo ${hoge} hogev $ echo ${nullvar:-xxx} xxx $ echo ${nullvar} #:- 以降では、展開も行う(以降の変数展開でも同じく) $ echo ${nullvar:-${fuga}} fugav #変数の値が空文字である場合、xxxが変数に代入されて展開される。デフォルト値の設定に使う。 $ echo ${hoge:=xxx} hogev $ echo ${hoge} hogev $ echo ${nullvar:=xxx} xxx $ echo ${nullvar} xxx $ unset nullvar #変数の値が空文字で"ない"場合、xxxを使う。値の置き換えは行わない。 $ echo ${hoge:?xxx} hogev $ echo ${hoge} hogev #変数の値が空文字の場合、エラー。インタラクティブシェル出ない場合、スクリプトのエラー(リターン値 1)終了。 $ echo ${nullvar:?xxx} bash: nullvar: xxx #${hoge:?xxx}と逆に、空文字でない場合にxxxを使う。値の置き換えは行わない。 $ echo ${hoge:+xxx} xxx $ echo ${hoge} hogev #空文字の場合は、そのまま。 $ echo ${nullvar:+xxx} $ echo ${nullvar} $ #----- $ pref_1=1 pref_2=2 pref_3=3 $ echo $pref_{1,2,3} 1 2 3 # (通常は)空白区切りでpref_ で始まる変数名一覧に置換する。 $ unset ${!pref_*} --> unset pref_1 pref_2 pref_3 $ echo $pref_{1,2,3} $ #hogeの値、hogev の長さ $ echo ${#hoge} 5 ## まだよく理解してない ## ${parameter##word} ${parameter#word} ## ${parameter%%word} ${parameter%word} ## ${parameter//pat/str} ${parameter/pat/str} ## ${parameter/#pat/str} ${parameter/%pat/str}
リスト(list)
コマンドを ;, &, &&, || で区切って並べ、最後に ;, &,
# commandA が成功したら commandB commandA && commandB # commandA が失敗(0以外の終了ステータスのリターン)したら commandB commandA || commandB # commandA の実行結果に関わらず、commandBの実行。 commandA; commandB
複合コマンド
(list)
基本的にはlistのサブシェルでの実行。
なので、()内で設定したシェルの変数は、()から戻ってきたときには消えてる。
$ echo $hoge $ (hoge=hoge;:) $ echo $hoge
{list;}
listの現在のシェルでの実行。Cとかのブロックと同じと思ってOK。
ちからつきた。またあした。