将日期拆分为3个参数的bashshell脚本?

将日期拆分为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} 格式为$

嗨,我有一个任务,要求用户输入他们的出生日期。 从一开始,我需要让用户输入他们的出生日期。 假设输入的日期为“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}
格式为
${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
中的支持。