IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第34回 bashの組み込みコマンドついて知ろう(2) (宮崎悟) 2021年9月

前回は、bashの組み込みコマンドについて説明しました。今回も、bashの組み込みコマンドについて説明します。

今回、シェルスクリプトの例がいくつか出てきますが、シェルスクリプトについては組み込みコマンドのあとに説明します。

break [n]

breakは、シェルスクリプトでよく使用するコマンドです。breakは、for/whileなどのループ構文から抜け出します。breakは引数に1以上の数字nを指定することが出来ます。ループ構文は複数重ねることが出来ますが、nが指定されない場合は、現在のループから抜け出します。nを指定した場合は、指定したn分のループを抜け出します。nがすべてのループの深さより大きい場合は、すべてのループから抜け出します。nに1以下の数値を指定した場合、breakは1を返しますが、それ以外の場合は0を返します。

# i, j, k に 1~5 を入れる3重ループを作成する
# i, j, k の合計が6以上のときにbreakし、2番目のループに戻り続行する
$ cat break.sh
#!/bin/bash
for i in $(seq 5); do
    for j in $(seq 5); do
        for k in $(seq 5); do
            if [ $(($i + $j + $k)) -gt 6 ] ; then
                break
            fi
            echo $i $j $k
        done
    done
done
# 実行結果、各数値の和が6以下になっているすべての組み合わせが表示されている
$ bash break.sh
1 1 1
1 1 2
1 1 3
1 1 4
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 4 1
2 1 1
(中略)
3 1 2
3 2 1
4 1 1
# brakeの代わりに break 2を使用し、6より大きくなったら、1桁目のループに戻り続行する
# "1 1 4 "のあとの"1 2 1"がスキップされ、"2 1 1"が表示される
$ bash break.sh
1 1 1
1 1 2
1 1 3
1 1 4
2 1 1
2 1 2
2 1 3
3 1 1
3 1 2
4 1 1
builtin shell-builtin [argument]

指定したシェル組み込みコマンドshell-builtiinを、指定した引数argumentをつけて実行します。この組み込みコマンドは、シェルスクリプト内でシェル組み込みコマンドと同じ関数を定義した場合に、明示的にシェル組み込みコマンドを使用する場合に使用します。

# echo という関数を作成した例
$ cat builtin.sh
#!/bin/bash
# 引数1のみを出力する関数 echo を定義
function echo {
        printf "%s\n" $1
}
# 関数 echo を実行
echo aaa bbb ccc
# 組み込みコマンドのecho を実行
builtin echo aaa bbb ccc
# 実行結果、関数のechoは最初の引数のみ表示し、組み込みコマンドのechoはすべての引数を表示する
$ bash builtin.sh
aaa
aaa bbb ccc
caller [expr]

caller は、シェルスクリプトのデバッグに有用な関数です。caller は、実行中のサブルーチン(シェル関数、組み込みコマンド、sourceで呼び出されたスクリプト)の呼び出し位置情報を返します。exprが指定されていない場合は、現在のサブルーチン呼び出しの行数をソースファイル名とともに表示します。exprに0以上の整数が与えられた場合、呼び出しスタック中で指定した位置の行番号、サブルーチン、ソースファイルを表示します。

以下は、過去bash-hackers.org に記載されたサンプルを元にしたシェルスクリプトです。

# 簡単なコールスタック取得例
$ cat -n caller.sh
     1  #!/bin/bash
     2
     3  die() {
     4      local frame=0
     5      while caller $frame; do
     6          ((frame++));
     7      done
     8  }
     9
    10  f1() { die; }
    11  f2() { f1; }
    12  f3() { f2; }
    13
    14  f3
    15
# 実行結果
# 関数が定義された行数、関数名、ファイル名が表示される。
$ bash caller.sh
10 f1 caller.sh
11 f2 caller.sh
12 f3 caller.sh
14 main caller.sh
cd [-L|[-P [-e]]] [dir]

カレントディレクトリをdirに移動します。dirのデフォルト値は変数HOMEです。変数CDPATHは、dirを含むディレクトリの検索PATHを定義します。変数CDPATHは、候補ディレクトリ間を「:」で区切って定義します。変数CDPATHの中に空白がある場合は、カレントディレクトリとして扱われます。dirが「/」で始まる場合は、変数CDPATHは使用されません。dirとして「-」を指定すると、変数OLDPWDの値(直前のカレントディレクトリ)も移動します。 変数CDPATH 内の空以外のディレクトリ名が使われたときや、「-」が引数のとき、ディレクトリの変更が成功すると新しいディレクトリの絶対パス名が標準出力に書かれます。

  • オプション -P を指定すると、シンボリックリンクを辿らない物理ディレクトリ構造を使います。

  • オプション -e は*-P*とともに使用され、ディレクトリ移動に成功してもカレントディレクトリが判定できない場合に、わざと失敗します。

  • オプション -L を指定すると、オプション -P とは逆に、シンボリックを辿ったパスを使います。

ディレクトリの移動に成功したとき終了コードが真になり、失敗した場合は偽になります。

終わりに

今回は、bashの組み込みコマンドについて説明しました。次回も、bashの組み込みコマンドについて説明を続けます。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes