Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linux Bashスクリプト入門 第3回 – 実用的なサンプルスクリプト5選で学ぶ自動化の基礎

「シェルスクリプティング」シリーズのこれまでの記事は多くの方にご好評いただき、ありがとうございます。今回も学びの旅を続けるべく、シリーズ第3弾として実践的な内容をお届けします。まだ前回までの記事をご覧になっていない方は、ぜひあわせてチェックしてください。

  1. Linuxシェルスクリプティングの基本を理解する – パートI
  2. Linux初心者向けシェルスクリプト5選 – パートII

Bashのキーワード(Keyword)

キーワードとは、プログラミング言語において特別な意味を持つ単語や記号のことです。次に挙げる記号・単語は、引用符で囲まれず、かつコマンドの先頭の語として使われた場合に、Bashにとって特別な意味を持ちます。

! 			esac 			select 		} 
case 			fi 			then 		[[ 
do 			for 			until 		]] 
done 			function 		while 		elif
if 			time 			else 		in 		{

多くの言語と異なり、Bashではこれらのキーワードを変数名として使用することも技術的には可能です。しかし、それを行うとスクリプトの可読性が著しく低下します。理解しやすいスクリプトを書くためにも、変数名にキーワードを使用するのは避けましょう。

また、シェルではコマンドを $(コマンド) の形式で実行できます。環境によっては、正しく実行するためにコマンドのフルパスが必要になる場合があります(例:$(/bin/date))。

特定のコマンドの格納場所を調べたいときは、whereis コマンドが便利です。

[admin@wsxdn.com /]# whereis date
date: /bin/date /usr/share/man/man1/date.1.gz

理論面の解説はここまでにして、実際のスクリプトを見ていきましょう。

カレントディレクトリを指定階層ぶん上へ移動するスクリプト

このスクリプトは、実行時に引数として数値を渡すだけで、カレントディレクトリから任意の階層数ぶん上のディレクトリへ一気に移動できる便利ツールです。

#! /bin/bash 
LEVEL=$1 
for ((i = 1; i <= LEVEL; i++)) 
do 
CDIR=../$CDIR 
done 
cd $CDIR 
echo "You are in: "$PWD 
exec /bin/bash

上記のコードを「up.sh」という名前でデスクトップなどに保存し、実行権限を付与します(chmod 755 up.sh)。あとは次のように実行します。

./up.sh 2(カレントディレクトリを2階層上へ移動)
./up.sh 4(カレントディレクトリを4階層上へ移動)

用途と活用シーン

フォルダの中にフォルダが入れ子になった大規模なプロジェクトでは、ライブラリバイナリアイコン実行ファイルなどがそれぞれ異なる深さの場所に配置されがちです。開発者はこのスクリプトを活用すれば、目的の場所へ自動的かつ素早く移動できます。

ポイント: 上記スクリプト内の for はループ処理であり、条件が真である間は繰り返し実行されます。

実行例

[admin@wsxdn.com /]# chmod 755 up
[admin@wsxdn.com /]# ./up.sh 2
You are in: /

[admin@wsxdn.com /]# ./up.sh 4 
You are in: / 

[admin@wsxdn.com /]#

up.sh をダウンロード

重複しないランダムなファイルを作成するスクリプト

次は、ファイル名が重複する可能性ゼロで、日時ベースのユニークなファイルを作成するスクリプトです。

#! /bin/bash

echo "Hello $USER";
echo "$(uptime)" >> "$(date)".txt
echo "Your File is being saved to $(pwd)"

非常にシンプルなスクリプトですが、その仕組みは決して単純ではありません。各行を分解してみましょう。

  1. echo:引用符内に書かれた文字列を出力します。
  2. $:シェル変数を参照するための記号です。
  3. >>:出力をリダイレクトします。ここでは date コマンドの出力結果に .txt 拡張子を付けたファイル名へ書き込んでいます。

date コマンドの出力には、年・時・分・秒まで含まれます。そのため、ファイル名が重複することなく整理された名前で保存でき、後から参照するためにタイムスタンプ付きのファイルが必要な場合にとても役立ちます。

実行例

[admin@wsxdn.com /]# ./randomfile.sh  
Hello server 
Your File is being saved to /home/server/Desktop

デスクトップには「今日の日付と現在時刻」をファイル名としたファイルが作成されます。

[admin@wsxdn.com /]# nano Sat\ Jul\ 20\ 13\:51\:52\ IST\ 2013.txt 
13:51:52 up  3:54,  1 user,  load average: 0.09, 0.12, 0.08

この考え方を発展させたより実用的な応用例が、次に紹介するネットワーク情報収集スクリプトです。Linuxサーバーのネットワーク情報をまとめて取得するのに非常に有用です。

randomfile.sh をダウンロード

サーバーのネットワーク情報を収集するスクリプト

このスクリプトは、Linuxサーバー上のネットワーク設定情報を一括収集します。コード量が多いため、全容と出力結果をこの場で掲載することはできません。下記のダウンロードリンクから入手し、ぜひご自身の環境で試してみてください。

注意点: lsb-core パッケージなど、必要なパッケージや依存関係のインストールが必要になる場合があります。AptYum で必要なパッケージを導入してください。また、使用しているコマンドの多くはroot権限での実行を前提としているため、スクリプトはrootで実行してください。

実行例

[admin@wsxdn.com /]# ./collectnetworkinfo.sh  

The Network Configuration Info Written To network.20-07-13.info.txt. Please email this file to admin@wsxdn.com_provider.com.

スクリプト内のメールアドレスを自分のアドレスに書き換えれば、生成されたファイルを自動的に自分宛てへ送ることも可能です。自動生成されたファイルはいつでも確認できます。

collectnetworkinfo.sh をダウンロード

大文字を小文字に変換するスクリプト

テキストファイル内の大文字(UPPERCASE)小文字(lowercase)へ一括変換し、結果を「small.txt」というテキストファイルに出力するスクリプトです。出力先のファイル名は用途に合わせて自由に変更できます。

#!/bin/bash 

echo -n "Enter File Name : " 
read fileName 

if [ ! -f $fileName ]; then 
  echo "Filename $fileName does not exists" 
  exit 1 
fi 

tr '[A-Z]' '[a-z]' < $fileName >> small.txt

このスクリプトなら、どんな長さのファイルでもワンステップで大文字から小文字へ変換できます。少し手を加えれば、逆に小文字から大文字への変換にも対応可能です。

実行例

[admin@wsxdn.com /]# ./convertlowercase.sh  
Enter File Name : a.txt 

Initial File: 
A
B
C
D
E
F
G
H
I
J
K
...

変換後に生成される新ファイル(small.txt)の中身はこちらです。

a
b
c
d
e
f
g
h
i
j
k
...

convertlowercase.sh をダウンロード

簡易電卓プログラム

最後に紹介するのは、対話型で動作する簡易電卓スクリプトです。四則演算を選択式で行えます。

#! /bin/bash 
clear 
sum=0 
i="y" 

echo " Enter one no." 
read n1 
echo "Enter second no." 
read n2 
while [ $i = "y" ] 
do 
echo "1.Addition" 
echo "2.Subtraction" 
echo "3.Multiplication" 
echo "4.Division" 
echo "Enter your choice" 
read ch 
case $ch in 
    1)sum=`expr $n1 + $n2` 
     echo "Sum ="$sum;; 
        2)sum=`expr $n1 - $n2` 
     echo "Sub = "$sum;; 
    3)sum=`expr $n1 \* $n2` 
     echo "Mul = "$sum;; 
    4)sum=`expr $n1 / $n2` 
     echo "Div = "$sum;; 
    *)echo "Invalid choice";; 
esac 
echo "Do u want to continue (y/n)) ?" 
read i 
if [ $i != "y" ] 
then 
    exit 
fi 
done

実行例

[admin@wsxdn.com /]# ./simplecalc.sh 

Enter one no. 
12 
Enter second no. 
14 
1.Addition 
2.Subtraction 
3.Multiplication 
4.Division 
Enter your choice 
1 
Sum =26 
Do u want to continue (y/n)) ? 
y
1.Addition 
2.Subtraction 
3.Multiplication 
4.Division 
Enter your choice 
3 
mul = 168
Do u want to continue (y/n)) ? 
n

いかがでしょうか。こんなにシンプルな方法で、計算機のような本格的なプログラムが作成できることがお分かりいただけたと思います。もちろん、これで終わりではありません。本シリーズは今後も少なくとももう1本を予定しており、次回はシステム管理の視点から幅広い話題を取り上げる予定です。

今回のところは以上です。読者の皆様におかれましては、本記事のどの部分が役立ったのか、そして今後の記事でどんなテーマを読みたいのか、ぜひ忌憚のないご意見をお聞かせください。ご質問もコメント欄で大歓迎です。それでは皆さま、どうぞご自愛ください。いいね!シェアで本サイトの拡散にご協力いただけると嬉しいです。

  1. 【保存版】シェルスクリプトでLinux変数を完全理解する方法 – declareコマンド徹底活用(パート10)

    Linuxのシェルスクリプト言語は、昔から根強い人気を誇るテーマであり、今後もずっと注目され続けるでしょう。シェルスクリプトはまるで魔法のように、他のプログラミング言語と同等の手軽さでプログラムを作成できます。ただし、自分が何を行っているのか、どんな結果が期待できるのかを深く理解しておくことが重要です。 これまでお届けしてきたシェルスクリプト入門シリーズは、前回の「Linux変数の徹底解説」を含め、多くの読者様から高い評価をいただいています。本記事では、その内容をさらに一歩深掘りしていきます。 変数の属性とは Linux環境のそれぞれの変数には固有のオプションが存在し、これらは「属性」と呼ば

  2. Linuxシェルスクリプト入門:変数の基本を徹底解説(第9回)

    これまでLinuxシェルスクリプティングに関する連載記事をお届けしてきましたが、当時は多くの方にご好評いただき、今でも十分に役立つ内容となっています。ここでは、変数の仕組み、実行方法、そしてシェルスクリプトでの実装について詳しく見ていきます。 コマンド出力の保存 コマンドの出力は標準出力やファイルにリダイレクトできるだけでなく、変数に格納することも可能です。コマンドの出力が大きすぎて画面に収まらない場合は、ファイルまたは変数に出力を保存するしかありません。変数に出力を保存する利点の一つは、確認速度が速いことです。変数はメモリ上に保存されるため、ファイルからの読み出しと比べて高速に処理されます。