我想使用date命令从用户输入输出星期几。
我想强制输入格式为MM / DD / YYYY。
例如,在命令行我给出
./programname MM/DD/YYYY MM/DD/YYYY
脚本本身的片段
#!/bin/bash
DATE_FORMAT="^[0-9][0-9][/][0-9][0-9][/][0-9][0-9][0-9][0-9]$" #MM/DD/YYYY
DATE1="$1"
DATE2="$2"
......接着是
if [ "$DATE1" != "$DATE_FORMAT" ] || [ "$DATE2" != "$DATE_FORMAT" ]; then
echo -e "Please follow the valid format MM/DD/YYYY.\n" 1>&2
exit 1
现在,即使输入正确的日期格式,问题仍然存在,
./programname 11/22/2014 11/23/2014
我仍然收到我设置的错误消息,这意味着即使我输入有效格式,if
的条件也会被评估为真...有任何建议,为什么会发生这种情况?
答案 0 :(得分:2)
这个脚本似乎有效:
#!/bin/bash
DATE_FORMAT="^[01][0-9][/][0-3][0-9][/][0-9][0-9][0-9][0-9]$" #MM/DD/YYYY
DATE1="$1"
DATE2="$2"
if [[ "$DATE1" =~ $DATE_FORMAT ]] && [[ "$DATE2" =~ $DATE_FORMAT ]]
then echo "Both dates ($DATE1 and $DATE2) are OK"
else echo "Please follow the valid format MM/DD/YYYY ($DATE1 or $DATE2 is wrong)."
fi
它使用=~
运算符在Bash的[[
test command内进行正向正则表达式匹配。文档没有提到负!~
的负匹配(尽管这是Awk和Perl使用的)。使用单括号[
测试命令,没有正则表达式匹配。请注意,正则表达式必须不用双引号括起来:
可以引用模式的任何部分以强制引用的部分作为字符串匹配。必须小心处理正则表达式中的括号表达式,因为正常的引号字符会丢失括号之间的含义。如果模式存储在shell变量中,引用变量扩展会强制整个模式匹配为字符串。
测试也更严格,拒绝23/45/2091
,以及其他无效的日期字符串。
$ bash dt19.sh 11/22/2014 11/23/2014
Both dates (11/22/2014 and 11/23/2014) are OK
$ bash dt19.sh 31/22/2014 11/43/2014
Please follow the valid format MM/DD/YYYY (31/22/2014 or 11/43/2014 is wrong).
$
答案 1 :(得分:0)
更正后的代码:
#!/bin/bash
DATE1="$1"
DATE2="$2"
if echo "$DATE1" | grep -q -E '[0-9][0-9][/][0-9][0-9][/][0-9][0-9][0-9][0-9]'
then
echo "Do whatever you want here"
exit 1
else
echo "Invalid date"
fi