まず、私は次のようなファイルを作成しました。電話含む:
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)は変数に保存されます。cut
telephone
$number
テスト
次のスクリプトを使用して、スクリプトが機能してファイルのデータを使用しているかどうかをテストできますtelephone
。
$ while read -r i ;do
echo "-----"
echo "Test \"$i\""
./cmd.bash <<<$i
echo "-----"
done < <(cut -d';' -f1 telephone)
上記のコマンドはファイルの内容を読み取り、telephone
セミコロンで分割し、;
フィールド1(以降の名前)から各値を取得し、一度に1つずつ繰り返します。その後、各名前はcmd.bash
STDIN(別名)を介してスクリプトに渡されます。<<<$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)"