将日期拆分为3个参数的bashshell脚本?
嗨,我有一个任务,要求用户输入他们的出生日期。 从一开始,我需要让用户输入他们的出生日期。 假设输入的日期为“20050215”,如何将其拆分为3个参数?(2005 02 15) 我还需要用户有其他选择,以输入他们的生日像这样 “-y 2005-m 02-d 15” 请帮帮我。 非常感谢您的帮助。Bash提供了出色的字符串索引,允许您执行所需的操作:将日期拆分为3个参数的bashshell脚本?,bash,shell,date,date-of-birth,Bash,Shell,Date,Date Of Birth,嗨,我有一个任务,要求用户输入他们的出生日期。 从一开始,我需要让用户输入他们的出生日期。 假设输入的日期为“20050215”,如何将其拆分为3个参数?(2005 02 15) 我还需要用户有其他选择,以输入他们的生日像这样 “-y 2005-m 02-d 15” 请帮帮我。 非常感谢您的帮助。Bash提供了出色的字符串索引,允许您执行所需的操作: bdate=20050215 year=${bdate:0:4} mon=${bdate:4:2} day=${bdate:6:2} 格式为$
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.
因为您不想自己验证日期(即闰年),所以应该使用
date
bdate=20160229
d=$(date --date="$bdate" +%d)
m=$(date --date="$bdate" +%m)
y=$(date --date="$bdate" +%Y)
非常感谢,你的建议真的很有帮助。谢谢:)当然,很高兴我能帮上忙。现在确保你理解了所有的内容,如果你有问题,就问吧。这些测试被称为复合命令。它们在上面用作缩写的
if
(这样就不用编写整个if-then-else-fi
。请确保您理解[
和之间的区别[[
conditional statements和when quoting is/is not required in There等。简短的小脚本中有很多内容。祝你脚本编写顺利。bash、zsh等脚本编写是一种非常有能力的编程形式。是的,我对这整件事还很陌生,所以我还没有完全掌握这个概念,但我很高兴你能提供帮助。最好愿望。作为新人,你会想要花费(很多)时间在。这是一个写得很好的非常有用的bash所有内容的集合。仔细查看页面,最重要的是页面。为什么要使用三个单独的日期调用,而不是一个使用read
来分割结果?即read d m y<…如果保证bash 4.3具有strftime内置于其printf
中的支持。