2015-11-04 120 views
0

是否有方法使用$ date +%u找出某一特定日期的星期幾號?我將在預測估計時使用這條線。如何使用日期+%u與給定的一天來查找星期幾號

例如:

DOW=Monday 
day_no=`date "$DOW" +%u` # Should output 1 
echo "$DOW is $day_no"  

或者我應該只使用如果或情況的方法:

if [ "$DOW" == "Monday" ] 
then 
    day_no=1 
elif [.....] 
then 
.... 

第一種方法是3行,則如果或情況的方法將是20+線。

我正在使用Bash。

回答

1

如果傳遞$DOW-d標誌,它讀取的時間說明進行格式化,它會給你想要的東西:

day_no=$(date -d "$DOW" +%u) 

注意,這將1代星期一,7至週日。

+0

這適用於Linux,但不適用於OSX或FreeBSD。 OP沒有提到他的操作系統 - 生成便攜式答案很重要。 – ghoti

0

許多方法來實現這一點。

如果你想使用特定於bash的東西,我會建議一個數組。在bash 4,關聯數組可以使用這樣的:

declare -A days='([Monday]="1" [Tuesday]="2" etc...)' 

DOW="Monday" 

day_no=${days[$DOW]} 

如果在bash 3(在OSX例如)的時候,可能必須通過非關聯數組滾動。

declare -a days='([1]="Monday" [2]="Tuesday" etc...)' 

DOW="Monday" 

for _ in "${!days[@]}"; do 
    if [ "${days[$_]}" = "$DOW" ]; then 
    day_no=$_ 
    break 
    fi 
done 

如果你想用date命令來處理這個問題,是要知道你所使用的平臺是很重要的,因爲date在不同的操作系統具有不同的行爲。以下可能爲你工作:

case $(uname -s) in 
    Linux)  day_no=$(date -d "$DOW" '+%u') ;; 
    *BSD|Darwin) day_no=$(date -j -f '%A' "$DOW" '+%u') ;; 
    *) 
    echo "ERROR: I don't know how to do this in $(uname -s)." >&2 
    exit 1 
    ;; 
esac 

注意的是,基於陣列的解決方案威力的一個很可能是比需要調用外部程序(date)的解決方案更快。

相關問題