読み取りコマンド

使用法

場合によっては、スクリプトは実行中にユーザーから何らかのデータを提供する必要があります。この場合、「read」コマンドを使用できます。ユーザーの入力を変数に保存して、後続のコードで簡単に使用できるようにします。ユーザーがEnterキーを押すと入力が完了します。

readコマンドのフォーマットは以下の通りです。

読み取り [-オプション] [変数...]

上記の構文では、「options」はパラメータ オプション、「variable」は入力値を保存するために使用される 1 つ以上の変数名です。変数名が指定されていない場合、環境変数 REPLY にはユーザーが入力したデータの行全体が含まれます。

以下は demo.sh の例です。

#!/bin/bash

echo -n "テキストを入力してください > "
テキストを読む
echo "あなたの入力: $text"

上の例では、最初にプロンプ​​ト テキストの行が表示され、ユーザーがテキストを入力するのを待ちます。ユーザーが入力したテキストは変数 text に保存され、次の行に表示されます。

$ bash デモ.sh
テキストを入力 > Hello world
あなたの入力: こんにちは、世界

「read」はユーザーが入力した複数の値を受け入れることができます。

#!/bin/bash
echo あなたの姓と名を入力してください
FN LNを読む
エコー「こんにちは!$LN$FN!」

上記の例では、「read」はユーザー入力に基づいて同時に 2 つの変数に値を割り当てます。

ユーザー入力が「read」コマンドで指定された変数の数より少ない場合、追加の変数値は空になります。ユーザーが定義された変数を超えて入力した場合、追加の入力は最後の変数に含まれます。

read コマンドの後に変数名が定義されていない場合、環境変数 REPLY にはすべての入力が含まれます。

#!/bin/bash
# read-single: 複数の値をデフォルト変数に読み込みます
echo -n "1 つ以上の値を入力してください> "
読む
エコー「REPLY = '$REPLY'

上記のスクリプトを実行した結果は次のようになります。

$ リードシングル
1 つ以上の値を入力 > a b c d
返信 = 'a b c d'

キーボード入力の読み取りに加えて、「read」コマンドを使用してファイルを読み取ることもできます。

#!/bin/bash

ファイル名='/etc/hosts'

マイラインを読みながら
する
  「$myline」をエコーする
完了 < $filename

上の例では、「read」コマンドを使用してファイルの内容を読み取ります。 done コマンドの後の指示文字 < は、ファイルの内容を read コマンドに指示します。このコマンドは一度に 1 行を読み取り、ファイルが読み取られるまで変数 myline に保存します。

パラメータ

readコマンドのパラメータは以下の通りです。

(1)-t パラメータ

「read」コマンドの「-t」パラメータは、タイムアウトの秒数を設定します。指定された時間が経過してもユーザーが何も入力しない場合、スクリプトは待機をあきらめて実行を続行します。

#!/bin/bash

echo -n "テキストを入力してください > "
-t 3 応答を読み取る場合。
  echo "ユーザーはすでに入力しています"
それ以外
  echo "ユーザーが入力しませんでした"
フィ

上記の例では、入力コマンドは 3 秒待機します。この時間が経過してもユーザーが入力しない場合、コマンドは実行に失敗します。 if はコマンドの戻り値に基づいて else コード ブロックに転送し、実行を継続します。

環境変数 TMOUT も同じ役割を果たすことができ、read コマンドがユーザー入力を待つ時間 (秒単位) を指定します。

$TMOUT=3
$読み取り応答

上記の例でも、ユーザーがまだ入力していない場合は 3 秒待機します。

(2)-p パラメータ

-p パラメータは、ユーザー入力のプロンプト情報を指定します。

read -p "1 つ以上の値を入力してください> "
エコー「REPLY = '$REPLY'

上記の例では、最初に「1 つ以上の値を入力してください >」が表示され、その後ユーザーの入力が受け入れられます。

(3)-パラメータ

-a パラメータは、ユーザーの入力を位置 0 から始まる配列に割り当てます。

$ read -a 人々
ドードー公爵夫人アリス
$ echo ${人[2]}
ドードー

上の例では、ユーザー入力は配列 people に割り当てられ、この配列の 2 番目のメンバーは dodo です。

(4)-nパラメータ

-n パラメータは、行全体を読み取るのではなく、数文字だけを変数値として読み取るように指定します。

$ 読み取り -n 3 文字
abcdefghij
$エコー$レター
ABC

上の例では、変数 letter には 3 文字だけが含まれています。

(5)-e パラメータ

-e パラメータを使用すると、ユーザーは入力時にオートコンプリートなど、readline ライブラリによって提供されるショートカット キーを使用できるようになります。特定のショートカット キーについては、「行の操作」の章を参照してください。

#!/bin/bash

echo ファイルへのパスを入力してください:

read -e ファイル名

エコー $ファイル名

上の例では、「read」コマンドはユーザーが入力したファイル名を受け入れます。このとき、ユーザーは Tab キーのファイル名の「オートコンプリート」機能を使いたいと思うかもしれませんが、read コマンドの入力はデフォルトでは readline ライブラリの機能をサポートしていません。 -e パラメータを使用すると、ユーザーはオートコンプリートを使用できるようになります。

(6)その他のパラメータ

  • -d delimiter: 文字列 delimiter の最初の文字を、改行文字ではなくユーザー入力の終わりとして定義します。
  • -r: raw モード。ユーザーが入力したバックスラッシュ文字がエスケープ文字として解釈されないことを示します。
  • -s: ユーザーの入力を画面に表示しません。これは、パスワードや機密情報を入力するためによく使用されます。
  • -u fd: ファイル記述子 fd を入力として使用します。

IFS 変数

「read」コマンドで読み取られる値はデフォルトではスペースで区切られています。分離フラグは、環境変数 IFS (Internal Field Separator の略) をカスタマイズすることで変更できます。

IFS のデフォルト値はスペース、タブ記号、または改行記号で、通常は最初の記号 (つまりスペース) です。

「IFS」をコロン (:) またはセミコロン (;) として定義すると、これら 2 つの記号で区切られた値を区切ることができ、ファイルの読み取りに便利です。

#!/bin/bash
# read-ifs: ファイルからフィールドを読み取ります

FILE=/etc/passwd

read -p "ユーザー名を入力してください > " user_name
file_info="$(grep "^$user_name:" $FILE)"

if [ -n "$file_info" ];
  IFS=":" ユーザーのパスワードを読み取ります。 uid gid 名 ホーム シェル <<< "$file_info"
  echo "ユーザー = '$user'"
  エコー「UID = '$uid'」
  エコー「GID = '$gid'echo "フルネーム = '$name'"
  echo "ホームディレクトリ = '$home'"
  echo "シェル = '$shell'"
それ以外
  echo "そのようなユーザー '$user_name' はありません" >&2
  出口1
フィ

上の例では、「IFS」はコロンに設定されており、これは「/etc/passwd」ファイル内の行を分解するために使用されます。 IFS の割り当てコマンドと read コマンドを 1 行で記述した場合、IFS の変更は以下のコマンドにのみ有効になります。コマンド実行後、IFS は自動的に復元されます。元の値。 1行に記載しない場合は以下の記載方法となります。

OLD_IFS="$IFS"
IFS=":"
読み取りユーザー pw uid gid 名ホーム シェル <<< "$file_info"
IFS="$OLD_IFS"

さらに、上記の例では、「read」コマンドは標準入力のみを解析できるため、「<<<」は変数値を標準入力に変換するために使用される Here 文字列です。

IFS が空の文字列に設定されている場合、それは行全体を変数に読み取ることと同じです。

#!/bin/bash
input="/パス/への/txt/ファイル"
while IFS= read -r line
する
  「$line」をエコーする
完了 < "$input"

上記のコマンドは、ファイルを 1 行ずつ読み取り、各行を変数 line に保存し、出力した後に次の行を読み取ることができます。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0