ファイルからユーザー名を検索し、ユーザーの電話番号を出力します。

ファイルからユーザー名を検索し、ユーザーの電話番号を出力します。

まず、私は次のようなファイルを作成しました。電話含む:

Jan;032569874    
Annemie;014588529    
Hans;015253694    
Stefaan;011802367

今私がすべきことは、ユーザーが名前を入力し、出力が次のようになるスクリプトを作成することです。

The phone number of Jan is 032569874

私はたくさん試してみましたが、期待どおりに動作するものはありません。私はこれが非常に簡単な質問であることを知っていますが、そうすることはできません。

まあ、あなたは、これらの答えは明らかにより高いレベルから来ています。これが私が得るものです:

#!/bin/bash
#Solution script2

IFS=";"

echo "Whose phone number do you want to know?"
read name
read name number <$1
echo "The phone number of $name is $number."

答え1

以下は、大まかに修正されたスクリプトバージョンです。

$ more cmd.bash 
#!/bin/bash

echo "Whose phone number do you want to know?"
read name
number=$(grep "$name" telephone | cut -d';' -f2)
echo ''
echo "The phone number of $name is $number."

仕組みは次のとおりです。

$ ./cmd.bash 
Whose phone number do you want to know?
Hans

The phone number of Hans is 015253694.

どのように動作しますか?

コマンドだけで名前を取得し、read name変数に入力した内容を保存します$name。次に、ファイル全体をgrepし、ファイルの結果行をtelephoneセミコロンを区切り文字として使用して2つのフィールドに分割します。電話番号(フィールド2)は変数に保存されます。cuttelephone$number

テスト

次のスクリプトを使用して、スクリプトが機能してファイルのデータを使用しているかどうかをテストできますtelephone

$ while read -r i ;do 
    echo "-----"
    echo "Test \"$i\""
    ./cmd.bash <<<$i
    echo "-----"
  done < <(cut -d';' -f1 telephone)

上記のコマンドはファイルの内容を読み取り、telephoneセミコロンで分割し、;フィールド1(以降の名前)から各値を取得し、一度に1つずつ繰り返します。その後、各名前はcmd.bashSTDIN(別名)を介してスクリプトに渡されます。<<<$i。これは、各名前に対するユーザー入力をシミュレートします。

$ while read -r i ;do echo "-----"; echo "Test \"$i\""; \
    ./cmd.bash <<<$i; echo "-----"; done < <(cut -d';' -f1 telephone)
-----
Test "Jan"
Whose phone number do you want to know?

The phone number of Jan is 032569874.
-----
-----
Test "Annemie"
Whose phone number do you want to know?

The phone number of Annemie is 014588529.
-----
-----
Test "Hans"
Whose phone number do you want to know?

The phone number of Hans is 015253694.
-----
-----
Test "Stefaan"
Whose phone number do you want to know?

The phone number of Stefaan is 011802367.
-----

答え2

使用awk:

#!/usr/bin/awk -f
BEGIN { FS=";" } $1 ~ name { print "The number of " name " is " $2 }
phones -v name=Jan telephone                                      
The number of Jan is 032569874

答え3

name="jan"
line="$(grep -i ^"$name" file)"
if [ -n "$line" ]; then
  number="${line#*;}"
  echo "The phone number of ${name} is ${number}"
else
  echo "There is no phone number for ${name}."
fi 

答え4

grep通知と一緒にコマンドを\k使用します。リバース主張:

$ read name; echo "The phone number of $name is $(grep -oP "$name;\K.*" telephone)"
  Jan                                  #Input
  The phone number of Jan is 032569874 #Output

-P以前に一致した文字を無視するための(perl-regexp)引数を使用してgrepをサポートします\K(名前とセミコロンを無視する;)。

-o, --only-matching:一致する行に一致する(空でない)部分のみを印刷します。

$(command)「コマンドの置き換え」を使用すると、コマンド出力を介してコマンドの名前を変更できます。

あるいは、niftyの代わりにLookbehindアサーションを使用することもできます\K

$ read name; echo "The phone number of $name is $(grep -oP "(?<=$name;).*" telephone)"

関連情報