我只为少数人制作生日追踪器,我想知道如何将所有if语句组合成一个,因为日期和名称是每个if语句中唯一不同的东西,其余的都是相同的格式。
date=`date +%b-%d`
echo $date
if [ $date == "Sep-09" ]; then
echo "Happy Birthday abc!"
fi
if [ $date == "Oct-11" ]; then
echo "Happy Birthday xyz!"
fi
.
.
.
我想我可以使用位置参数(日期为1美元,名称为2美元(,但不知道如何将其用于多个日期和名称。或者,如果有更好的方法,那也很好知道。
用例:
...
case "$date" in
"Sep-09") name=abc;;
"Oct-11") name=xyz;;
...
*) exit;; # if no condition met
esac
echo "Happy Birthday $name!"
您可以在此处使用映射/字典数据结构。您可以在这里查看示例:如何在Bash中定义哈希表?
您可以将生日存储在文本文件中,并使用while
和read
读取。
read
可以让你读入一个或多个变量,如果单词比变量多,它会将所有剩余的单词填充到最后一个变量中,所以当人名可能是多个单词时,在这里使用它是完美的:
help read
与分词一样,行被拆分为多个字段,第一个单词被分配给第一个NAME,第二个单词被指定给第二个NAME,依此类推,所有剩余的单词都被分配给最后一个NAME。只有在$IFS中找到的字符才能被识别为单词分隔符。
我还建议使用日期格式+%m-%d
而不是+%b-%d
,因为这意味着文件中的日期将按顺序排列(例如,您可以运行sort birthdays.txt
以按生日顺序查看每个人,如果月份由3个字母表示,则无法执行此操作(。
birthdays.txt
:
09-08 John Smith
10-11 Alice
checkbirthdays.sh
:
#!/bin/bash
nowdate="$(date +%m-%d)"
(
while read checkdate name ; do
if [ "$nowdate" = "$checkdate" ] ; then
echo "Happy Birthday $name!"
fi
done
) < birthdays.txt
9月8日./checkbirthdays.sh
的输出:
Happy Birthday John Smith!
假设您有bash
4.0或更新版本,并且名称不包含空格或glob字符,则使用关联数组将适合此任务:
#!/bin/bash
declare -A birthday_to_names=(
['Sep-09']='abc def'
['Oct-11']='xyz'
)
names=${birthday_to_names[$(date +%b-%d)]}
[[ $names ]] && printf 'Happy Birthday %s!n' $names
请注意,如果有多个名字与给定的生日相关,则此版本会祝贺所有生日人员。