Linux Bashスクリプト入門 第3回 – 実用的なサンプルスクリプト5選で学ぶ自動化の基礎
「シェルスクリプティング」シリーズのこれまでの記事は多くの方にご好評いただき、ありがとうございます。今回も学びの旅を続けるべく、シリーズ第3弾として実践的な内容をお届けします。まだ前回までの記事をご覧になっていない方は、ぜひあわせてチェックしてください。
- Linuxシェルスクリプティングの基本を理解する – パートI
- 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)"
非常にシンプルなスクリプトですが、その仕組みは決して単純ではありません。各行を分解してみましょう。
- echo:引用符内に書かれた文字列を出力します。
- $:シェル変数を参照するための記号です。
- >>:出力をリダイレクトします。ここでは 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 パッケージなど、必要なパッケージや依存関係のインストールが必要になる場合があります。Apt や Yum で必要なパッケージを導入してください。また、使用しているコマンドの多くは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本を予定しており、次回はシステム管理の視点から幅広い話題を取り上げる予定です。
今回のところは以上です。読者の皆様におかれましては、本記事のどの部分が役立ったのか、そして今後の記事でどんなテーマを読みたいのか、ぜひ忌憚のないご意見をお聞かせください。ご質問もコメント欄で大歓迎です。それでは皆さま、どうぞご自愛ください。いいね!やシェアで本サイトの拡散にご協力いただけると嬉しいです。
-
【保存版】シェルスクリプトでLinux変数を完全理解する方法 – declareコマンド徹底活用(パート10)
Linuxのシェルスクリプト言語は、昔から根強い人気を誇るテーマであり、今後もずっと注目され続けるでしょう。シェルスクリプトはまるで魔法のように、他のプログラミング言語と同等の手軽さでプログラムを作成できます。ただし、自分が何を行っているのか、どんな結果が期待できるのかを深く理解しておくことが重要です。 これまでお届けしてきたシェルスクリプト入門シリーズは、前回の「Linux変数の徹底解説」を含め、多くの読者様から高い評価をいただいています。本記事では、その内容をさらに一歩深掘りしていきます。 変数の属性とは Linux環境のそれぞれの変数には固有のオプションが存在し、これらは「属性」と呼ば
-
Linuxシェルスクリプト入門:変数の基本を徹底解説(第9回)
これまでLinuxシェルスクリプティングに関する連載記事をお届けしてきましたが、当時は多くの方にご好評いただき、今でも十分に役立つ内容となっています。ここでは、変数の仕組み、実行方法、そしてシェルスクリプトでの実装について詳しく見ていきます。 コマンド出力の保存 コマンドの出力は標準出力やファイルにリダイレクトできるだけでなく、変数に格納することも可能です。コマンドの出力が大きすぎて画面に収まらない場合は、ファイルまたは変数に出力を保存するしかありません。変数に出力を保存する利点の一つは、確認速度が速いことです。変数はメモリ上に保存されるため、ファイルからの読み出しと比べて高速に処理されます。