먼저 저는 다음과 같은 파일을 만들었습니다.전화포함하다:
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(이후 이름)에서 각 값을 가져와 한 번에 하나씩 반복합니다. 그런 다음 각 이름은 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)"