ウェブサイト検索

Linux で単純なシェル スクリプトを作成する方法


シェル スクリプトの作成は、Linux ユーザーが習得すべき最も重要なスキルの 1 つです。シェル スクリプトは、1 行ずつ実行するのは面倒な繰り返しタスクを自動化する上で大きな役割を果たします。

このチュートリアルでは、すべての Linux ユーザーが知っておくべき基本的なシェル スクリプト操作のいくつかに焦点を当てます。

1. 簡単なシェルスクリプトを作成する

シェル スクリプトはASCII テキストで構成されるファイルです。まず簡単なシェル スクリプトを作成します。これを行うには、テキスト エディタを使用します。コマンドラインと GUI ベースの両方のテキスト エディターが多数あります。このガイドでは、vim エディターを使用します。

まず、実行時に「Hello world」を表示する簡単なスクリプトを作成します。

vim hello.sh

次の内容をファイルに貼り付けて保存します。

#!/bin/bash
Print Hello world message
echo "Hello World!"

シェル スクリプトを 1 行ずつ見てみましょう。

  • 最初の行 – #!/bin/bash – はシバンヘッダーとして知られています。これは、スクリプトを解釈するためにどのプログラムが使用されるかを示す特別な構造です。この場合、これは /bin/bash で示される bash シェルになります。 #!/usr/bin/python3 で示される Python や、シバンヘッダーが で示される Perl など、他のスクリプト言語もあります。 #!/usr/bin/perl
  • 2行目はコメントです。コメントは、シェル スクリプトの動作を説明するステートメントであり、スクリプトの実行時に実行されません。コメントの前には常にハッシュ記号 # が付きます。
  • 最後の行は、端末に「Hello World」メッセージを出力するコマンドです。

次のステップでは、図に示すようにchmod コマンドを使用して実行権限を割り当て、スクリプトを実行可能にします。

chmod +x  hello.sh

最後に、次のいずれかのコマンドを使用してシェル スクリプトを実行します。

bash hello.sh
OR
./hello.sh

2. 条件文を使用してコードを実行する

他のプログラミング言語と同様に、bash スクリプトでは意思決定を行うために条件文が使用されますが、構文にはわずかな違いがあります。ここではifif-else、およびelif条件文について説明します。

if ステートメントのみの例

if ステートメントは、単一または複数の条件をテストするために使用できます。単一の条件をテストするためのif ステートメントの基本的な使用法から始めます。 if ステートメントは、if ... fi ブロックによって定義されます。

if command
then
  statement
fi

以下のシェルスクリプトを見てみましょう。

#!/bin/bash
echo 'Enter the score'
read x

if [[ $x == 70 ]]; then
  echo 'Good job!'
fi

上記のシェル スクリプトは、ユーザーにスコアを提供するよう求め、スコアは変数 x に保存されます。スコアが 70 に相当する場合、スクリプトは出力「Good job! 」を返します。比較演算子 == は、変数 x に保存されている入力されたスコアが 100 に等しいかどうかをテストするために使用されます。

使用できる他の比較演算子は次のとおりです。

  • -eq – と等しい
  • -ne – 等しくない
  • -lt – 以下
  • -le – 以下
  • -lt – 以下
  • -ge – 以上

たとえば、以下の if ステートメント ブロックは、入力スコアが 50 未満の値の場合、「もっと頑張れ」を出力します。

if [[ $x -lt 50 ]]; then
  echo 'Work Harder!'
fi

if-else ステートメントの例

考えられる結果が 2 つある場合: – これかあれ – if-else ステートメントが役に立ちます。

if command
then
  statement1
else
  statement2
fi

以下のスクリプトは入力スコアを読み取り、 それが70 以上であるかどうかを確認します。

スコアが 70 以上の場合、「よくやった、合格しました!」というメッセージが表示されます。ただし、スコアが 70 を下回る場合は、「失敗しました」という出力が表示されます。

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -ge 70 ]]; then
  echo 'Great job, You passed!'
else
  echo  'You failed'
fi

if-elif-else ステートメントの例

複数の条件と異なる結果があるシナリオでは、if-elif-else ステートメントが使用されます。このステートメントは次の形式になります。

if condition1
then
  statement1
elif condition2
then
  statement2
else
  statement3
fi

たとえば、入力された数字が9060、または30のいずれかであるかをチェックする宝くじ用のスクリプトがあります。

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -eq 90 ]];
then
  echo “You have won the First Prize”

elif [[ $x -eq 60 ]];
then
  echo “You have won the Second Prize”

elif [[ $x -eq 30 ]];
then 
  echo “You have won the Second Prize”
else
  echo “Please try again”
fi

3. AND ロジックでの If ステートメントの使用

if ステートメントを AND 論理演算子と一緒に使用すると、2 つの条件が満たされた場合にタスクを実行できます。 && 演算子は、AND ロジックを示すために使用されます。

#!/bin/bash

echo 'Please Enter your user_id'
read user_id

echo 'Please Enter your tag_no'
read tag_id

if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]];
then
  echo “Login successful”
else
  echo “Login failure”
fi

5. OR ロジックでの If ステートメントの使用

|| 記号で表される OR ロジックを使用する場合、期待される結果を得るには条件のいずれか 1 つがスクリプトで満たされる必要があります。

#!/bin/bash

echo 'Please enter a random number'
read number

if [[ (number -eq 55 || number -eq 80) ]];
then
 echo 'Congratulations! You’ve won'
else
 echo 'Sorry, try again'
fi

ループ構造を使用する

Bash のループを使用すると、ユーザーは特定の結果が得られるまで一連のタスクを実行できます。これは、反復的なタスクを実行する場合に便利です。このセクションでは、他のプログラミング言語でも見られるループのいくつかを見ていきます。

Whileループ

これは最も扱いやすいループの 1 つです。構文は非常に単純です。

while  <some test>
do
 commands
done

以下の while ループを実行すると、1 から 10 までのすべての数値がリストされます。

#!/bin/bash
A simple while loop
counter=1
while [ $counter -le 10 ]
 do
echo $counter
 ((counter++))
done

while ループについて説明します。

変数 counter1 に初期化されます。また、変数が10以下である間は、条件が満たされるまでカウンターの値が増加します。 echo $counter 行は、1 から 10 までのすべての数字を出力します。

forループ

while のループと同様に、 コードを繰り返し実行するためにfor ループが使用されます。つまり、ユーザーが定義した回数だけコードの実行を繰り返します。

構文は次のとおりです。

for var in 1 2 3 4 5 N
do
 command1
 command2
done

以下のfor ループは、1 から 10 までを繰り返し、画面上の値を処理します。

これを実現するより良い方法は、すべての数値を入力する代わりに、示されているように二重中括弧 { } を使用して範囲を定義することです。

#!/bin/bash
Specify range in a for loop

for num in {1..10}
do
  echo $num
done

Bash の位置パラメータ

位置パラメータは、値がシェルに渡されるが割り当てられない場合にスクリプト内で参照される特別な変数です。位置パラメータは $0 $1 $2 $3 …… から $9 まで続きます。 $9 の値を超えると、パラメータを中括弧で囲む必要があります ($ {10}、$ {11} … など)。

スクリプトを実行するとき、最初の位置パラメータ $0 はシェル スクリプトの名前を受け取ります。 $1 パラメータは端末に渡される最初の変数を受け取り、$2 は 2 番目の変数を受け取り、$3 は 3 番目の変数を受け取ります。

次のようにスクリプト test.sh を作成しましょう。

#!/bin/bash
echo "The name of the script is: " $0
echo "My first name is: " $1
echo "My second name is: " $2

次に、スクリプトを実行し、最初の名前と 2 番目の名前を引数として指定します。

bash test.sh James Kiarie

出力から、出力される最初の変数がシェル スクリプトの名前、この場合は test.sh であることがわかります。その後、シェル スクリプトで定義された位置パラメータに応じて名前が出力されます。

位置パラメータは、変数に値を明示的に割り当てる代わりに、入力されるデータをカスタマイズするのに役立つという点で便利です。

シェルコマンドの終了コード

まず、終了コードとは何ですか?という簡単な質問に答えてみましょう。

ユーザーまたはシェル スクリプトによってシェル上で実行されるすべてのコマンドには終了ステータスがあります。終了ステータスは整数です。

終了ステータス 0 は、コマンドがエラーなく正常に実行されたことを意味します。 1 ~ 255 の値は、コマンドが失敗したか、正常に実行されなかったことを示します。

コマンドの終了ステータスを確認するには、$? シェル変数を使用します。

終了ステータス 1 は、一般的なエラー、または sudo 権限のないファイル編集などの許容できないエラーを示します。

終了ステータス 2 は、コマンドまたは組み込みシェル変数が正しく使用されていないことを示します。

127 終了ステータスは不正なコマンドを示しており、通常は「コマンドが見つかりません」エラーが発生します。

スクリプト内でのシェルコマンドの出力の処理

bash スクリプトでは、後で使用できるようにコマンドの出力を変数に保存できます。これはシェル コマンド置換とも呼ばれ、次の方法で実現できます。

variable=$(command)
OR
variable=$(/path/to/command)
OR
variable=$(command argument 1 argument 2 ...)

たとえば、date コマンドを today という変数に保存し、シェル スクリプトを呼び出して現在の日付を表示できます。

#!/bin/bash

today=$(date)

echo “Today is $today”

別の例を見てみましょう。 Linux システム上で有効なログイン ユーザーを見つけたいとします。どのように対処しますか?まず、すべてのユーザー (システム ユーザー、プロセス ユーザー、ログイン ユーザーの両方) のリストが /etc/passwd ファイルに保存されます。

ファイルを表示するには、cat コマンドを使用する必要があります。ただし、ログイン ユーザーを絞り込むには、grep コマンドを使用して /bin/bash 属性を持つユーザーを検索し、cut -c 1-10 コマンドを次のように使用します。を使用すると、名前の最初の 10 文字が表示されます。

cat コマンドlogin_users 変数に保存しました。

#!/bin/bash
login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10)
echo 'This is the list of login users:
echo $login_users

これで、単純なシェル スクリプトの作成に関するチュートリアルは終了です。これが貴重なものであると感じていただければ幸いです。