LoginSignup
0
0

シェルプログラミング入門 3

Last updated at Posted at 2020-05-05

はじめに

この記事は
シェルプログラミング入門 1
シェルプログラミング入門 2
の続編である。

シェル関数

シェル関数は下のような形式である。

name()
{
    command
     ・・・・・
}

ls -lと同じ動作をするlslという関数を作ってみる。

% lsl() {
> ls -l
> }
% lsl
total 48
-rw-r--r--  1 Tomoki  staff    7  4 16 09:23 abc
-rwxr-xr-x  1 Tomoki  staff  127  4 16 09:17 append*
-rwxr-xr-x  1 Tomoki  staff   25  5  2 12:14 kkk*
-rwxr-xr-x  1 Tomoki  staff   18  5  2 12:07 mmm*
-rwxr-xr-x  1 Tomoki  staff   45  5  2 11:51 nnn*
-rw-r--r--  1 Tomoki  staff   13  4 16 09:30 xyz

$*で引数をとれるようにしてみる。

% lsl() {
function> ls -l $*
function> }
% lsl *c
-rw-r--r--  1 Tomoki  staff  7  4 16 09:23 abc

これから基本的に関数内の変数には_で始めるようにする。

ちなみに以下のようなシェルスクリプトを作ったとき、そのまま実行してもシェルスクリプト内で定義されたコマンド(以下の場合 pse)を使うことができない。
そういうときには.コマンドを使って、. script_fileのようにする。

aaa
% chmod +x aaa
% ./aaa
% pse
zsh: command not found: pse
% . ./aaa
% pse
  PID TTY           TIME CMD
    1 ??        12:58.82 /sbin/launchd
  136 ??         1:14.00 /usr/sbin/syslogd
      ・・・・・・・・

.コマンドを使って実行するシェルスクリプトには拡張子.shをつけることが多い。また、直接実行しないように、モードは読み書きだけを許可し、ディレクトリも普通のコマンドとは分けられる。

組み込みコマンド

null コマンド:

何もしないがいつも 0(true)を返すコマンド。

また、null ファイルを作ったり、ファイルの中身を消去したりすることができる。%: > filecp /dev/null filecat /dev/null > fileと同じである。

ドットコマンド.

先ほどシェル関数のところで出てきた. fileという形で使うもの。
普通のコマンドと違い、新しくプロセスを作らず現行のシェルのプロセスを使って指定されたファイルを読み込み実行するもの。

break コマンド

for や while のループから抜け出すときに使用するコマンド。
デフォルトでは 1 つのループを抜ける。
break numberのように何個のループを抜けるか引数として指定できる。

continue コマンド

for や while のループで,処理を中断し、次の繰り返しに移行させるコマンド
デフォルトでは次の繰り返しのステップに移行する。
break numberのように何番目の繰り返しのステップに移行するか引数として指定できる。

echo コマンド

引数の部分を標準出力に出力する。
echo parameterのようにして使う。

使っている UNIX(system V 系列か BSD 系列)によって出力方法が異なる。

eval コマンド

eval コマンドは複数の置換などを 1 行のコマンドで全部展開する。

% VAR1=value
% VAR2=VAR1
% echo $"$VAR2"
$VAR1            #代入されない
% echo $$VAR2
22202VAR2
% echo $'$VAR2'
$VAR2
% echo \$$VAR2
$VAR1

#evalを使えばVAR1にも代入される
% eval echo \$$VAR2
value
% eval echo $"$VAR2"
value

また eval コマンドにはコマンドの結果が「何かを実行させるコマンドの形式をとって」返されたとき、それをそのまま実行させるというような場合にも利用される。

exec コマンド

exec commandのような形で使う。
新しくプロセスを作らず現行のカレントシェルのプロセスと置き換えて、引数のコマンドを実行させる。

exit コマンド

シェルを終了するときに使う。
exit numberのように番号を引数にすることでシェルスクリプトの終了コードを指定できる。
また、終了コードは$?変数に渡される。

export コマンド

export nameというふうに name で指定した変数を他のコマンドやシェルからも利用できるようにする。

pwd コマンド

カレントディレクトリの完全パスを表示する。

read コマンド

標準入力を読み取り、変数に代入する。

aa
#!/bin/sh
echo -n "enter yes or no --> "
read ANSWER
echo $ANSWER
% ./aa
-n enter yes or no -->
yes #yesと入力する
yes

readonly コマンド

指定された変数を書き換え不可にする。変数に代入したり、unset したりできなくなる。
readonly name...のように使う。

return コマンド

シェルの関数から抜けるコマンド。
引数が関数の返り値になる。

set コマンド

シェルのオプションを ON にしたり OFF にしたりする。

% sh       #シェルの起動
$ echo abc
abc        #普通は結果のみ
$ set -v   #-vオプション(冗長モード)をつける
$ echo abc
echo abc   #結果の前に入力コマンドが表示される
abc
$ set +v   #-vオプションを元に戻す
set +v
$ echo abc
abc        #結果のみ

そのほかにもいろいろなオプションがある。 -をつけるとオプションが ON になり、+をつけると OFF になる。

set parameterのようにすると、位置パラメタに値をセットすることができる。

vvv
#!/bin/sh
echo $0 $1 $2 $3 $4
set aa bb cc
echo $0 $1 $2 $3 $4

これを実行すると

 % chmod +x vvv
% ./vvv 1 2 3 4 5
./vvv 1 2 3 4
./vvv aa bb cc

set コマンドによってそれまでの位置パラメタの値が全部クリアされる。

引数なしにsetとすると、現在セットされている変数の一覧とその値が表示される。

shift コマンド

位置パラメタの値を左にずらす

ooo
#!/bin/sh
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift 3
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift $#       #位置パラメタをクリアする
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9

位置パラメタを全部クリアするにはshift $#とする。

これに引数を与えて実行すると

% chmod +x ooo
% % ./ooo aa bb cc dd ee ff gg hh ii
./ooo aa bb cc dd ee ff gg hh ii
./ooo bb cc dd ee ff gg hh ii
./ooo ee ff gg hh ii
./ooo

test コマンド

条件を判定し、正しいとき0(true)を返す。

test expressionもしくは[ expression]のように書く。

trap コマンド

trap action signal...

signal に指定したシグナルを受け取ったときにどういう処理をするかを action のところに指定する。action はコマンドを並べたもの。

type コマンド

コマンドが組み込みコマンドかどうかやコマンド本体のある場所を調べる。

% type echo date
echo is a shell builtin
date is /bin/date

umask コマンド

ファイルを生成するときにモードを決定する。
-rwxr-xr-x-rw-r--r--などがモードである。モードは 8 進数で表現され、r が 4, w が 2, x が 1 と考える。
例えば、-rw-r--r--は 644 となる。

umask mask

としてからファイルを作る(touch コマンドなどで)と、作成したファイルのモードは666(対象がディレクトリなら777) - maskとなる。

何もせずにファイルを作ると umask の値は 022,つまり 644(読み書き移動可)となる。

unset コマンド

指定した変数や関数を消去する。

unset name

wait コマンド

引数に動作しているプロセス ID を指定し、
そのプログラムが終了するまで待つ。

command &
 ・・・・
wit $1

引数を指定しないとき、そのシェルから派生しているプロセスが全て終了するまで待ち状態となる。返り値は 0 となる。

参考

シェルプログラミング入門 1
シェルプログラミング入門 2

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0