naobe @ ウィキ
bash
最終更新:
Bot(ページ名リンク)
-
view
testでの条件判定
| 条件 | 意 味 |
|---|---|
| -z string | 文字列の長さが0で真。 |
| -n string | string の長さが0より大きければ真。 |
| -e file | ファイルが存在すれば真。 |
| -f file | 通常のファイルで真。 |
| -c file | file が存在し、キャラクタスペシャルファイルであれば真。 |
| -s file | fileが存在し、サイズが0より大きければ真 |
| -d file | file が存在し、ディレクトリであれば真。 |
| -h file or -L file | file が存在し、シンボリックリンクであれば真。 |
| string1 = string2 | 文字列string1が文字列string2と等しければ真。 |
| string1 != string2 | 文字列string1が文字列string2と等しくなければ真。 |
| arg1 op arg2 | 引数を数値とみなして大小を比較する。 |
オペレーション
| 項目 | 説明 |
| -eq | 等しい |
| -ne | 等しくない |
| -lt | 小さい |
| -le | 以下 |
| -gt | 大きい |
| -ge | 以上 |
算術式
パラメーターを正しく指定してください。の中で使われる。 算術式では、シェル変数を使うときに$は不要。
演算子
c言語と同じ。優先順は上から下。同じ行内では、左から右。
| 項目 | 説明 |
|---|---|
| id++ id-- | 変数を評価後、increment/decementする |
| ++id --id | |
| - + | |
| ! ~ | |
| ** | |
| * / % | |
| + - | |
| << >> | |
| <= >= < > | 比較 |
| == != | |
| & | ビット単位の AND |
| ^ | ビット単位の 排他的OR |
| | | ビット単位の OR |
| && | |
| || | |
| expr?expr:expr | |
| = *= /= %= += -= <<= >>= &= ^= |= | |
| expr1 , expr2 |
()を使うと、優先順位が変わる。()が最優先。
条件式
[[]]の中で使われる。単語分割とパス名展開は [[ と ]] の間の単語に対しては行われません。チルダ展開、パラメータと変数の展開、算術式展開、コマンド置換、プロセス置換、クォート除去は実行されます。
下記の組み合わせを使える。優先順は上から下。
下記の組み合わせを使える。優先順は上から下。
| 項目 | 説明 |
|---|---|
| (expression) | |
| ! expression | 否定 |
| expression1 && expression2 | |
| expression1 || expression2 |
expressionは、testコマンドの条件式を使える。testコマンドの条件式に加えて、< > == などが使える。
【例】
【例】
if [[ ! $a == aaa || $b != bbb && $c == ccc ]]
単語分割
IFSで区切って単語に分割する。空の引数("", '')は削除されずに残る。
引数をワイルドカード展開しない
変数をダブルクォートで囲む
【例】
【例】
#!/bin/ksh FILEPATTERN=$1 find . -name "$FILEPATTERN"
ジョブ制御
viを実行中に作業を中断し、シェルで作業をし、またviを再開するときに便利。
| 項目 | 説明 |
|---|---|
| CTRL+Z | フォアグラウンドジョブを一時停止する |
| jobs -l | jobの一覧を表示する |
| fg [jobspec] | jobspecで指定したジョブをフォアグラウンドで実行する。jobspecを省略した場合は最近実行したバックグラウンドジョブ/一時停止ジョブをフォアグラウンドで実行する。 |
| jobspec | 説明 |
|---|---|
| %N | ジョブ番号がNのジョブ |
| %string | stringで始まるジョブ |
| %?string | stringを含むコマンドのジョブ |
| %+ または %% | 最後に実行されたバックグラウンドジョブ |
| %- | 最後の1つ前に実行されたバックグラウンドジョブ |
local 変数1[=値1] [変数2[=値2] ...]
bash拡張機能。関数の中で有効。スコープを関数と子供の関数に制限する。
【コードサンプル】
【コードサンプル】
aaa() {
local i j
i=1
echo "before i=$i"
bbb
echo "after i=$i"
}
bbb() {
i=2
}
aaa
echo "関数外 i=$i"
【実行結果】
before i=1 after i=2 関数外 i=
$(コマンド)
bash拡張機能。コマンド置換。`コマンド`と同じ。kshと同じ。
フローコントロール
if コマンド; then
elif コマンド; then
else
fi
for 変数 in リスト
do
done
for 変数 : コマンド引数を順々に処理する。
for 変数 in * : ファイルを順々に処理する。
for 変数 in $* : コマンド行引数を順々に処理する。
※リストは複数の文字列をIFS(Internal Field Separator)環境変数の最初の文字で区切ったもの。IFSはデフォルトでは、スペース、タブ、改行。
for (( expr1; expr2; expr3 ))
do
...
done
【例】
for (( i = 0; i < 10; i++ ))
do
echo $i
done
while コマンド
do
...
done
until コマンド
do
...
done
コマンド実行後の終了ステータスが0なら真。
【使用例】
#!/bin/sh
i=0
while [ $i -ne 10 ]
do
echo $i
i=`expr $i + 1`
done
関数
使う前に定義する。
引数は、コマンドの引数と同様の方式で与える。
引数は、コマンドの引数と同様の方式で与える。
【使用例】
func() {
echo $1
echo $2
echo $3
}
func 1 2 3
return Nで、終了ステータス Nを返す。
expr
シェルの中で算術演算を行う。
num=`expr $a + $b`
演算子: + - * / %
特別なシェル変数
| 項目 | 説明 |
| $# | 位置パラメータの数 |
| $- | シェルのオプション |
| $? | 最近実行したシェルの終了状態 |
| $$ | 現在のシェルのプロセス番号 |
| $* | シェルの引数のリスト。展開する時に"$1 $2 ..."と展開する。 |
| $@ | シェルの引数のリスト。展開する時に"$1" "$2" ...と展開する。 |
パラメータの展開
':'はない場合は、変数が未使用の場合に適用される。':'がある場合は、null(VAR="" or VAR=)の場合と未使用の場合に適用される。
| 項 目 | 説 明 |
| ${parameter:-word} | $parameterが未設定のときに一時的にparameter=wordとする。次のステップでは、$parameterは未設定のままとなる。 |
| ${parameter:=word} | $parameterが未設定のときにparameter=wordとなる。以後、$parameterは、wordの値を保存する。 |
| ${parameter:+word} | $parameterが設定されているときにparameter=wordとなる。設定されていないときは未設定のまま。 |
| ${parameter#word} | $parameterとwordを先頭からパターンマッチング(最短一致パターン)する。マッチしたら、$parameterからwordを除いたものに置換する。 |
| ${parameter##word} | $parameterとwordを先頭からパターンマッチング(最長一致パターン)する。マッチしたら、$parameterからwordを除いたものに置換する。【例】base=${1##*/} 引数1からディレクトリを除いたものを返す |
| ${parameter%word} | $parameterとwordを末尾からパターンマッチング(最短一致パターン)する。マッチしたら、$parameterからwordを除いたものに置換する。 |
| ${parameter%%word} | $parameterとwordを末尾からパターンマッチング(最長一致パターン)する。マッチしたら、$parameterからwordを除いたものに置換する。 |
| ${parameter/patern/string} | $parameterとpaternをパターンマッチング(最長一致パターン)する。マッチしたら、$parameterのpaternをstringに置き換えて置換する。置き換えるのは最初にマッチした部分のみ。 |
| ${parameter//patern/string} | $parameterとpaternをパターンマッチング(最長一致パターン)する。マッチしたら、$parameterのpaternをstringに置き換えて置換する。置き換えるのはマッチした全ての部分。【例】${p//[0-9]/} 変数pの数字をすべて削除する。 |
| ${paraneter:offset:length} | $parameterのoffset位置(0から始まる)からlength長を返す |
${parameter:=$word}の例
foo=456
word=foo
parameter=
echo "parameter1 : ${parameter:=$word} "
echo "parameter2 : $parameter"
|
V
parameter1 : foo
parameter2 : foo
${parameter:-$word}の例
foo=456
word=foo
parameter=
echo "parameter1 : ${parameter:-$word} "
echo "parameter2 : $parameter"
|
V
parameter1 : foo
parameter2 :
パターンマッチ置換の例
parameter=fooabbab
echo "parameter1 : ${parameter##fo*a} "
echo "parameter2 : $parameter"
|
V
parameter1 : b
parameter2 :
local name1=value1 name2=value2 ...
関数の中で使われると、関数の中でだけ有効な変数nameを作成し、valueで示される値を変数に代入する。
タブをスペース/スペースをタブに変換する
あるディレクトリ以下の対象ファイルのタブをスペースに変換する
$ find . -name \*.java -exec expand.sh {} \;
【expand.sh】
FILE=$1
TAB_NUM=$2
if [ x$TAB_NUM = x ]; then
TAB_NUM=8
fi
expand -t $TAB_NUM $FILE > ${FILE}_tab
mv ${FILE}_tab $FILE
スペースをタブに変換する場合は、unexpandコマンドを使う
カレントディレクトリ下のファイルから文字列を検索する
find.sh
#!/bin/ksh
FILEPATTERN=$1
PATTERN=$2
find . -name "$FILEPATTERN" -type f -exec grep.sh "$PATTERN" {} \;
grep.sh
#!/bin/ksh
#!/bin/ksh
PATTERN=$1
FILE=$2
RESULT=`egrep $PATTERN $FILE`
if [ $? = 0 ]; then
echo $FILE
echo "$RESULT"
fi
【使用例】
find.sh \*.c ap_prelinked_modules
