首先我制作了一个名为电话包含:
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
,然后使用分号作为分隔符将cut
文件中的结果行拆分为 2 个字段。telephone
电话号码(字段 2)存储在变量 中$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)
“命令替换”允许命令的输出替换命令名称。
或者您可以使用 Lookbehind 断言代替 nifty \K
。
$ read name; echo "The phone number of $name is $(grep -oP "(?<=$name;).*" telephone)"