Bashには、コマンドラインまたはシェルスクリプトで使用できる多数の組み込みコマンドが付属しています。
この記事では、組み込みの read
について説明します。 コマンド。
読み取り
ビルトイン#
読むコード> は、標準入力(またはファイル記述子)から行を読み取り、その行を単語に分割するbash組み込みコマンドです。最初の単語は名に割り当てられ、2番目の単語は2番目の名前に割り当てられます。
read
の一般的な構文 ビルトインは次の形式を取ります:
read [options] [name...]
コマンドがどのように機能するかを説明するには、ターミナルを開き、 read var1 var2
と入力します。 、「Enter」を押します。コマンドは、ユーザーが入力を入力するのを待ちます。 2つの単語を入力して、「Enter」を押します。
read var1 var2
Hello, World!
単語は、 read
に渡される名前に割り当てられます 引数としてのコマンド。 echo
を使用する またはprintf
確認するには:
echo $var1
echo $var2
Hello,
World!
ターミナルで入力する代わりに、標準入力を read
に渡すことができます パイピング、here-string、heredocなどの他の方法を使用する:
echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")
読むコード> およびecho
括弧で囲まれ、同じサブシェルで実行されます。Hello,
World!
here文字列とprintf
を使用した例を次に示します。 :
read -r var1 var2 <<< "Hello, World!"
printf "var1: %s \nvar2: %s\n" "$var1" "$var2"
Var1: Hello,
Var2: World!
read
に引数が指定されていない場合 コマンドを実行すると、行全体が REPLY
に割り当てられます。 変数:
echo "Hello, world!" | (read; echo "$REPLY")
Hello,
World!
read
に提供された引数の数の場合 入力から読み取られた単語の数よりも大きい場合、残りの単語は名前に割り当てられます:
echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")
Var1: Linux
Var2: is awesome.
それ以外の場合、引数の数が名前の数より少ない場合、残りの名前に空の値が割り当てられます。
echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3")
Var1: Hello,
Var2: World!
Var3:
デフォルトでは、 read
バックスラッシュをエスケープ文字として解釈します。これにより、予期しない動作が発生する場合があります。バックスラッシュのエスケープを無効にするには、 -r
を指定してコマンドを呼び出します。 オプション。
以下は、 read
の例です。 -r
の有無にかかわらず呼び出されたときに機能します オプション:
read <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, tWorld!
read -r <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, \tWorld!
通常、常に read
を使用する必要があります -r
を使用 オプション。
区切り文字の変更#
read
のデフォルトの動作 1つ以上のスペース、タブ、および改行を区切り文字として使用して、行を単語に分割することです。別の文字を区切り文字として使用するには、その文字を IFS
に割り当てます。 変数(内部フィールドセパレーター)。
echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
IFS
の場合 スペースまたはタブ以外の文字に設定されている場合、単語は1文字だけで区切られます:
echo "Linux::is:awesome." | \
(IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3 \nVar4: $var4")
行は4つの単語で区切られます。 2番目の単語は、区切り文字間のセグメントを表す空の値です。これは、2つの区切り文字を並べて使用したために作成されました( ::
。
Var1: Linux
Var2:
Var3: is
Var4: awesome.
複数の区切り文字を使用して行を分割できます。複数の区切り文字を指定する場合は、文字を IFS
に割り当てます。 それらの間にスペースを入れずに変数。
_
を使用した例を次に示します。 -コード> 区切り文字として:
echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
プロンプト文字列#
インタラクティブなbashスクリプトを作成するときは、 read
を使用できます。 ユーザー入力を取得するコマンド。
プロンプト文字列を指定するには、 -p
を使用します オプション。プロンプトは、 read
の前に出力されます 実行され、改行は含まれません。
簡単な例を次に示します。
read -r -p "Are you sure?"
通常、 read
を使用します while
内のコマンド ループして、ユーザーに期待される答えの1つを与えるように強制します。
以下のコードは、システムの再起動をユーザーに促します:
while true; do
read -r -p "Do you wish to reboot the system? (Y/N): " answer
case $answer in
[Yy]* ) reboot; break;;
[Nn]* ) exit;;
* ) echo "Please answer Y or N.";;
esac
done
シェルスクリプトがユーザーにパスワードなどの機密情報の入力を求める場合は、 -s
を使用します read
を指示するオプション 端末に入力を出力しないようにします:
read -r -s -p "Enter your password: "
単語を配列に割り当てる#
変数名の代わりに単語を配列に割り当てるには、 read
を呼び出します。 -a
を使用したコマンド オプション:
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
Linux
is
awesome.
配列と変数名の両方を指定すると、すべての単語が配列に割り当てられます。
結論#
read
コマンドは、入力行を単語に分割するために使用されます。
Linux