40 Simple Yet Effective Linux Shell Script Examples

Historically, shell has been native command-line interpreter for Unix-like systems. それは、長年にわたって Unix の主要な機能の 1 つであることが証明され、まったく新しいトピックそのものに成長しました。 Linux には,Bash,Zsh,Tcsh,Ksh などの強力な機能を持ったシェルがあります. これらのシェルの最も素晴らしい特徴の1つは,そのプログラム性です. Linuxのシェルスクリプトを作成するのは簡単で、日々の業務に役立てることができます。 さらに、このトピックの知識があれば、すぐにLinuxのパワー・ユーザーになれるでしょう。

Linux シェル スクリプトの例

Linux で行われるシェル スクリプトの大部分は bash シェルを使用しています。 この例では、広く普及していることと、非常に使いやすいことから、Linux の bash スクリプトを主に使用します。 編集部では、bash以外のシェルを扱うシェルスクリプトの例もいくつか紹介するように努めました。

Linux Bash Scripts

Bash aka the Bourne Again Shell は、現在ほとんどの Linux ディストロでデフォルトのコマンドラインインタープリタです。 これは、バージョン 7 Unix で最初に導入された以前の Bourne シェルをアップグレードしたものです。 bashシェルスクリプトを学ぶことで、他のシェルスクリプトをより速く理解することができます。

1.Hello World

プログラマはしばしば hello world プログラムを学ぶことによって新しい言語を学ぶことができます。 これは、文字列 “Hello World” を標準出力に表示する簡単なプログラムです。 vimやnanoなどのエディタでhello-world.shを作成し、以下の行をコピーしてください。

#!/bin/bashecho "Hello World"

ファイルを保存して終了します。

$ chmod a+x hello-world.sh

このファイルを下のコマンドで実行可能にします。

$ bash hello-world.sh$ ./hello-world.sh

スクリプト内でechoに渡した文字列を出力します。

2 echoを使って印刷

bashで情報を出力するにはechoコマンドを使っています。 C の関数 ‘printf’ に似ていて、エスケープシーケンスやリダイレクトなど多くの共通オプションを提供します。

以下の行を echo.sh というファイルにコピーして、上で行ったように実行可能にしてください。

#!/bin/bashecho "Printing text"echo -n "Printing text without newline"echo -e "\nRemoving \t special \t characters\n"

スクリプトを実行して何をするか確認します。 e オプションは、echo に渡された文字列が特殊文字を含み、拡張機能を必要とすることを伝えるために使用されます。 重要なロジックを扱うコードの中にコメントを入れるのは、一般的なやり方です。 行をコメントアウトするには、行の前に#(ハッシュ)文字を使用するだけです。 以下のbashスクリプトの例を見てみよう。

#!/bin/bash# Adding two values((sum=25+35))#Print the resultecho $sum

このスクリプトは、数字60を出力する。 いくつかの行の前に#を付けて、コメントがどのように使用されているかを確認してください。 しかし、最初の行は例外です。 これは shebang と呼ばれ、このスクリプトを実行するときにどのインタープリタを使用するかをシステムに知らせます。 複数行コメント

多くの人がシェルスクリプトの文書化に複数行コメントを使用します。 次のcomment.shというスクリプトで、これがどのように行われているかを確認する。

#!/bin/bash: 'This script calculatesthe square of 5.'((area=5*5))echo $area

複数行のコメントが:’と’文字の中に置かれていることに注意すること。 Whileループ

Whileループ構成は、ある命令を複数回実行するために使用されます。

#!/bin/bashi=0while doecho Number: $i((i++))done

そこで、whileループは次のような形になります。

while docommands 1commands ndone

角括弧の周りのスペースは必須です。 Forループ

Forループもbashシェルで広く使われている構成で、コードの反復を効率的に行うために使われます。

#!/bin/bashfor (( counter=1; counter<=10; counter++ ))doecho -n "$counter "doneprintf "\n"

このコードを for.sh という名前のファイルに保存し、./for.sh で実行します。 実行ファイルにするのを忘れないでください。 このプログラムは1から10までの数字を出力するはずです。

7. ユーザーからの入力を受け取る

スクリプトでユーザーとの対話を実装するには、ユーザーの入力を得ることは非常に重要です。

#!/bin/bashecho -n "Enter Something:"read somethingecho "You Entered: $something"

そこで、変数名の後に続く read 構文は、ユーザー入力を取得するために使用されます。 入力はこの変数に格納され、$ 記号を使ってアクセスできます。 If ステートメント

If ステートメントは Unix シェルスクリプトで利用できる最も一般的な条件構成で、以下のような形式をとります。 fi キーワードは if 文の終わりを示すのに使われる。

#!/bin/bashecho -n "Enter a number: "read numif ]thenecho "Number is greater than 10."fi

上記のプログラムは、入力で与えられた数字が10より大きい場合にのみ出力を表示します。 gt は greater than、同様に -lt は less than、-le は less than equal、-ge は greater than equal を意味する。 は必須です。

9. If Else を使用してさらに制御する

if に else 構造を組み合わせることで、スクリプトのロジックをよりよく制御できるようになります。

#!/bin/bashread nif ;thenecho "It is a one digit number"elseecho "It is a two digit number"fi

else 部分は if のアクション部分の後、fi の前に配置される必要があります。 AND演算子の使用

AND演算子により、プログラムは複数の条件が一度に満たされるかどうかを確認することができます。 AND演算子で区切られた部分はすべて真でなければなりません。 そうでなければ、ANDを含む文は偽を返します。 AND演算子は&&記号で表されます。

11. OR 演算子の使用

OR 演算子は、スクリプトに複雑で堅牢なプログラミング ロジックを実装できるようにする、もう 1 つの重要な構成要素です。 ANDとは異なり、OR演算子で構成される文は、オペランドのどちらかが真であれば真を返します。 OR で区切られた各オペランドが偽のときのみ偽を返す。

#!/bin/bashecho -n "Enter any number:"read nif ]thenecho "You won"elseecho "You lost!"fi

この簡単な例は、Linux シェルスクリプトで OR 演算子がどのように動作するかを示している。 これは、ユーザーが15または45の数字を入力したときだけ、勝者として宣言するものである。 記号は OR 演算子を表している。 Elifを使う

elif文はelse ifの略で、連鎖論理を実装するための便利な手段を提供する。 次の例を評価することで、elifがどのように機能するかを見つけてください。

#!/bin/bashecho -n "Enter a number: "read numif ]thenecho "Number is greater than 10."elif ]thenecho "Number is equal to 10."elseecho "Number is less than 10."fi

上記のプログラムは自明なので、行ごとに分解することはしません。 変数名や値などスクリプトの一部を変更し、それらがどのように機能するかを確認します。

13. スイッチ構文

スイッチ構文は、Linux bashスクリプトが提供するもう一つの強力な機能である。 これは、ネストされた条件が必要だが、複雑なif-else-elifチェーンを使いたくない場合に使用することができる。 次の例を見てみよう。

#!/bin/bashecho -n "Enter a number: "read numcase $num in100)echo "Hundred!!" ;;200)echo "Double Hundred!!" ;;*)echo "Neither 100 nor 200" ;;esac

条件はcaseとesacキーワードの間に書かれている。 100と200以外のすべての入力にマッチするように*)が使用されます。

14. コマンドライン引数

コマンドシェルから直接引数を取得することは、多くのケースで有益です。 以下の例は、bash でこれを行う方法を示しています。

#!/bin/bashecho "Total arguments : $#"echo "First Argument = "echo "Second Argument = "

このスクリプトに名前の後に 2 つの追加パラメータを付けて実行します。 test.sh と名付け、呼び出し手順の概要は次のとおりです。

$ ./test.sh Hey Howdy

つまり、$1 は最初の引数にアクセスするために、$2 は 2 番目の引数に、といった具合に使用されます。 $# は引数の総数を取得するために使用されます。

15.

#!/bin/bashfor arg in "$@"doindex=$(echo $arg | cut -f1 -d=)val=$(echo $arg | cut -f2 -d=)case $index inX) x=$val;;Y) y=$val;;*)esacdone((result=x+y))echo "X+Y=$result"

このスクリプトに test.sh という名前を付けて、以下のように呼び出します。 引数は’$@’に格納され、スクリプトはLinuxのcutコマンドを使用して引数を取得します.

16. 文字列の連結

文字列の処理は、現代の幅広いbashスクリプトにとって非常に重要なものである。 ありがたいことに、bashではより快適で、はるかに正確で簡潔な方法でこれを実装することができる。

#!/bin/bashstring1="Ubuntu"string2="Pit"string=$string1$string2echo "$string is a great resource for Linux beginners."

次のプログラムは、文字列 “UbuntuPit is a great resource for Linux beginners.” をスクリーンに出力します。 文字列のスライス

多くのプログラミング言語に反して、bashは文字列の一部をカットする機能を内蔵していません。

#!/bin/bashStr="Learn Bash Commands from UbuntuPit"subStr=${Str:0:20}echo $subStr

このスクリプトは出力として “Learn Bash Commands” をプリントアウトするはずです。 パラメータ展開は ${VAR_NAME:S:L} という形式をとります。 ここで、Sは開始位置、Lは長さを表します。

18. Cutによる部分文字列の抽出

Linuxのcutコマンドは、スクリプトの中で文字列の一部、つまり部分文字列を「切る」ために使用できます。

#!/bin/bashStr="Learn Bash Commands from UbuntuPit"#subStr=${Str:0:20}subStr=$(echo $Str| cut -d ' ' -f 1-3)echo $subStr

Linux の Cut コマンドがどのように動作するかを理解するために、このガイドをチェックしてください。 2つの値の足し算

Linuxシェルスクリプト内で算術演算を実行するのは非常に簡単です。 以下の例は、ユーザから2つの数値を入力し、それらを足す方法を示しています。

#!/bin/bashecho -n "Enter first number:"read xecho -n "Enter second number:"read y(( sum=x+y ))echo "The result of addition=$sum"

このように、bashで数値を足すのは非常に簡単です。 複数の値を追加する

ループを使って複数のユーザ入力を取得し、スクリプト内でそれらを追加することができます。 以下の例では、これを実際に行っています。

#!/bin/bashsum=0for (( counter=1; counter<5; counter++ ))doecho -n "Enter Your Number:"read n(( sum+=n ))#echo -n "$counter "doneprintf "\n"echo "Result is: $sum"

ただし、(( )を省略すると、追加ではなく文字列の連結になります。

21 のように、プログラム中にこのようなものがないかチェックしてください。 Bashにおける関数

他のプログラミング言語と同様に、関数はLinuxシェルスクリプトにおいて重要な役割を担っている。 これらは、管理者が頻繁に使用するカスタムコードブロックを作成することを可能にします。 以下のデモでは、Linuxのbashスクリプトで関数がどのように動作するかの概要を説明します。

#!/bin/bashfunction Add(){echo -n "Enter a Number: "read xecho -n "Enter another Number: "read yecho "Adiition is: $(( x+y ))"}Add

ここで、前と同じように二つの数字を追加しています。 しかし、ここではAddという関数を使って作業をしています。 したがって、再び足し算をする必要があるときはいつでも、そのセクションを再び書く代わりにこの関数を呼び出すことができます

22. 戻り値を持つ関数

関数の最も素晴らしい機能の1つは、ある関数から別の関数にデータを渡すことができることです。 これは、さまざまな場面で役に立ちます。 次の例をご覧ください。

#!/bin/bashfunction Greet() {str="Hello $name, what brings you to UbuntuPit.com?"echo $str}echo "-> what's your name?"read nameval=$(Greet)echo -e "-> $val"

ここで、出力にはGreet()関数から受け取ったデータが含まれます。

23. Bash スクリプトからのディレクトリの作成

シェルスクリプトを使用してシステムコマンドを実行する機能は、開発者がより生産的になることを可能にします。 次の簡単な例では、シェルスクリプト内からディレクトリを作成する方法を紹介します。

#!/bin/bashecho -n "Enter directory name ->"read newdircmd="mkdir $newdir"eval $cmd

よく見ると、このスクリプトは単に標準シェルコマンド mkdir を呼び出して、ディレクトリ名を渡しているだけですね。 このプログラムは、ファイルシステムにディレクトリを作成するはずです。 以下のように、実行するコマンドをバックスティック(“)の中に渡すこともできます。

`mkdir $newdir`

24. 存在を確認してからディレクトリを作成する

上記のプログラムは、現在の作業ディレクトリに同じ名前のフォルダがすでに存在する場合は動作しません。

#!/bin/bashecho -n "Enter directory name ->"read dirif thenecho "Directory exists"else`mkdir $dir`echo "Directory created"fi

このプログラムをevalで書いて、bashスクリプトの技術を高めてください。 ファイルを読む

Bashスクリプトは、ユーザが非常に効率的にファイルを読むことを可能にします。 以下の例では、シェルスクリプトを使用してファイルを読み取る方法を紹介します。

1. Vim 2. Emacs 3. ed 4. nano 5. Code

このスクリプトは上記の5行をそれぞれ出力します。

#!/bin/bashfile='editors.txt'while read line; doecho $linedone < $file

26. ファイルの削除

次のプログラムは、Linuxのシェルスクリプトでファイルを削除する方法を示しています。 このプログラムは、まずユーザーに入力としてファイル名を尋ね、存在すればそれを削除します。

#!/bin/bashecho -n "Enter filename ->"read namerm -i $name

ここで、ファイル名として editors.txt と入力し、確認を求められたら y を押してみましょう。 これでファイルが削除されるはずです。

27. ファイルへの追加

以下のシェルスクリプトの例は、bashスクリプトを使用してファイルシステム上のファイルにデータを追加する方法を示しています。

#!/bin/bashecho "Before appending the file"cat editors.txtecho "6. NotePad++" >> editors.txtecho "After appending the file"cat editors.txt

ここまでで、Linuxのbashスクリプトから直接日常的なターミナルコマンドを使用していることに気づくはずです。

#!/bin/bashfilename=if ; thenecho "File exists"elseecho "File does not exist"fi

次のシェルスクリプトの例では、bashプログラムからファイルの存在を確認する方法を示します。

29. シェルスクリプトからメールを送る

bash スクリプトからメールを送るのは非常に簡単です。

#!/bin/bashrecipient="[email protected]"subject="Greetings"message="Welcome to UbuntuPit"`mail -s $subject $recipient <<< $message`

これは、指定された件名とメッセージを含む電子メールを受信者に送信します。 日付と時間の解析

次のbashスクリプトの例では、スクリプトを使用して日付と時間を処理する方法を紹介します。 Linuxのdateコマンドで必要な情報を取得し、このプログラムがパースを行います。

#!/bin/bashyear=`date +%Y`month=`date +%m`day=`date +%d`hour=`date +%H`minute=`date +%M`second=`date +%S`echo `date`echo "Current Date is: $day-$month-$year"echo "Current Time is: $hour:$minute:$second"

このプログラムを実行して、どのように動作するかを確認してみてください。 また、ターミナルからdateコマンドを実行してみてください。

31. Sleepコマンド

sleepコマンドは、シェルスクリプトが命令の間に一時停止することを可能にします。 これは、システムレベルのジョブの実行など、多くのシナリオで有用である。

#!/bin/bashecho "How long to wait?"read timesleep $timeecho "Waited for $time seconds!"

このプログラムは、最後の命令の実行を$time秒(この場合、ユーザが指定する)まで一時停止する。 Waitコマンド

waitコマンドはLinuxのbashスクリプトからシステムプロセスを一時停止するために使用されます。

#!/bin/bashecho "Testing wait command"sleep 5 &pid=$!kill $pidwait $pidecho $pid was terminated.

このプログラムを自分で実行して、どのように動作するかをチェックしてみてください。 最終更新ファイルを表示する

ある操作のために最終更新ファイルを見つける必要がある場合があります。 次の簡単なプログラムは、bash で awk コマンドを使用してこれを行う方法を示しています。 これは現在の作業ディレクトリにある最終更新ファイルか作成ファイルのどちらかをリストアップします。

#!/bin/bashls -lrt | grep ^- | awk 'END{print $NF}'

分かりやすくするために、この例では awk がどのように機能するかの説明は避けます。 このコードをコピーするだけで、タスクを完了させることができます。 バッチ拡張機能を追加する

以下の例は、ディレクトリ内のすべてのファイルにカスタム拡張機能を適用します。 新しいディレクトリを作成し、デモのためにいくつかのファイルをそこに置きます。 私のフォルダには合計5つのファイルがあり、それぞれのファイル名はtestの後に(0-4)が付いています。 このスクリプトは、ファイルの末尾に(.UP)を付けるようにプログラムしてあります。

#!/bin/bashdir=for file in `ls /*`domv $file $file.UPdone

まず最初に、このスクリプトを通常のディレクトリから試さないでください。代わりに、テストディレクトリから実行してください。 さらに、コマンドラインの引数として、ファイルのディレクトリ名を指定する必要があります。 現在の作業ディレクトリにはピリオド(.)を使用します。

35. ファイルやディレクトリの数を表示する

以下のLinux bashスクリプトは、指定されたディレクトリに存在するファイルやフォルダの数を表示します。 Linuxのfindコマンドを利用している。 コマンドラインからファイルを検索したいディレクトリ名を渡す必要があります。

#!/bin/bashif ; thenecho "Files found: $(find "$@" -type f | wc -l)"echo "Folders found: $(find "$@" -type d | wc -l)"elseecho " Please retry with another folder."exit 1fi

指定したディレクトリが利用できない場合、または権限問題がある場合、プログラムはユーザーに再試行するよう要求します。 ログファイルのクリーニング

次の簡単な例は、実生活でシェルスクリプトを使用できる便利な方法を示しています。 このプログラムは、/var/log ディレクトリに存在するすべてのログファイルを単純に削除します。 他のログをクリーンアップするために、このディレクトリを保持する変数を変更することができます。

#!/bin/bashLOG_DIR=/var/logcd $LOG_DIRcat /dev/null > messagescat /dev/null > wtmpecho "Logs cleaned up."

この Linux シェルスクリプトを root として実行することを覚えておいてください。 Bashを使用したバックアップスクリプト

シェルスクリプトは、ファイルおよびディレクトリをバックアップするための堅牢な方法を提供します。 次の例では、過去24時間以内に変更された各ファイルまたはディレクトリをバックアップします。 このプログラムは、これを行うために find コマンドを利用します。

#!/bin/bashBACKUPFILE=backup-$(date +%m-%d-%Y)archive=${1:-$BACKUPFILE}find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar"echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."exit 0

バックアップ処理が成功した後、ファイルとディレクトリの名前を表示します。 rootかどうかを確認する

以下の例は、Linuxのbashスクリプトからユーザーがrootかどうかを見つける簡単な方法を示しています。 UIDを元にrootユーザーにマッチします。

39. ファイルから重複行を削除する

ファイル処理にはかなりの時間がかかり、多くの点で管理者の生産性を阻害しています。 ファイル内の重複を検索することは、困難な作業になる可能性があります。 幸運にも、短いシェル スクリプトでこれを行うことができます。

#! /bin/shecho -n "Enter Filename-> "read filenameif ; thensort $filename | uniq | tee sorted.txtelseecho "No $filename in $pwd...try again"fiexit 0

上記のスクリプトは、ファイルを 1 行ずつ調べ、重複する行をすべて削除します。 そして、新しい内容を新しいファイルに配置し、元のファイルはそのまま維持します。

40. システム メンテナンス

私はよく、手動で行う代わりに、小さな Linux シェル スクリプトを使用してシステムをアップグレードしています。 以下のシンプルなシェルスクリプトがその方法を教えてくれます。

#!/bin/bashecho -e "\n$(date "+%d-%m-%Y --- %T") --- Starting work\n"apt-get updateapt-get -y upgradeapt-get -y autoremoveapt-get autocleanecho -e "\n$(date "+%T") \t Script Terminated"

このスクリプトは、もう必要のない古いパッケージの処理も行います。

Ending Thoughts

Linux シェルスクリプトは、想像できる限り多様なものがあります。 何ができて、何ができないかを決定することになると、文字通り制限はありません。 もしあなたが新しい Linux 愛好家なら、これらの基本的な bash スクリプトの例をマスターすることを強くお勧めします。 どのように動作するかをより明確に理解するために、それらを微調整する必要があります。 我々は、最新のLinux bashスクリプトに必要なすべての本質的な洞察を提供するために最善を尽くしました。 シンプルにするために、いくつかの技術的な事柄には触れていません。 しかし、このガイドが多くの人にとって素晴らしい出発点であることを証明するはずです。

コメントを残す

メールアドレスが公開されることはありません。