bash構文メモ

トップ > チップス > bash構文メモ
2012-02-13, syntax

/tips/bash/syntax **制御構文 ***if/else 条件による分岐を行います。 :if condition :then : statements :[elif condition : then statements ...] :[else : statements] :fi

例: :# $\{1\}変数に値が入っていれば「ok」と表示する :if [ -z $\{1\} ]; then : echo "ng" :else : echo "ok" :fi

:# storage/logフォルダが存在しなければ、mkdirする :if ! [ -d storage/log ]; then : mkdir -p storage/log :fi

***for 配列の要素を一つづつ取り出して処理を行います。 :for name [in list] :do : statements that can use $name ... :done

例: :#ディレクトリ内のファイルを表示する。lsとほとんど同じです。 :FILES=$(ls) : :for FILE in $\{FILES\} :do : echo $\{FILE} :done

:#回数を指定して繰り返す。 :for A in $(seq 1 5) :do : echo $\{A\} :done seqコマンドに「-w」オプションを付けると、連番の文字数が等しくなるように0パディングを行ってくれます。また、「-f%02g」といったprintfの書式風のフォーマット指定も可能です。

ループを途中で抜け出す場合「break」を使用します(whileも同様です)。

***case 変数の値によって処理を分岐します。 :case expression in : pattern1 ) : statements ;; : pattern2 ) : statements ;; : ... :esac

***select リストからの選択が可能なプロンプトを表示します。 :select name [in list] :(PS3='prompt ') :do : statements that can use $name ... :done

***while 条件判定による繰り返しを行います。 :while condition :do : statements ... :done

無限ループを記述したい場合は、「:(ヌルコマンド)」のように常に真(=0)を返す式を利用します。 :while :; do : statements ... :done

**条件の評価 ※詳細は「man test」で確認可能。 ***文字列比較 ,str1 = str2,一致 ,str1 != str2,不一致 ,-n str1,長さが0より大きい ,-z str1,長さが0 ***ファイル属性確認 ,-d file,fileが存在し、かつディレクトリ ,-e file,fileが存在する ,-f file,fileが存在し、かつ通常ファイル ,file1 -nt file2,file1がfile2よりも新しい ,file1 -ot file2,file1がfile2よりも古い ***整数比較 ,-lt,より小さい ,-le,以下 ,-eq,等しい ,-ge,以上 ,-gt,より大きい ,-ne,等しくない **パターン照合 {strong:例:} pathに/home/cam/book/long.file.nameという値が設定されている場合。 ,説明,式,結果 ,先頭最長一致削除,$\\{path##/*/\\},long.file.name ,先頭最短一致削除,$\\{path#/*/\\},cam/book/long.file.name ,終端最短一致削除,$\\{path%/*/\\},/home/cam/book/long.file ,終端最長一致削除,$\\{path%%/*/\\},/home/cam/book/long ,置換(先頭),$\\{path/book/magazine\\},/home/cam/magazine/long.file.name ,置換(全て),$\\{path//book/magazine\\},/home/cam/magazine/long.file.name **組込コマンド ***echo 表示 文字列を表示する基本的なコマンドです。最後に改行したくない場合は、「-n」オプションを付けます。 :$ echo "Hello, bash." :Hello, bash.

***shift 引数のシフト :#!/bin/bash : :while [ "$1" != "" ] :do : echo $1 : shift :done

:$ ./shiftTest.sh a b c :a :b :c ***expr 算術演算 算術演算を行う構文はないので、exprコマンドを利用して計算を行います。 :$ echo $(expr 10 + 20) :30

**配列 変数名の後ろに添え字を付ける事で、配列として宣言することができます。 :ARRAY[0]=a

または、以下のようにまとめて宣言することも可能です。 :ARRAY=(a b c)

配列として参照する場合、以下のように添え字に「@」を指定します。 :#!/bin/bash : :ARRAY[0]=a :ARRAY[1]=b : :for VAR in $\{ARRAY[@]\}; do : echo $VAR :done

:$ ./arrayTest.sh :a :b

**リダイレクション ,*構文,*説明 ,command1 | command2,command1の結果をcommand2に渡します。 ,command >> file,fileへ標準出力を切り替えます。{br}fileが存在する場合、追加されます。 ,command << label,ヒアドキュメント。 ,command &> file,標準出力及び標準エラー出力をfileに切り替えます。 ,command 1> file,標準出力をfileに切り替えます。 ,command 2> file,標準エラー出力をfileに切り替えます。 ,command >file 2>&1,「&>」と同様です。 ,command 2>&1 | tee file,標準出力及び標準エラー出力をteeコマンドに渡します。{br}teeは入力をファイルと標準出力の双方に出力するコマンドです。

ディスクリプタの番号は以下の通りです。 ,*標準出力,1 ,*標準エラー出力,2

**環境変数 ,*変数,*説明 , \*,スクリプト(或いは関数)に与えられた位置パラメタ ,@,同上 ,#,スクリプト(或いは関数)に与えられた引数の数 ,?,直前のコマンドの終了ステータス ,$,シェルプロセスのプロセスID ,0,シェルスクリプト名

この記事は役に立ちましたか?