主題1.06:シェルおよびスクリプト
1.06.1 シェル環境のカスタマイズ(重要度4)
aliasコマンド
書式
alias【エイリアス名=’実行内容’】
概要
エイリアスの定義・確認
引数
・エイリアス名:定義するエイリアスの名前を指定
・実行内容:実行する内容を指定
使用例
alias
→aliasコマンドを引数なしで実行すると、現在有効なエイリアスを確認する
alias rm=’rm -i’
→エイリアスを定義する場合、実行内容の部分をシングルクォーテーションで囲み、=の前後にスペースを入れないようにする必要がある
unaliasコマンド
書式
unalias エイリアス名
概要
エイリアスの解除
引数
・エイリアス名:解除するエイリアスの名前を指定
使用例
unalias -a
→登録されているすべてのエイリアスを削除
unalias rmi
→rmiというエイリアスを削除
コマンドの連続実行
書式
command1; command2:command1に続いてcommand2を常に実行
command1 && command2:command1が成功したらcommand2を実行
command1 || command2:command1が失敗したらcommand2を実行
使用例
cat test1.txt; echo success
→catコマンドに続いてechoコマンドも実行
cat test1.txt && echo success
→catコマンドが成功するとechoコマンドも実行
cat test1.txt || echo success
→失敗したら実行なので、echoコマンドは実行されない
bashシェルの設定ファイル
全員が参照
・ログイン時に読み込み
/etc/profile:環境変数、利用環境にかかわるもの
・bash起動時に読み込み
/etc/bashrc:RedHat系、bash起動時に実行させたい処理(エイリアスなど)
/etc/bash.bashrc:Debian系、bash起動時に実行させたい処理(エイリアスなど)
ユーザー個別で参照
・ログイン時に読み込み
~/.bash_profile:環境変数などユーザー環境にかかわるもの
~/.bash_login:~/.bash_profileがない場合の読み込み次候補(内容は~/.bash_profileと同じ)
~/.profile:~/.bash_loginがない場合の読み込み次候補(内容は~/.bash_profileと同じ)
・bash起動時に読み込み
~/.bashrc:bash起動時に実行させたい処理(エイリアスなど)
・ログアウト時に読み込み
~/.bash_logout:bashがログアウトの直前に実行するスクリプトであり、ログアウト前に行いたい処理を記述する
bashのログイン時、環境設定ファイルを読み込む順番
/etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc
bashシェルのオプション指定
書式
set +/-o オプション
概要
bashシェルのオプション指定
+:オプションを無効化
-:オプションを有効化
bashシェルのオプション
emacs/vi:シェルのキーバインドをemacs/vi風に設定(どちらかのみ有効にできる)
noclobber:既存ファイルへの上書きリダイレクトを無効にする
noglob:ワイルドカードでのファイル設定を無効にする
使用例
set -o noclobber
→noclobberオプションを有効にする
set -o | grep noclobber
→noclobberオプションが有効になっていることを確認(set -oでオプション設定の状況を確認できる)
1.06.2 シェルスクリプト(重要度6)
シェルスクリプトを実行できる構文
sourceコマンドを使用
・指定したシェルスクリプトを読み込み、現在のシェルで実行するコマンド
・シェルスクリプトに実行権がない場合でも実行できる
・シェルスクリプトに読み取り権と、シェルスクリプトが存在するディレクトリに実行権(検索権)が必要
source スクリプトファイル名
. スクリプトファイル名
sh、bashコマンドを使用
・シェルを起動してシェルスクリプトを実行するコマンド
・シェルスクリプトに実行権がない場合でも実行できる
・シェルスクリプトに読み取り権と、シェルスクリプトが存在するディレクトリに実行権(検索権)が必要
sh スクリプトファイル名
bash スクリプトファイル名
コマンドとして実行
・シェルスクリプトをサブシェル内(現在のシェルから新たに生成されたシェル)で実行
・シェルスクリプトに実行権がある場合、シェルスクリプトはコマンドのように実行できる
・パスが通っていない場合は、絶対パスまたは相対パスでシェルスクリプトを指定する必要がある
/home/test/スクリプトファイル名(絶対パスで指定)
./スクリプトファイル名(「/home/test」ディレクトリから相対パスで指定)
スクリプトファイル名(パスが通っている場合)
スクリプトファイルの1行目(シバン行)
#!インタープリタ
#!/bin/bash → スクリプトをbashシェルで実行する場合の例
bashのコマンド置換機能
・`実行コマンド`
・$(実行コマンド)
RESULT=`ls`
RESULT=$(ls)
→echo $RESULTでlsコマンドの結果が表示される
シェルの主な特殊変数
$0:スクリプトファイル名
$1, $2…:引数($1は1つめの引数、$2は2つめの引数…)
$n:シェルスクリプトに渡されたn番目の引数(10個目以降は${10}のように指定する)
$#:引数の数
$@:引数すべてをスペースで区切って出力
$*:引数すべてを$IFSで指定された値で区切って出力
$?:直前の処理の成否(成功は0、失敗は0以外)
$$:シェルのPID
主な条件式等
ファイル・ディレクトリに関する条件式
-f ファイル名:ファイルが存在
-d ディレクトリ名:ディレクトリが存在
-e ファイル/ディレクトリ名:ファイル/ディレクトリが存在
-r ファイル/ディレクトリ名:ファイル/ディレクトリが読み取り可能
-w ファイル/ディレクトリ名:ファイル/ディレクトリが書き込み可能
-x ファイル/ディレクトリ名:ファイル/ディレクトリが実行可能
数値の条件式
値1 -eq 値2:値1と値2が等しい
値1 -ne 値2:値1と値2が等しくない
値1 -lt 値2:値1が値2より小さい(値2を含まない)
値1 -le 値2:値1が値2以下(値2を含む)
値1 -gt 値2:値1が値2より大きい(値2を含まない)
値1 -ge 値2:値1が値2以上(値2を含む)
ファイルの比較に関する主な条件式
ファイル1 -nt ファイル2:ファイル1の更新日付がファイル2より新しければ真
ファイル1 -ot ファイル2:ファイル1の更新日付がファイル2より古ければ真
文字列の比較に関する主な条件式
文字列1 = 文字列2:文字列1と文字列2が等しければ真
文字列1 != 文字列2:文字列1と文字列2が等しくなければ真
その他論理式など
! 条件式:条件を満たさない(NOT)
条件式1 -a 条件式2:条件1と条件2の両方を満たす(AND)
条件式1 -o 条件式2:条件1と条件2のどちらかを満たす(OR)
-n 文字列:文字列の長さが0ではない(文字列が存在する)
条件式の処理の結果
true(真の場合):条件に合致している→0
false(偽の場合):条件に合致していない→0以外
exit文
exit 終了ステータス
→引数で指定した終了ステータスを格納し、その次の処理の際に利用できる
testコマンド
test 条件式 → 条件式の真偽を判断し、その結果を終了ステータスとして返す
[ 条件式 ] → test 条件式の別の書式
shiftコマンド
shift [n] → 指定した数の分、引数の位置を番号の小さい方にずらす(nを指定しないと1つずつずらす)
exprコマンド
書式
expr 数値1 演算子 数値2
概要
四則演算の結果を出力
引数
・数値1、数値2:演算の対象とする数値を指定
・演算子:演算する処理を指定(+:足し算 -:引き算 \*:かけ算 /:割り算 %:剰余(割り算の余り))
if文(条件分岐)
書式
if 条件式1
then
条件式1に合致した場合の処理
elif 条件式2
then
条件式2に合致した場合の処理
else
どの条件にも合致しなかった場合の処理
fi
使用例
vi iftest.sh →iftest.shというファイルを下記のように編集
#!/bin/bash
if [ ! $# -eq 2 ]
then
echo $0 is necessary 2 arguments →引数が2つ指定されていないときはメッセージを表示
elif [ -f $2 ]
then
echo $2 is exists →2つめの引数に指定したファイルが存在すればメッセージを表示
else
cp $1 $2
echo copy complete
fi
case文(条件分岐(多岐分岐))
書式
case 変数名 in
値1) 値1だった場合の処理 ;;
:
*) どの値にも合致しなかった場合の処理 ;;
esac
使用例
vi casetest.sh →casetest.shというファイルを下記のように編集
#!/bin/bash
NUM=$RANDOM →$NUMに0~32767の値がランダムに格納される
NUM=`expr $NUM % 3` →exprコマンドの結果をバッククォーテーションで囲むことにより、展開して&NUMに格納
case $NUM in →ランダムな数値を3で割った値の剰余なので、0~2いずれかの数値が格納
0) echo excellent! ;; →剰余が0の場合のメッセージ
1) echo good luck! ;; →剰余が1の場合のメッセージ
*) echo little luck ;; →その他の場合(つまり剰余が2の場合)のメッセージ
esac
for文(繰り返し(値リスト))
書式
for 変数名 in 値1 値2・・・(値リスト)
do
繰り返す処理
done
使用例
vi fortest1.sh
#!/bin/bash
for var in aaa bbb ccc
do
echo $var
done
while文(繰り返し(条件指定))
書式
while 条件式
do
繰り返す処理
done
使用例
vi whiletest.sh
#!/bin/bash
i=0 →$iに0という値を格納
while [ $i -lt 5 ] →$iが5未満の間、処理を繰り返す
do
echo $i →$iの値を出力
i=`expr $i + 1
` →$iに1を加える
done
function文(関数の定義)
書式
function 関数名() {
処理
}
使用例
vi functest.sh
#!/bin/bash
function convstr(){ →convstr関数を定義
tr [:lower:] [:upper:] →小文字をすべて大文字に変換するようtrコマンドを実行
}
case $1 in →1つめの引数で実行する処理を指定
l) ls $2 | convstr;; →1つめの引数でlを指定するとlsコマンドを実行
c) cat $2 | convstr;; →1つめの引数でcを指定するとcatコマンドを実行
*) echo “usage: $0 l|c [filename]”;; →1つめの引数でlかcを指定しないとエラー
esac
定義済みのシェル関数を確認
declare -f
set | tail
定義済みのシェル関数を削除
unset シェル関数名
bash実行時にデバッグ情報を出力するオプション
bashコマンドのオプション
-v:シェルが読み込んだ、これから実行する行を標準エラー出力に出力する(変数があれば変数名を表示)
-x:シェルが実行した行を、単純なコマンドや変数を展開して標準エラー出力に出力する
bashコマンドのオプションを指定
bash -v ./whiletest.sh
bash -x ./whiletest.sh
シバンの箇所にオプションで指定
#!/bin/bash -x
→以降は常にデバッグ情報を出力するようになる
setコマンドのオプションで囲む
#!/bin/bash
set -x
i=0
set +x
→上記のsetで囲まれた部分だけデバッグ情報を出力
trapコマンド
書式
trap “処理” シグナル
概要
シグナルが送られた場合、指定した処理を実行
引数
・処理:シグナルが送られた場合、指定した処理を実行
・シグナル:trapコマンドの処理対象とするシグナルを指定