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