我只為少數人制作生日跟蹤器,并且想知道如何將所有 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..),但不知道如何將它用于多個日期和名稱。或者如果有任何更好的方法,那也很高興知道。
uj5u.com熱心網友回復:
使用案例:
...
case "$date" in
"Sep-09") name=abc;;
"Oct-11") name=xyz;;
...
*) exit;; # if no condition met
esac
echo "Happy Birthday $name!"
uj5u.com熱心網友回復:
您可以在此處使用地圖/字典資料結構。您可以在此處查看示例:如何在 Bash 中定義哈希表?
uj5u.com熱心網友回復:
您可以將您的生日存盤在一個文本檔案中,并使用 和 讀取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
./checkbirthdays.sh9月8日輸出:
Happy Birthday John Smith!
uj5u.com熱心網友回復:
假設您有bash4.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
請注意,如果有多個名字與給定的生日相關聯,則此版本祝賀所有生日的人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505662.html
