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。




ちからつきた。またあした。