シェルスクリプトの条件式

シェルスクリプトの条件式
#08 条件式を評価してみよう (1)
http://dotinstall.com/lessons/basic_shellscript/10608
を参考に
シェルスクリプトの条件式について学習
Linux では正常終了したかどうか評価することがおおい
正常終了は0になるので
0であるかどうか調べたり、比較したりすることになる
評価するコマンドは
test コマンド
これについては
【 test 】 条件式の真偽を判定する
も参考に
例えば、数値評価で
1と2が等しいか評価するには
test 1 -eq 2 ; echo $?
とする
-eq は等しいか?
という意味の条件式
$? は
直前に行った命令が正常終了したかどうか返す
正常終了なら0
そうでないなら1
となる
test 1 -eq 2 ; echo $?
は等しくないので

となる
test 1 -eq 1 ; echo $?
なら等しいので

となる
比較している条件の意味は
-eq
等しいか調べる
== と同じ
-ne
等しくない
!= とおなじ
-gt
~より大きい
< とおなじ -ge ~以上 <= と同じ -lt ~より小さい >とおなじ
-le
~以下
>= と同じ
これらの条件式を使うことで
if
while
case
for
などの処理ができる

コマンドの結果を配列として扱うには

コマンドの結果を配列として扱うには
#07 配列を使ってみよう (2)
http://dotinstall.com/lessons/basic_shellscript/10607
を参考に
配列要素の操作と
コマンドの実行結果を配列で扱う方法を学習
a=(2 4 6)

プログラム中で
6ではなく10に修正するには
a[2]=10
でOK
代入するときには
$a とはせず、そのままa[2] だけでOK
これで
echo ${a[@]}
で表示すると
2 4 6
から
2 4 10
へ変更されている
変更はこれでOKなので
次に要素の追加
これは
+=
で追加していく
a+=(20 30)
として
echo ${a[@]}
で表示すると
2 4 10 20 30
というように、最後のほうへ追加されているのがわかる
そして、次にコマンドの実行結果を配列として扱う方法
まず、変数に date の結果を代入
“ で囲むことで、date の実行結果が返ってくるので
これを変数に格納する
ちなみに、date の結果はスペースで区切られる
d=(`date`)
これを表示するには
echo ${d[3]}
とする
通常、date を実行すると
2013年 6月 5日 水曜日 21:01:36 JST
これを配列3、つまり
スペースで区切った4番目になるので
水曜日
と表示される

シェルスクリプトでの配列

シェルスクリプトでの配列
#06 配列を使ってみよう (1)
http://dotinstall.com/lessons/basic_shellscript/10606
を参考に
シェルスクリプトでの配列で
各要素へのアクセスについて学習
まず
a=(2 4 6)
で配列作成
java script とか PHP のときとは違って
, で区切らず、スペースなので注意
これに
echo $a
とすると、先頭要素つまり2になる
もし、2番目の4を出したいのなら
echo ${a[1]}
というようにする
配列は
シェルスクリプトの場合でも
Java script の場合でも同じで
0から数える
このため、2番目は1となる
配列の数字をつけるときには
{} で変数を囲むのを忘れずに
つけずに
echo $a[1]
とすると
2[1]
と表示される
番号で指定するのではなく、
すべての要素を対象にするなら
@を使う
echo ${a[@]}
とすれば
2,4,6 が表示される
要素の数を取得したいのなら
echo ${#a[@]}
とすると
3つ格納されているので

と表示される

シェルスクリプトでの四則演算

シェルスクリプトでの四則演算
足し引き割に関しては
“で囲んで
expr の後に計算式をかけばOK
例えば
x=10
#足し算
echo `expr $x + 10`
#引き算
echo `expr $x – 5`
#割り算
echo `expr $x / 5`
とすれば
20
5
2
となる
注意するのは掛け算
• はワイルドカード扱いのため
\* というようにする
#掛け算 \* でないとエラー
echo `expr $x \* 10`
これで100になる
また、四則演算で()を用いて優先順位を
つけるときにも
() は \( \) というようにしないとエラーになるので注意
#四則演算の優先順位指定
echo `expr \( $x + 5 \) \* 2`
とすると
(10+5)*2 となり30になる
この\( と \) についても、
前後にスペースを開けないと違う結果になってしまうので注意
echo `expr \($x + 5 \) \* 2`
とすると
expr: 整数でない引数
になってしまう
あと、シェルスクリプトの場合、
変数宣言のときに
readonly をつけることで
値に代入できなくすることで
ファイルパスが変更されたりすることを防ぐことができる
#読み込み専用変数
readonly FILE_NAME=”hello.sh”
とした後で
FILE_NAME=”test.sh”
として実行すると
./enzan.sh: 行 23: FILE_NAME: 読み取り専用の変数です
というようにエラーがでて書き込めないのが確認できる

シェルスクリプトで数値演算

シェルスクリプトで数値演算
スクリプトで計算する時
x=10
echo $x
だと10になる
しかし
echo $x-2
とすると
8ではなく 10-2 となってしまう
このため、計算するときは
バッククオートを使う
Shift + @ で ` となるのでこれを使う
Shift + 7 の ’ と似ているので注意
これでかこむと
“で囲んだ中の式を評価して結果を返すようになる
なので、計算するコマンド expr を使って式を汲み立てる
expr は計算する Linux コマンド
詳しくは
【 expr 】 整数計算を行う
を参考
あと、expr の四則演算の記号の前後に
空白を入れないとエラーになる
今回なら
echo `expr $x – 2`
となる
これで
8 と表示されるようになる

シェルスクリプト基礎

シェルスクリプト基礎
#03 変数を使ってみよう
http://dotinstall.com/lessons/basic_shellscript/10603
を参考に
シェルスクリプトの変数について学習
シェルスクリプトでよく見る
exit 0
は正常終了という意味
シェルスクリプトの変数を使うときの注意点として
代入する時に
a=”hello”
というようにするときに、
=の前後にスペースをいれないこと
a = “hellow”
とかはダメ
作成した変数を使う時には
$a
というように
$をつけてつかう
ちなみに、echo とかで出力するときに
文字列なら
echo “$a”
というようにする
あと、他の変数と混ざらないように変数を
${a}
というようにすることもできる
意味は変わらない
echo で表示するなら
echo “${a}”
あと、よくある文字列の連結
PHPでは . でくっつけて
JavaScript では + で連結
で、シェルスクリプトの場合は
$a$a
というようにそのまま変数をくっつけるだけでOK
スペースを開けるときには
JavaScript では +” “+
としたけど
シェルスクリプトでは
“$a $a”
というように、スペースをあけるだけでOK
また、シェルスクリプトの文字列表現には
“”
’’
と2種類あり
” でかこんだ場合には、文字列の中身は展開されない
試しに
test.shを作成して
#!/bin/bash
a=”hello”
echo $a
echo “$a”
echo “${a}”
echo $a$a
echo “$a $a”
echo ‘$a’
として保存
chmod +x test.sh

./test.sh
を実行すると
hello
hello
hello
hellohello
hello hello
$a
となるのが確認できる

シェルスクリプトでファイル書き換え

ユーザの所有権を変更するのに毎回タイプするのは面倒なので
スクリプトを作ってみようと思います
今回は read コマンドを使ったものを作成
vim user_change.sh
でファイルを作成
#!/bash/sh
echo -n “所有権を変更します ユーザ名の入力を–>”
read $USER
chown -R $USER:$USER test-ip.txt
echo “所有権を $USER へ変更しました”
これでOK
ただし、$USER に格納したデータを消さないと
毎回ユーザを変えられないので、この処理が必要
ちなみに、一度ログアウトしなければ値が保持されているので
そのままパーミッション変更などには使えます
sh user_change.sh
のあとに
mkdir $USER
とすれば
ユーザ名のディレクトリなどにも使えますし
chwon $USER test
というように所有権変更などにも使えます
応用で ipアドレス変更とかもできます

サーバーIPアドレス取得

スクリプトを使ってIPアドレスの取得ができないか調べてみました
ipアドレスの取得
に答えが載っていました
vim getip.sh
でファイルを作成
#!/bin/sh
. /etc/sysconfig/network-scripts/ifcfg-eth0
echo $IPADDR
でIPアドレスの表示ができるようになりました
これで、応用で web サーバーの設定やIPアドレスを設定するところが
簡略化できます

シェルスクリプトで chown

シェルスクリプトで
chown コマンドを使うようにしてみました
test.txt というファイルをつくり、中身を適当に用意します
vi test.txt
で作成し
aaaaa
bbbbb
という内容にします
今回は、所有権の変更なので、中身は適当です
通常、chown ユーザ名 ファイル名
となりますが
今回は
vi chowntest.sh
でスクリプトを作成してみました
#!/bin/bash
echo “変更するユーザ名を入力”
read name
chown $name. test.txt
という内容です
これを
sh chowntest.sh
とすれば
所有権が入力したユーザ名に変わります
ただし、存在しないユーザを入力するとエラーになります
このスクリプトを使えば、
よくある
chmod ユーザ名. /var/www/html/
のときに簡単に設定できそうです
(通常は root 権限なので、変更は必須ですから)
構文の中にある read は
キーボードからの入力をするために使っています
シェルスクリプト :: read コマンド
そして
【 文字列の入力 】
を参考にしてみました

スクリプトを混ぜたサーバー構築実験

前回、Webメールアプリ RoundCube その2
にて、メールサーバー機能がないため、導入が頓挫していましたので
これを機会に、再度ローカルメールサーバーを構築してみました
とはいっても、今回は以前のように暗号化などは行っていません
前回のローカルメールサーバー構築については
POP形式で行いました
そのときのメモがわりに書いたのが
メールサーバー構築(Postfix+Dovecot)
から載っています
カテゴリ Postfix+Dovecot
にいろいろと書き込んでありますので
もしよければ参考にしてみてください
それにしても、ブログでメモしておくと
後々同じようなトラブルが起きたとき対処しやすくなりますので
これからも続けていこうと思います
さて、話がそれましたが
今回は、シェルスクリプトを使ってのセットアップとなります
とはいっても、まだ if や switch などを使った制御ではなく
ただ単にコマンドの羅列程度です
参考にさせていただいたのは、前回のときと同じサイトです
ただし、今回の設定したのは fedora13 32bit
メールサーバー構築(Postfix+Dovecot)
のほうになります
ある程度はスクリプトでできたのですが、
どうしてもコマンドを入力する場面はでてきます
まぁそれは今後の課題ということで、まずは今回の実験結果です
それでは、今回作成したスクリプト
setup_fedora_mail_server.sh
の内容です
途中に cp コマンドがあるように
あらかじめ同ディレクトリ内に
procmail設定ファイルの procmailrc
そして
procmailログローテーション設定ファイルの
procmail
を用意する必要があります
------------------------------—-
#!/bin/bash
#yum -y install yum-fastestmirror
#yum -y install nautilus-open-terminal
#/etc/rc.d/init.d/yum-updatesd stop
#yum -y remove yum-updatesd
#yum -y install yum-cron
#chkconfig yum-cron on
yum -y install postfix
#7行めに追記(自FQDN名を指定)
sed -i “77i myhostname = mail.linuxwiki.com” /etc/postfix/main.cf
#88行めに追記(自ドメイン名を指定)
sed -i “85i mydomain = linuxwiki.com” /etc/postfix/main.cf
#102行めに追記(ローカルからのメール送信時の送信元メルアド@以降にドメイン名>を付加)
sed -i ‘102i myorigin = $mydomain’ /etc/postfix/main.cf
#perl-TimeDate のインストール
yum -y install perl-TimeDate
#外部からの受信を許可
sed -i “s/inet_interfaces = localhost/inet_interfaces = all/g” /etc/postfix/main.cf
#167行目、行末へ , $mydomain を追記
#($は特殊記号なのでエスケープが必須になる)
sed -i “167s/\$/, \$mydomain/” /etc/postfix/main.cf
#423行目追記(メールボックスの形式をMaildir 形式へ)
sed -i “423i home_mailbox = Maildir/” /etc/postfix/main.cf
#575行めにメールサーバーソフトの隠蔽を追記
sed -i “575i smtpd_banner = \$myhostname ESMTP unknown” /etc/postfix/main.cf
#最下行へ追記
#SMTP-Auth 設定
echo -e ‘smtpd_sasl_auth_enable = yes’ >> /etc/postfix/main.cf
echo -e ‘smtpd_sasl_local_domain = $myhostname’ >> /etc/postfix/main.cf
echo -e ‘smtpd_recipient_restrictions =’ >> /etc/postfix/main.cf
#行頭に空白がはいっていないと、なぜかエラーになるので注意
echo -e ‘ permit_mynetworks’ >> /etc/postfix/main.cf
echo -e ‘ permit_sasl_authenticated’ >> /etc/postfix/main.cf
echo -e ‘ reject_unauth_destination’ >> /etc/postfix/main.cf
#受信メールサイズ設定
echo -e ‘message_size_limit = 20485760’ >> /etc/postfix/main.cf
#saslauthd 起動
/etc/rc.d/init.d/saslauthd start
chkconfig saslauthd on
sed -i “s/saslauthd/auxprop/g” /usr/lib/sasl2/smtpd.conf
mkdir -p /etc/skel/Maildir/{new,cur,tmp}
chmod -R 700 /etc/skel/Maildir/
sed -i “453i mailbox_command = /usr/bin/procmail” /etc/postfix/main.cf
## procmail procmailrc に関してはcp コマンドで作成済みファイルをコピー
cp -p procmailrc /etc/
cp -p procmail /etc/logrotate.d/
/etc/rc.d/init.d/sendmail stop
chkconfig sendmail off
#メールサーバー切り替え
#2を選択すること
alternatives –config mta
/etc/rc.d/init.d/postfix start
chkconfig postfix on
#Dovecot の導入
yum -y install dovecot
#設定ファイル変更
sed -i “21i protocols = imap imaps pop3 pop3s” /etc/dovecot.conf
sed -i “226i mail_location = maildir:~/Maildir” /etc/dovecot.conf
/etc/rc.d/init.d/dovecot start
chkconfig dovecot on
--------------------------------------------------—
ここまでで、大抵の設定はできるのですが
メールユーザの設定等は
自力で入力することになります
これはまだ、ログインなどの処理スクリプトをかけないのが原因です
このため、今回はメールユーザをそのまま fedora
パスワード関連に関しては
ローカル メールサーバー構築
を参考に
echo “hebereke” | saslpasswd2 -p -u linuxwiki.com -c fedora
としました
ユーザ登録のスクリプト化については
”簡単なユーザアカウント登録するシェルスクリプト’
とか
Linux処理の自動化 (GUI処理含む)
などを参考に、つくってみようと思います
今回の設定では、暗号化などは行っていません
このため、セキュリティには問題がありますので
実用はこのままではできません
次回は、前回中断してしまった RoundCube の導入を行おうと思います