[ ホーム | お知らせ | ソフトウェア | 覚え書き | メール | ->英語 ]

Bシェルの覚え書き

1.シェル変数
2.内部変数
3.testコマンド
4.制御文 for
5.コマンドの区切り
6.制御文 case
7.制御文 while
8.shiftコマンド
9.制御文 until
10.制御文 if
11.特殊記号
12.特殊記号の打消し(クォーティング)
13.リダイレクションとパイプ
14.組み込みデータ
15.コントロールキー
16.コマンドライン編集
17.環境設定ファイル
18.ジョブコントロール
19.Cシェルと比較
20.Bシェルのエイリアスで引数を使う
Bourneシェルでのスクリプトの文法や使い方を忘れないために
[ TOP ]

シェル変数

% name=hoge ← シェル変数nameに値hogeを代入 % echo $name ← シェル変数nameの値を参照、値hogeを表示 % echo ${name}abc ← 変数名に続き英数字を記述する場合は変数名を中括弧で囲む
[ TOP ]

内部変数

変数名意味
$#引数の数(10進数)
$@すべての引数
$0コマンド名
$11番目の引数
$?直前に実行したコマンドのリターンコード(10進数)、正常に終了したなら0
$$シェルのプロセス番号(10進数)
$!最後にバックグランドで実行したのプロセスのプロセス番号(10進数)
$-シェルに設定されているフラグ
[ TOP ]

testコマンド

オプション意味
-b pathpathが存在、かつブロック型スペシャルファイルなら真
-c pathpathが存在、かつ文字型スペシャルファイルなら真
-d pathpathが存在、かつディレクトリなら真
-f pathpathが存在、かつディレクトリ以外なら真
-g pathpathが存在、かつsetgidなら真
-h pathpathが存在、かつシンボリックリンクされているなら真
-k pathpathが存在、かつスティッキービットが設定されていれば真
-r pathpathが存在、かつ読み取り可能なら真
-w pathpathが存在、かつ書き込み可能なら真
-x pathpathが存在、かつ実行可能なら真
-s pathpathが存在、かつサイズが0より大きければ真
string文字列stringがヌル文字列でなければ真
-l string文字列stringの長さ
-n string文字列stringの長さがゼロでなければ真
-z string文字列stringの長さがゼロなら真
str1 = str2文字列str1とstr2が等しければ真
str1 != str2文字列str1とstr2が等しくなければ真
n1 -eq n2整数n1とn2が等しければ真
n1 -ne n2整数n1とn2が等しくなければ真
n1 -gt n2整数n1がn2より大きければ真
n1 -ge n2整数n1がn2以上なら真
n1 -lt n2整数n1がn2より小さければ真
n1 -le n2整数n1がn2以下なら真
testコマンドは大括弧[]で置き換えることもできます。 例えば、"test $# -eq 0"は"[ $# -eq 0 ]"とおなじです。 このとき、"["の次と"]" の前には必ず空白を置きます。
[ TOP ]

制御文 for

書式は次のとおりです。 for シェル変数 in 値1 値2 値3 … do コマンド コマンド done つぎの例ではTokyo、Nagoya、Osakaが表示されます。 for a in Tokyo Nagoya Osaka do echo $a done また、inを省略すると"in $*"を指定したのとおなじになります。 つまり、コマンドライン引数をひとつずつ取り出すことができます。 for i do echo arg: $i done これはつぎのスクリプトとおなじ意味になります。 for i in $* do echo arg: $i done
[ TOP ]

コマンドの区切り

コマンドは改行か";"で区切ります。 例1) for a in Tokyo Nagoya Osaka do b=$b$a echo $a done 例2) for a in Tokyo Nagoya Osaka ; do b=$b$a echo $a done 例3) for a in Tokyo Nagoya Osaka ; do b=$b$a ; echo $a ; done 例1、例2、例3はすべておなじ意味になります。
[ TOP ]

制御文 case

つぎのスクリプトは引数の数に応じて実行するコマンドの内容を変える例です。 case $# in 1) cat >>$1 ;; 2) cat >>$2 <$1 ;; *) echo 'usage: append [from] to' ;; esac ";;"はcaseの区切り記号です。 つぎのスクリプトはオプションなどを処理する例です。 for i ; do case $i in -[ocs]) -oか-cか-sのコマンド ;; -*) その他のオプション ;; *.c) Cのソースファイル ;; *) その他 ;; esac done パターンにて、 "-x|-y) ..." と "-[xy] ..." はおなじです。
[ TOP ]

制御文 while

書式は次のとおりです。 while コマンド1 do コマンド2 done コマンド1の終了ステータスが偽になるまでコマンド2を繰り返します。
[ TOP ]

shiftコマンド

引数の値を$1、$2、$3...から$2、$3、$4...に繰り上げるコマンドです。 つまり、先頭の$1を削除してひとつずつ繰り上げます。 例えば、つぎの例1と例2はおなじ意味になります。 例1) while test $1 do コマンド shift done 例2) for i do コマンド done
[ TOP ]

制御文 until

書式は次のとおりです。 until コマンド1 do コマンド2 done コマンド1の終了ステータスが真になるまでコマンド2を繰り返します。
[ TOP ]

制御文 if

書式は次のとおりです。 if 条件1 then コマンド1 # 条件1が真ならコマンド1を実行 elif 条件2 # 条件1が偽かつ... then コマンド2 # 条件2が真ならコマンド2を実行 else コマンド3 # 条件2が偽ならコマンド3を実行 fi つぎのスクリプトは引数がない時に使用法を表示する例です。 if [ $# -lt 1 ]; then echo Usage: command name ... exit 1 fi
[ TOP ]

特殊記号

記号意味
/パスの区切り
.カレントディレクトリ
..親ディレクトリ
~ホームディレクトリ
*ワイルドカード、どんな文字でもよい、何文字でもよい
?ワイルドカード、どんな文字でもよい、1文字だけ
[1aD]正規表現、1かaかDのどれか1文字
[A-Z]正規表現、AからZのどれか1文字
;コマンドの終り
&バックグラウンドで実行
コマンド1 && コマンド2コマンド1が正常終了したらコマンド2を実行
コマンド1 || コマンド2コマンド1が異常終了したらコマンド2を実行
`コマンド`コマンドの出力で置き換える
{ コマンド1; コマンド2 ... }コマンドのグループ化
( コマンド1; コマンド2 ... )コマンドのグループ化、別プロセスで実行
[ TOP ]

特殊記号の打消し(クォーティング)

記号 意味
\ つぎの1文字をクォーティング
'...' 囲まれた範囲をクォーティング
"..." 囲まれた範囲をクォーティング、ただしシェル変数は置き換える
[ TOP ]

リダイレクションとパイプ

記号意味
>標準出力を切り替える
>>標準出力に追加する
2>標準エラー出力を切り替える
<標準入力を切り替える
<<標準入力に追加する
値1<&値2値2が示す入出力を値1が示す入出力に複製する(値1を省略すると標準入力)
値1>&値2値2が示す入出力を値1が示す入出力に複製する(値1を省略すると標準出力)
コマンド1 | コマンド2パイプ、コマンド1の出力をコマンド2の入力にする
入出力を示す番号はつぎのとおりです。 標準入力は0、標準出力は1、標準エラー出力は2となります。
[ TOP ]

組み込みデータ

cat << EOM HOGEHOGE FUGAFUGA EOM この例では"<< EOM"のつぎの行から"EOM"の手前までが組み込みデータになり、 catコマンドの標準入力になります。
[ TOP ]

コントロールキー

もう1つの特殊記号としてコントロールキーがあります。 通常、CTRLを押しながら別のキーを押すと画面には何も表示されません. しかし、OSはそれらのいくつかを特殊コマンドとして解釈します。 ただし、システムによってコントロールキーの割り当てが違う場合があります。 そこで、自分で割当てを変更することもできます。 自分のシステムに割り当てられているコントロールキーを知るには、stty -aコマンドを利用します。
コントロールキー機能定義stty名
CTRL-c現在のコマンドを中止するintr
CTRL-d入力の終わりeof
CTRL-CTRL-cが機能しなかった場合に現在のコマンドを中止するquit
CTRL-s画面への出力を停止するstop
CTRL-q画面への出力を再開する
DELまたはCTRL-?最後の文字を削除するerase
CTRL-uコマンドライン全体を削除するkill
CTRL-z現在のコマンドを一時停止するsusp
[ TOP ]

コマンドライン編集

コマンド説明
CTRL-B後方に1文字移動する(削除はしない)
CTRL-F前方に1文字移動する
CTRL-D前方に1文字削除する
DEL後方に1文字削除する
ESC b後方に1ワード移動
ESC f前方に1ワード移動
ESC DEL後方に1ワード削除
ESC CTRL-H後方に1ワード削除
ESC d前方に1ワード削除
CTRL-Y最後に削除されたものを取り出す
CTRL-Aラインの先頭に移動
CTRL-Eラインの終わりに移動
CTRL-Kラインの終わりまで削除
[ TOP ]

環境設定ファイル

ファイル名実行のタイミング
.bash_profileシステムにログインするたびに実行される
.bashrcシェルを起動するたびに実行される
.bash_logoutログインシェルを終了するたびに実行される
 
[ TOP ]

ジョブコントロール

コマンドの最後に&をつけるとジョブをバックグラウンドに生成することができます。 バックグランドに起動したジョブは、完了させることも、フォアグラウンドに移すことも簡単です。 ジョブとはコンピュータの仕事の単位で一般には実行中のプログラムを指します。 通常プログラムはフォアグランドで実行されます。 同時に複数のプログラムを実行させたいときにバッググランドで実行します。
コマンド説明
fgバックグランドのジョブをフォアグランドに戻す
bgフォアグランドのジョブをバックグランドに移動する
jobsジョブ番号を表示を表示する
jobs -lジョブ番号とプロセスIDを表示する
ジョブはプロセスIDやジョブ番号、ジョブのコマンド名で指定します。 なお、ジョブ番号とコマンド名には%をつけて指定します。
プロセスIDプロセス毎に割り当てられた通し番号
ジョブ番号ジョブ毎に割り当てられた通し番号
例) fg 1742 プロセスIDで指定 fg %3 ジョブ番号で指定 fg %man コマンド名で指定 ちなみに引数なしでfgを入力すると、 バックグラウンドに最後に付け足されたジョブがフォアグラウンドになります。 また、フォアグラウンドジョブをバックグラウンドジョブに移すこともできます。
CTRL+Zジョブを一時停止
fgジョブを再開
bg停止したジョブをバックグランドに移動
[ TOP ]

Cシェルと比較

操作BシェルCシェル
変数代入foo=barset foo=bar
環境変数の設定FOO=bar;export FOOsetenv FOO bar
エイリアスの設定alias ll='ls -l'alias ll 'ls -l'
[ TOP ]

Bシェルのエイリアスで引数を使う

Bシェルのエイリアスでは引数を扱えないので代わりにシェル関数を使う。 Cシェルのエイリアスでは引数を扱える。 % alias del 'mv !* ~/.trash/' % del test.c Bシェルのエイリアスでは引数は扱えない。 %alias del='mv !* ~/.trash/' % del test.c ← エラーになる Bシェルではエイリアスは使わずにシェル変数を使う。 % unalias del % del () { mv $* ~/.trash/ } % del test.c
[ TOP ]


[ ホーム | お知らせ | ソフトウェア | 覚え書き | メール | ->英語 ]

空色そふと

eXTReMe Tracker