とある技術者の外部記憶媒体

知っておかなきゃいけないことが多すぎて頭の記憶領域が慢性的に不足気味。
そんな技術者の備忘録です。

カテゴリ: bash

bashの組み込みコマンドとしては以下のようなものがあります。

常に真を返すコマンド
.  '. filename'という形で使い、現在のシェルのプロセスを使って指定されたファイルを読み込み実行する。
break for,whileのループから抜け出す。ループがネスとしている場合には引き数に抜けるループの数を指定できる
cd 指定したディレクトリに移動する
continue for,whileの中で次の繰り返しに移行する
echo 引数を標準出力に表示
eval 変数の置換やコマンドの置換、ワイルドカードの置換などを一行のコマンドでまとめて展開させる
exec 新しいプロセスを作らず現行シェルのプロセスと置き換えて引数を実行させる。
exit シェルを終了する。引数に数字を指定することで変数$?に返り値を与える
export 引数に指定した変数を他のコマンドやシェルからも利用できるようになる。
pwd カレントディレクトリの完全パスを表示する
dirname 引数に指定したファイルのディレクトリを取得する。"dirname $0"のようにすれば実行中のシェルスクリプトのディレクトリを取得できる。
readonly 引数で指定した変数をリードオンリーに変える
return シェル関数から抜けるコマンド。引数に指定した番号がその関数の終了コードになる
set シェルのオプションをオンにしたりオフいしたりする。
shift 位置パラメタの位置を左にずらす。引数に数字を指定したときは、その数字の分だけ位置をずらす
test ある条件を判定し、その結果によって真(0)か偽(0以外)を返す。if,whileとともに使うことが多い。
trap 'trap action signal'の形式で、signalに指定したシグナルを受け取ったときにどういう処理をするかをactionに指定する。
type 引数に指定したコマンドが、組込みコマンドかどうか、コマンド本体の場所はどこかなどの情報を与える
umask ファイルを生成するときにどのモード(rwx)で作るかを指定する。
unset 引数で指定した変数や関数を消去する。シェルがはじめから持っている変数(PATHやHOMEなど)はunsetできない
wait 引数にプロセスIDを指定し、そのコマンドが終了するまで待つ。
let 引数を算術式として評価する
read 標準入力から1行読み込み、変数IFSの中にある文字(デフォは空白、タブ、改行)で区切って引数に指定した変数に代入する。次のようなオプションが使える。

・-t {time}:入力の確定をtime秒だけ待つ

・-p {prompt}:入力を促すプロンプト文字列promptを表示してから入力を受ける

・-n {nchars}:入力がncharsに達した時点で行末まで読み込まずに処理を終了する

・-r:入力にあるバックスラッシュを特別な文字列とみなさない。

readの使用例

 例:画面からYes/Noを入力し、結果を表示する
 #!/bin/bash
 prompt="Please input Yes/No>"
 ans=""
 
 while : ; do
   line=""
   read -t 10 -n 3 -p ""${prompt}"" line
   case "$line" in
     "")
       ans=yes
       break
       ;;
     Y|y|[Yy]es|YES)
       ans=yes
       break
       ;;
     N|n|[Nn]o|NO)
       ans=no
       break
       ;;
   esac
   
   echo
   echo "Invalid input"
 done
 
 echo
 echo "The result is \"${ans}\"."

trapの使用例

 例1:処理が中断されたときに/tmp以下に作成させたプロセスIDのついた一時ファイルを消してから終了
   trap 'rm -f /tmp/*.$$; exit1' 1 2 3 15
 例2:シグナルを受け取っても無視する
   trap '' 1 2 3 15
 例3:シグナルを受け取ったときに、そのシグナル本来の意味のままに動作する
   trap 1 2 3 15

letの使用例

 例:letを使ったwhileループ(0~4のループ)
 i=-1
 while let "++i < 5";do
   echo $i
 done

 関数名()
 {
    コマンド
 }

使用例

 get_random() {                        <= get_raodomという関数を定義
   number=$(((RANDOM%100) + 1))        <= 1-100のランダムな数字を変数numberに設定
   echo $*" "$(printf %03d ${number})  <= 引数と、3桁表示した変数numberを、空白で連結し表示
 }
 定義した関数をシェルスクリプト内での使用する場合
 echo $(get_random random is)   <= 文字列"random number is"を引数に関数を実行した結果を表示
  • シェルスクリプトはスクリプトの先頭から読み込まれます。そのため、シェル関数は、それを呼び出す箇所よりも前に記述します。
  • 定義した関数を実行するときにリダイレクト等を使うとサブシェルで実行されます。
  • $*,$1などのシェル変数を利用することで、引数を利用することも可能もできます~

if文

 if 条件1 ; then
 	コマンド
 elif 条件2 ; then
 	コマンド
 else
 	コマンド
 fi

シェルスクリプトの制御構文では、testコマンドの引数か[]の中に条件を指定します。

使用例

 if test $1 -eq $2 ; then  <= $1と$2が等しいとき真
 if [ $1 -eq $2 ] ; then  <= $1と$2が等しいとき真

条件指定などで使用できる比較演算子には次のようなものがあります。

演算子 意味
$1 -eq $2 変数$1と$t2が等しいとき真
$1 -ne $2 変数$1と$2が等しくないとき真
$1 -lt $2 変数$1が$t2より小さいとき真
$1 -le $2 変数$1が$2より小さいか等しいとき真
$1 -gt $2 変数$1が$t2より大きいとき真
$1 -ge $2 変数$1が$2より大きいか等しいとき真

条件指定で使用できる条件としては以下のようなものも使えます。

演算子 意味
-b ブロックデバイスファイルであれば真
-c キャラクタデバイスファイル(rawデバイスファイル)であれば真
-d ディレクトリであれば真
-e ファイル存在すれば真
-f ファイルが普通のファイルなら真
-L シンボリックリンクファイルなら真
-r 読み取り可能ファイルであれば真
-s ファイルサイズが0でなければ真
-w 書き込み可能ファイルであれば真
-x ファイルが実行可能であれば真
-a AND。「前後の判定がどちらも真」なら真
-0 OR。「前後の判定がどちらかが真」なら真
! 条件を否定する際につける
( ) 条件のグルーピング。判定の優先順位を高める

使用例

 例1:ファイルが存在しない場合に真
 [ ! -f $file ]
 例2:ファイルが読み書き可能で実行不可の場合に真
 [ -r $file -a -w $file -a ! -x $file ]

for文

 for 変数 in リスト ; do  <= リストの中身を変数に代入しながらループ
 	コマンド
 done

使用例

 例1:カレントディレクトリのIMG*.JPGの拡張子をjpegに変更
 for f in IMG*.JPG;  do
 	mv $f ${f%.JPG}.jpeg
 done
 例2:例1をコマンドラインで1行で記述する場合
 for f in DSC*.JPG; do mv $f ${f%.JPG}.jpeg; done 

while文

 while コマンド ; do <= コマンドの実行結果が0(真)ならループ
 	コマンド
 done

case文

 case string in    <= stringが一致するpatternのコマンドを実行
 	pattern1)  コマンド ;;
 	pattern2)  コマンド ;;
 	pattern3)  コマンド ;;
 esac

このページのトップヘ