在BASH shell脚本或使用gdate时,如果给出“2011年10月”这样的日期,我该如何转换为年月数字格式?例如,输出应为“2011-10”。
答案 0 :(得分:9)
mydate="Oct 2011"
date --date="$(printf "01 %s" $mydate)" +"%Y-%m"
GNU日期的parse_datetime接口(这是示例使用的)有很多规则。 2011年10月的日期形式不是其中之一,所以你在它前面添加一个“01”,日期就像它一样。
答案 1 :(得分:7)
read mon year <<< "Oct 2012"
date -d "$mon 1 $year" "+%Y-%m"
结果:
2012-10
答案 2 :(得分:3)
case "`date | awk '{print $2 }'`" in
Jan) MON=01 ;;
Feb) MON=02 ;;
Mar) MON=03 ;;
Apr) MON=04 ;;
May) MON=05 ;;
Jun) MON=06 ;;
Jul) MON=07 ;;
Aug) MON=08 ;;
Sep) MON=09 ;;
Oct) MON=10 ;;
Nov) MON=11 ;;
Dec) MON=12 ;;
esac
echo $MON
答案 3 :(得分:2)
Bash4支持哈希表(尽管Jim的回答是正确的。)
实施例
#!/bin/bash
declare -A months=( ["Jan"]="01" ["Feb"]="02" )
mydate="Jan 2011"
echo ${mydate:4:8}-"${months["${mydate:0:3}"]}"
输出:
2011-01
答案 4 :(得分:2)
您可以通过查找名称字符串的位置将月份转换为数字:
#!/bin/bash
month=Oct
months="JanFebMarAprMayJunJulAugSepOctNovDec"
tmp=${months%%$month*}
month=${#tmp}
monthnumber $((month/3+1))
printf "%02d\n" $monthnumber
上面脚本的输出是:
10
您可以编码的特定字符串:
#!/bin/bash
mydate="Oct 2011"
monthnumber() {
month=$1
months="JanFebMarAprMayJunJulAugSepOctNovDec"
tmp=${months%%$month*}
month=${#tmp}
monthnumber=$((month/3+1))
printf "%02d\n" $monthnumber
}
arr=(`echo ${mydate}`);
month=$(monthnumber ${arr[0]})
year=$(echo ${arr[1]})
echo "$year-$month"
输出结果为:
2011-10
答案 5 :(得分:1)
我不确定是否有更短的方法,但这是一种方法。这绝不是万无一失的。您可以通过向输入添加其他检查来改进这一点,并使比较大小写不敏感。
#!/bin/ksh
### Validate input
if [ $# -eq 0 ]
then
echo "Usage: $0 InputMonYYYY"
echo "Example: $0 \"Oct 2011\""
exit 1
fi
### Read input
INPUTSTR=$1
MON_STR=`echo $INPUTSTR |cut -d' ' -f1`
YYYY_STR=`echo $INPUTSTR |cut -d' ' -f2`
if [[ "$MON_STR" = "Jan" ]] then
MON_NUM=01
elif [[ "$MON_STR" = "Feb" ]] then
MON_NUM=02
elif [[ "$MON_STR" = "Mar" ]] then
MON_NUM=03
elif [[ "$MON_STR" = "Apr" ]] then
MON_NUM=04
elif [[ "$MON_STR" = "May" ]] then
MON_NUM=05
elif [[ "$MON_STR" = "Jun" ]] then
MON_NUM=06
elif [[ "$MON_STR" = "Jul" ]] then
MON_NUM=07
elif [[ "$MON_STR" = "Aug" ]] then
MON_NUM=08
elif [[ "$MON_STR" = "Sep" ]] then
MON_NUM=09
elif [[ "$MON_STR" = "Oct" ]] then
MON_NUM=10
elif [[ "$MON_STR" = "Nov" ]] then
MON_NUM=11
elif [[ "$MON_STR" = "Dec" ]] then
MON_NUM=12
fi
echo ${YYYY_STR}-${MON_NUM}
答案 6 :(得分:0)
让我们踢这匹死马。 如果您不关心无效的月份名称,则可以使用我编写的此函数,该函数很短(仅执行1次),但希望一个月份为有效的英语3字符小写或大写字母,并且仅需要GNU sed和bash:
greeter
以您的示例为例:
greet()