読み取りコマンド
使用法
場合によっては、スクリプトは実行中にユーザーから何らかのデータを提供する必要があります。この場合、「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