お品書き
書き直し中…
とりあえず、中へどうぞ
↓↓↓
スポンサーリンク

Linux ( debian ) のシェルスクリプトで「 Syntax error: "(" unexpected 」のエラーが出て関数が動かない

PC/ネット
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を採用しました。

コメント