2016-02-23 49 views
-2

嗨我有一項任務,需要用戶輸入他們的出生日期。 從一開始,我需要讓用戶輸入他們的出生日期。 假設輸入的日期是「20050215」,我怎樣才能將它分成3個參數? (2005年02月15日) 我還需要爲用戶有其他選項輸入這樣的生日 「-y 2005 -m 02 -d 15」 請幫助我。 您的幫助將不勝感激。將日期分成3個參數的Bash shell腳本?

回答

3

Bash提供出色的字符串索引,讓您只需做你的需要:

bdate=20050215 

year=${bdate:0:4} 
mon=${bdate:4:2} 
day=${bdate:6:2} 

格式爲${var:start:length}如果你需要從年底抵消,那麼你要麼離開空格開始之前(例如${var: -2:1}旁邊的最後一個字符),或者將括號中的負偏移量括起來(例如${var:(-2):1} - 對於最後一個字符旁邊的相同)。

您可以創建一個小的腳本,需要輸入沒有太大的問題:

#!/bin/bash 

printf "enter birthdate (yyyymmdd): " 
read bdate 

[ "${#bdate}" -ne "8" ] && { 
    printf "error: invalid length of date entered.\n" 
    exit 1 
} 

[[ ${bdate} =~ [^0-9] ]] && { 
    printf "error: non digit in date entered.\n" 
    exit 1 
} 

year=${bdate:0:4} 
mon=${bdate:4:2} 
day=${bdate:6:2} 

printf "date entered: %s\n\n" "$bdate" 
printf " year : %s\n" "$year" 
printf " month : %s\n" "$mon" 
printf " day : %s\n\n" "$day" 

示例使用/輸出

$ bash ymd_split.sh 
enter birthdate (yyyymmdd): 20050215 
date entered: 20050215 

    year : 2005 
    month : 02 
    day : 15 


$ bash ymd_split.sh 
enter birthdate (yyyymmdd): 1234567 
error: invalid length of date entered. 


$ bash ymd_split.sh 
enter birthdate (yyyymmdd): 1234567a 
error: non digit in date entered. 
+0

非常感謝,您的建議確實有幫助。讚賞:) –

+0

當然,很高興我能幫上忙。現在確保你理解這一切,如果你有問題,就問。這些測試就是所謂的*複合命令*。它們被用作上面的一個簡短的'if'(它只是節省了編寫整個'if if else fi'。確保你理解'['和'[[''條件語句之間的區別,當引用是/在他們內部是不需要的,等等。在短小的腳本中有很多事情要做。祝你好運,你的腳本.bash,zsh等腳本是一種非常有用的編程形式。 –

+0

是的,我是對於這件事來說,這是一個相當新的東西,所以我沒有完全理解這個概念,但是我很高興你能幫上忙,最好的祝願 –

0

因爲你不想自己驗證日期(即閏年),您應該使用date

bdate=20160229 
d=$(date --date="$bdate" +%d) 
m=$(date --date="$bdate" +%m) 
y=$(date --date="$bdate" +%Y) 
+0

爲什麼要三個單獨的日期調用,而不是僅僅在用'read'來分割結果?即。 'read d m y <<(date -d「$ bdate」'+%d%m%y')''。效率更高;執行外部呼叫*費用很高* –

+0

...如果您保證bash 4.3,它可以做得更好,它在'printf'中內置了'strftime'支持。 –