naobe @ ウィキ

bash

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
Unix/Linuxに戻る
kshの機能をほぼ包含しているなあ

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
 PATTERN=$1
 FILE=$2
 
 RESULT=`egrep $PATTERN $FILE`
 if [ $? = 0 ]; then
     echo $FILE
     echo "$RESULT"
 fi
【使用例】
 find.sh \*.c ap_prelinked_modules
人気記事ランキング
ウィキ募集バナー