はじめに
この実験では、Linux シェルスクリプトにおける入力読み取りについて紹介します。入力読み取りは、ユーザー入力に応答できる対話型シェルスクリプトを作成するための基本的なスキルです。read コマンドの使い方を学ぶことで、ユーザーが入力したデータを収集して処理することができ、スクリプトをより汎用的で使いやすいものにすることができます。
この実験では、ユーザー入力を読み取る方法、スクリプト内でその入力を処理する方法、および異なるユーザー入力に動的に応答できる対話型シェルスクリプトを作成する方法を学びます。これらのスキルは、Linux 環境で効果的なコマンドラインツールやスクリプトを作成するために不可欠です。
基本的な入力読み取り
read コマンドは、標準入力(通常はキーボード)から 1 行の入力を読み取り、それを変数に割り当てるシェルの組み込みコマンドです。これにより、スクリプトはユーザー入力を受け取り、処理することができます。
このステップでは、ユーザー入力を読み取り、それをユーザーに表示する簡単なスクリプトを作成します。
まず、プロジェクトディレクトリにいることを確認します。
cd /home/labex/projectinput_reader.shという名前の新しいスクリプトファイルを作成します。touch input_reader.shスクリプトを実行可能にします。
chmod +x input_reader.shnano テキストエディタを使用してスクリプトファイルを開きます。
nano input_reader.shスクリプトに以下のコードを追加します。
#!/bin/bash ## A simple script to demonstrate basic input reading echo "Please enter your name:" read name echo "Hello, $name! Welcome to Linux input reading."このスクリプトは以下のように動作します。
- シェバン (
#!/bin/bash) で始まり、このスクリプトが bash を使って実行されることを指定します。 - ユーザーの名前を尋ねるプロンプトを表示します。
readコマンドを使ってユーザーが入力した内容を取得し、nameという変数に格納します。- ユーザーが入力した名前を含む挨拶を表示します。
- シェバン (
Ctrl+Oを押してファイルを保存し、Enterを押してファイル名を確認し、Ctrl+Xを押して nano を終了します。スクリプトを実行してテストします。
./input_reader.sh次のような出力が表示されるはずです。
Please enter your name: John Hello, John! Welcome to Linux input reading.実際の出力には、"John" の代わりにあなたが入力した名前が表示されます。
read コマンドはユーザー入力を待ち、それを 1 つまたは複数の変数に格納します。この例では、入力は name という単一の変数に格納されました。後で、1 つの read コマンドで複数の入力を取得する方法を学びます。
ループとともに read を使用する
このステップでは、特定の終了条件が満たされるまでループを使って入力を継続的に読み取るようにスクリプトを拡張します。このパターンは、ユーザーから複数の情報を収集する必要がある対話型スクリプトで一般的に使用されます。
スクリプトを編集用に開きます。
nano input_reader.sh既存の内容を以下のコードに置き換えます。
#!/bin/bash ## Enhanced script with a loop for multiple inputs echo "Enter multiple inputs (type 'exit' to quit):" while true; do ## Prompt for input echo -n "> " read input ## Check if user wants to exit if [[ "$input" == "exit" ]]; then echo "Exiting the input reader." break fi ## Process the input echo "You entered: $input" done echo "Thank you for using the input reader!"このスクリプトは以下のように動作します。
while trueループを使用して、入力を受け付け続ける無限ループを作成します。echo -nを使用して改行を防止し、各入力の前にプロンプト (>) を表示します。- ユーザー入力を
input変数に読み込みます。 - 入力が "exit" であるかどうかを確認し、その場合はループを抜けます。
- それ以外の場合は、入力内容をユーザーにエコーバックします。
- 最後に、ループを抜けた後に感謝のメッセージを表示します。
Ctrl+Oを押してファイルを保存し、Enterを押してファイル名を確認し、Ctrl+Xを押して nano を終了します。拡張されたスクリプトを実行します。
./input_reader.sh次のような出力が表示されるはずです。
Enter multiple inputs (type 'exit' to quit): > hello You entered: hello > world You entered: world > exit Exiting the input reader. Thank you for using the input reader!
このループ構造は、簡単なコマンドラインインターフェースやデータ入力ツールを構築する場合など、複数の入力を順次処理する必要があるときに特に有用です。break 文は、ユーザーが "exit" と入力したときにループを抜けるために使用されますが、必要に応じて任意の条件でループを抜けるように条件を変更することができます。
プロンプトとデフォルト値を使用した入力読み取り
このステップでは、入力にデフォルト値を設定し、-p オプションを使用してよりクリーンなプロンプトを作成する方法を学びます。これは、ユーザーに Enter キーを押すだけで提案された値を受け入れるオプションを提供したい場合に便利です。
スクリプトを編集用に開きます。
nano input_reader.sh既存の内容を以下のコードに置き換えます。
#!/bin/bash ## Script demonstrating read with default values ## Using -p flag for prompt and providing default with || operator read -p "Enter your country (default: USA): " country country=${country:-USA} echo "Country set to: $country" ## Another example with a default value read -p "Enter your preferred programming language (default: Bash): " language language=${language:-Bash} echo "Programming language set to: $language" ## Combining with a timeout using -t option echo "Quick response needed:" read -t 5 -p "What is your favorite color? (You have 5 seconds, default: Blue): " color color=${color:-Blue} echo "Favorite color set to: $color"このスクリプトは以下のように動作します。
-pフラグを使用して、同じreadコマンド内でプロンプトを表示し、コードをより簡潔にします。${variable:-default}構文を適用して、ユーザー入力が空の場合にデフォルト値を設定します。-tオプションを示しており、これは入力のタイムアウトを設定します(この例では 5 秒)。
Ctrl+Oを押してファイルを保存し、Enterを押してファイル名を確認し、Ctrl+Xを押して nano を終了します。スクリプトを実行してテストします。
./input_reader.sh以下のシナリオを試してみてください。
- プロンプトが表示されたら国名を入力し、Enter キーを押します。
- 何も入力せずに Enter キーを押して、デフォルト値を受け入れます。
- タイムアウトの例では、5 秒以上待って何が起こるかを確認してみます。
デフォルト値を受け入れた場合の出力例:
Enter your country (default: USA): Country set to: USA Enter your preferred programming language (default: Bash): Programming language set to: Bash Quick response needed: What is your favorite color? (You have 5 seconds, default: Blue): Favorite color set to: Blue
read の -p オプションを使用すると、同じコマンド内でプロンプトを提供でき、スクリプトをよりクリーンで読みやすくします。${variable:-default} 構文は強力なシェル機能で、変数が設定されていないか空の場合にデフォルト値を代入します。これは、スクリプトでデフォルトオプションを提供するのに最適です。
安全な入力と複数の変数の読み取り
この最後のステップでは、2 つの高度なテクニックを学びます。
文字を画面に表示せずに安全な入力(パスワードなど)を読み取る
単一の
readコマンドで複数の変数を読み取るスクリプトを編集用に開きます。
nano input_reader.sh既存の内容を以下のコードに置き換えます。
#!/bin/bash ## Script demonstrating secure input and multiple variable reading ## Secure input reading with -s flag (no echo) echo "Secure Input Example:" read -p "Username: " username read -s -p "Password: " password echo ## Add a newline after password input echo "Username entered: $username" echo "Password length: ${#password} characters" ## Reading multiple variables at once echo -e "\nMultiple Variable Example:" read -p "Enter first name, last name, and age (separated by spaces): " first_name last_name age echo "First name: $first_name" echo "Last name: $last_name" echo "Age: $age" ## Reading with a custom delimiter echo -e "\nCustom Delimiter Example:" read -p "Enter comma-separated values: " -d "," value1 echo ## Add a newline echo "First value before comma: $value1" echo -e "\nThank you for completing this lab on Linux input reading!"このスクリプトは以下のことを行います。
readコマンドで-sフラグを使用して、入力を隠します(パスワードやその他の機密情報に便利)。readコマンドに複数の変数名を指定することで、1 行の入力から複数の変数を読み取る方法を示します。-dフラグを使用して、カスタム区切り文字(デフォルトの改行文字の代わり)を指定する方法を示します。
Ctrl+Oを押してファイルを保存し、Enterを押してファイル名を確認し、Ctrl+Xを押して nano を終了します。スクリプトを実行してテストします。
./input_reader.sh出力例(入力内容は異なります):
Secure Input Example: Username: john_doe Password: Username entered: john_doe Password length: 8 characters Multiple Variable Example: Enter first name, last name, and age (separated by spaces): John Doe 30 First name: John Last name: Doe Age: 30 Custom Delimiter Example: Enter comma-separated values: test, First value before comma: test Thank you for completing this lab on Linux input reading!
パスワードのような機密情報を扱う際には、セキュリティが重要です。-s フラグを使用することで、入力した文字が画面に表示されないようになります。パスワードの例では、スクリプトはパスワードの長さのみを表示して検証し、実際のパスワードは表示しないことに注意してください。
一度に複数の変数を読み取ることで、スクリプトをより効率的かつユーザーフレンドリーにすることができます。read コマンドに複数の変数名を指定すると、入力は IFS(Internal Field Separator、内部フィールド区切り文字)環境変数に基づいて分割されます。IFS のデフォルトは空白文字(スペース、タブ、改行)です。
-d フラグを使用すると、入力の終了を示す区切り文字を変更することができます。デフォルトでは、read は改行文字(Enter キーを押したとき)で入力を停止しますが、例のようにカンマなどの任意の文字に変更することができます。
まとめ
この実験では、Linux の bash スクリプトでユーザー入力を読み取り、処理するための重要なテクニックを学びました。
基本的な入力読み取り:
readコマンドを使用して、ユーザー入力を変数に格納します。ループによる入力:特定の条件が満たされるまで入力を継続的に読み取るために、ループを実装します。
デフォルト値とプロンプト:入力にデフォルト値を設定し、インラインプロンプトを使用してよりクリーンなスクリプトを作成します。
高度なテクニック:入力を画面に表示せずに安全に読み取り、単一のコマンドで複数の変数を取得し、カスタム区切り文字を使用します。
これらの入力読み取りスキルは、ユーザー入力に適応し、適切なデフォルト値を提供し、さまざまな種類のデータを処理できる対話型シェルスクリプトを作成するための基礎です。これらのテクニックを適用して、より応答性が高くユーザーフレンドリーなコマンドラインツールやスクリプトを作成することができます。
Linux のスキルをさらに向上させるにあたり、これらの入力読み取り方法を条件文、関数、ファイル操作などの他の bash 機能と組み合わせて、自動化やシステム管理のためのより複雑で強力なツールを作成することを検討してください。



