Linux ディレクトリが空かどうかをチェックするシェルスクリプトで、マウントコマンドが失敗したらスクリプトが終了するように
mount -t nfs4 IPアドレス:/ /hogehoge || exit $?
と書いたのですが
※「 || 」は、前のコマンドがエラー終了だった場合にその後のコマンドを実行する。
command1 || command2 || command3
みたいな書き方が使えます。
「 && 」と書くと前のコマンドが正常終了したときに、後のコマンドを実行する。
その前にマウントポイントを作ってしまっているので、それを削除してから終了したいなと思いまして。
検索してみたら、マウント処理と終了処理を関数化するとスッキリ書けるようなのでやってみました。
(※sambaでファイル共有しているので、NFSではなくCIFSになっています。)
#!/bin/sh
mkdir /mount_point1
function my_command1(){
mount -t cifs -o user=****,password=********,ro //IPアドレス/共有フォルダ名 /mount_point1/
}
function my_command2(){
umount /mount_point1
rmdir /mount_point1
exit 1
}
my_command1 || my_command2
ところが、実行してみたら、
Syntax error: "(" unexpected
というエラーが出て動かない。
なんだろうと思って検索してみたら、Debianのシェルスクリプトはdash(Debian Almquist shell)で、関数の記述の仕方がbashとは少し違うそうです。
解決方法は二種類、ひとつは、スクリプトをbashで実行する。
スクリプトの一行目にある「#!/bin/sh」を「#!/bin/bash」に変える。
もうひとつは、dashの書き方を使う。
☆bashでは関数の定義に「function」をつけるが、dashではそれが不要なのだとか。
bash
function my_command1(){
処理内容
}
dash
my_command1(){
処理内容
}
原因がわからないのですが、bashにすると、Ctrl+Cによる中断処理が使えない。
「 ps -a 」でプロセス番号を調べて「 kill -9 番号 」で強制終了するしかなくなる。
(原因は勉強中。)
shならそうはならなかったので、shを採用しました。
コメント