シェル関数

ShellShellBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Linux のシェル関数を調べます。シェル関数は、特定のタスクを実行する再利用可能なコード ブロックであり、スクリプトをより整理されたものにして効率的にすることができます。シェル スクリプトで関数を作成、呼び出し、パラメータを使って使用する方法を学びます。この実験は初心者向けに設計されているため、段階的に進み、各概念を十分に説明します。

最初のシェル関数を作成する

まずは簡単なシェル関数を作成してみましょう。シェル関数は、より大きなスクリプト内のミニスクリプトのようなもので、特定のタスクを実行するコマンドをグループ化することができます。

まず、新しいファイルを作成する必要があります。端末を開き、次のコマンドを入力します。

cd ~/project
touch functions.sh

このコマンドは project ディレクトリに移動し、functions.sh という新しいファイルを作成します。このファイルにはシェル関数が含まれます。

では、最初の関数を追加してみましょう。

#!/bin/bash

## これは簡単な関数です
greet() {
  echo "Hello, World!"
}

## この行は関数を呼び出し(実行)ます
greet

これを分解してみましょう。

  • 最初の行 #!/bin/bash はシェバンと呼ばれます。これはシステムにこのスクリプトを解釈するために bash を使用するように指示します。
  • 関数を greet() { } で定義します。波括弧の中のすべてが関数の一部です。
  • 関数の中では、echo コマンドがあり、"Hello, World!" を出力します。
  • 最後の行 greet は関数を呼び出し(実行)します。

では、スクリプトを実行可能にして実行してみましょう。

chmod +x functions.sh
./functions.sh

次のような出力が表示されるはずです。

Hello, World!

この出力が表示されない場合は、functions.sh ファイル内のコマンドを正しく入力したかどうかを再度確認してください。

パラメータ付きの関数

基本的な関数を作成したので、これにパラメータを追加することでもっと柔軟にしてみましょう。パラメータを使うことで、関数に情報を渡すことができます。

再度 functions.sh ファイルを開き、以下のコードで内容を置き換えます。

#!/bin/bash

## パラメータ付きの関数
greet() {
  echo "Hello, $1!"
}

## 複数のパラメータ付きの関数
calculate() {
  echo "The sum of $1 and $2 is $(($1 + $2))"
}

## 引数付きで関数を呼び出す
greet "Alice"
calculate 5 3

このコードを見てみましょう。

  • greet 関数では、$1 は関数に渡された最初の引数を指します。
  • calculate 関数では、$1$2 はそれぞれ最初と2番目の引数を指します。
  • $(($1 + $2)) は2つのパラメータの算術和を行います。
./functions.sh

次のような出力が表示されるはずです。

Hello, Alice!
The sum of 5 and 3 is 8

この出力が表示されない場合は、ファイルに変更を正しく保存したことを確認してください。

関数からの戻り値

シェル スクリプトでは、他のプログラミング言語と同じように関数から値を返すことはできません。代わりに、キャプチャできる結果を echo するか、グローバル変数を変更することができます。両方の方法を調べてみましょう。

再度 functions.sh を開き、以下のコードで内容を更新します。

#!/bin/bash

## 結果をechoする関数
get_square() {
  echo $(($1 * $1))
}

## グローバル変数を変更する関数
RESULT=0
set_global_result() {
  RESULT=$(($1 * $1))
}

## echoされた結果をキャプチャする
square_of_5=$(get_square 5)
echo "The square of 5 is $square_of_5"

## 関数を使ってグローバル変数を変更する
set_global_result 6
echo "The square of 6 is $RESULT"

これを分解してみましょう。

  • get_square 関数は echo を使って結果を出力し、$() 構文を使ってそれをキャプチャします。
  • set_global_result 関数はグローバル変数 RESULT を変更します。
  • 変数に get_square の出力をキャプチャするために $() を使います。
  • RESULT を変更する set_global_result を呼び出し、その後 RESULT を出力します。

ファイルを保存して実行します。

./functions.sh

次のような出力が表示されるはずです。

The square of 5 is 25
The square of 6 is 36

この出力が表示されない場合は、functions.sh ファイルの誤字を再度確認してください。

変数のスコープを理解する

シェル スクリプトでは、変数はデフォルトでグローバルです。これは、スクリプト内のどこからでもアクセスできることを意味します。ただし、local キーワードを使用して、関数内でのみアクセス可能な変数を作成することができます。これは、ローカル スコープと呼ばれます。

この概念を示すために、functions.sh ファイルを変更しましょう。

以下のコードで内容を更新します。

#!/bin/bash

## グローバル変数
GLOBAL_VAR="I'm global"

## ローカル変数を持つ関数
demonstrate_scope() {
  local LOCAL_VAR="I'm local"
  echo "Inside function: GLOBAL_VAR = $GLOBAL_VAR"
  echo "Inside function: LOCAL_VAR = $LOCAL_VAR"
}

## 関数を呼び出す
demonstrate_scope

echo "Outside function: GLOBAL_VAR = $GLOBAL_VAR"
echo "Outside function: LOCAL_VAR = $LOCAL_VAR"

このスクリプトで起こっていることは次のとおりです。

  • グローバル変数 GLOBAL_VAR を定義します。
  • demonstrate_scope 関数内で、local キーワードを使用してローカル変数 LOCAL_VAR を定義します。
  • 関数内で両方の変数を出力します。
  • 関数を呼び出した後、関数の外で再度両方の変数を出力しようとします。

ファイルを保存して実行します。

./functions.sh

次のような出力が表示されるはずです。

Inside function: GLOBAL_VAR = I'm global
Inside function: LOCAL_VAR = I'm local
Outside function: GLOBAL_VAR = I'm global
Outside function: LOCAL_VAR =

関数の外でアクセスするときに LOCAL_VAR が空であることに注意してください。これは、ローカル変数はそれが定義された関数内でのみアクセス可能であるためです。

高度な関数 - ENGLISH_CALC

シェル関数の基本を学んだので、ここでは ENGLISH_CALC というより高度な関数を作成しましょう。この関数は3つの引数を取ります。2つの数値と演算(足し算、引き算、または掛け算)です。

以下のコードで内容を置き換えます。

#!/bin/bash

ENGLISH_CALC() {
  local num1=$1
  local operation=$2
  local num2=$3
  local result

  case $operation in
    plus)
      result=$((num1 + num2))
      echo "$num1 + $num2 = $result"
      ;;
    minus)
      result=$((num1 - num2))
      echo "$num1 - $num2 = $result"
      ;;
    times)
      result=$((num1 * num2))
      echo "$num1 * $num2 = $result"
      ;;
    *)
      echo "Invalid operation. Please use 'plus','minus', or 'times'."
      return 1
      ;;
  esac
}

## 関数をテストする
ENGLISH_CALC 3 plus 5
ENGLISH_CALC 5 minus 1
ENGLISH_CALC 4 times 6
ENGLISH_CALC 2 divide 2 ## これはエラーメッセージを表示するはずです

この関数を分解してみましょう。

  • 入力と結果を保存するために local 変数を使用しています。これは、グローバル変数と干渉しないようにするための良い慣例です。
  • 異なる演算を処理するために case 文を使用しています。これは他の言語の switch 文に似ています。
  • 各有効な演算に対して、計算を行い結果を echo します。
  • 無効な演算が指定された場合、エラーメッセージを echo して1を返します(シェルスクリプトでは、ゼロ以外の戻り値はエラーを示します)。
  • 最後に、有効でない演算を含むさまざまな入力で関数をテストします。

ファイルを保存して実行します。

./functions.sh

次のような出力が表示されるはずです。

3 + 5 = 8
5 - 1 = 4
4 * 6 = 24
Invalid operation. Please use 'plus','minus', or 'times'.

この出力が表示されない場合は、functions.sh ファイルの誤字を再度確認してください。

まとめ

この実験では、Linuxにおけるシェル関数を、基本的なものからより高度な概念まで探索しました。以下のことを学びました。

  1. 単純な関数を作成して呼び出す方法
  2. 関数のパラメータを使う方法
  3. echo とグローバル変数を使って関数から値を返す方法
  4. 変数のスコープを理解し、ローカル変数を使う方法
  5. 算術演算を処理するより複雑な関数を作成する方法

シェル関数は、より組織的で効率的で再利用可能なコードを書くのに役立つ強力なツールです。複雑なスクリプトを小さくて管理しやすいピースに分解することができ、スクリプトを理解して保守するのを容易にします。

シェル関数をマスターすることで、Linux環境でより洗練されたシェルスクリプトを書き、複雑なタスクをより効果的に自動化することができます。覚えておいてください、練習がシェルスクリプトに精通する鍵です。作成した関数を変更したり、独自の関数を作成して、Linuxの作業で遭遇する特定の問題を解決してみてください。