日期 date命令
最快速的掌握方式,就是通过help命令,查看date的命令
$ date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.
Mandatory arguments to long options are mandatory for short options too.
-d, --date=STRING display time described by STRING, not 'now'
--debug annotate the parsed date,
and warn about questionable usage to stderr
-f, --file=DATEFILE like --date; once for each line of DATEFILE
-I[FMT], --iso-8601[=FMT] output date/time in ISO 8601 format.
FMT='date' for date only (the default),
'hours', 'minutes', 'seconds', or 'ns'
for date and time to the indicated precision.
Example: 2006-08-14T02:34:56-06:00
-R, --rfc-email output date and time in RFC 5322 format.
Example: Mon, 14 Aug 2006 02:34:56 -0600
--rfc-3339=FMT output date/time in RFC 3339 format.
FMT='date', 'seconds', or 'ns'
for date and time to the indicated precision.
Example: 2006-08-14 02:34:56-06:00
-r, --reference=FILE display the last modification time of FILE
-s, --set=STRING set time described by STRING
-u, --utc, --universal print or set Coordinated Universal Time (UTC)
--help display this help and exit
--version output version information and exit
- 直接在linux环境输入date,显示当前日期
[bidata@tomcat03 ~]$ date
Mon Sep 27 17:34:13 CST 2021
#展示不同日期格式,加入+%
[bidata@tomcat03 ~]$ date +%Y%m%d
20210927
- 不同格式对应结果
格式 | 输出示例 | 解释 |
---|---|---|
+%Y%m%d | 20210927 | |
+%F | 2021-09-27 | |
+%s | 20210927 | 时间戳 |
+%y | 21 | 保留年后两位 |
+%M | 39 | 分钟 |
+%H | 小时 | |
+%S | 秒 | |
+%Y%-m | 20219 | '-'去除前面0 |
- 附录help命令补充的所有日期格式
FORMAT controls the output. Interpreted sequences are:
%% a literal %
%a locale's abbreviated weekday name (e.g., Sun)
%A locale's full weekday name (e.g., Sunday)
%b locale's abbreviated month name (e.g., Jan)
%B locale's full month name (e.g., January)
%c locale's date and time (e.g., Thu Mar 3 23:05:25 2005)
%C century; like %Y, except omit last two digits (e.g., 20)
%d day of month (e.g., 01)
%D date; same as %m/%d/%y
%e day of month, space padded; same as %_d
%F full date; like %+4Y-%m-%d
%g last two digits of year of ISO week number (see %G)
%G year of ISO week number (see %V); normally useful only with %V
%h same as %b
%H hour (00..23)
%I hour (01..12)
%j day of year (001..366)
%k hour, space padded ( 0..23); same as %_H
%l hour, space padded ( 1..12); same as %_I
%m month (01..12)
%M minute (00..59)
%n a newline
%N nanoseconds (000000000..999999999)
%p locale's equivalent of either AM or PM; blank if not known
%P like %p, but lower case
%q quarter of year (1..4)
%r locale's 12-hour clock time (e.g., 11:11:04 PM)
%R 24-hour hour and minute; same as %H:%M
%s seconds since 1970-01-01 00:00:00 UTC
%S second (00..60)
%t a tab
%T time; same as %H:%M:%S
%u day of week (1..7); 1 is Monday
%U week number of year, with Sunday as first day of week (00..53)
%V ISO week number, with Monday as first day of week (01..53)
%w day of week (0..6); 0 is Sunday
%W week number of year, with Monday as first day of week (00..53)
%x locale's date representation (e.g., 12/31/99)
%X locale's time representation (e.g., 23:13:48)
%y last two digits of year (00..99)
%Y year
%z +hhmm numeric time zone (e.g., -0400)
%:z +hh:mm numeric time zone (e.g., -04:00)
%::z +hh:mm:ss numeric time zone (e.g., -04:00:00)
%:::z numeric time zone with : to necessary precision (e.g., -04, +05:30)
%Z alphabetic time zone abbreviation (e.g., EDT)
By default, date pads numeric fields with zeroes.
The following optional flags may follow '%':
- (hyphen) do not pad the field
_ (underscore) pad with spaces
0 (zero) pad with zeros
+ pad with zeros, and put '+' before future years with >4 digits
^ use upper case if possible
# use opposite case if possible
- 直接输出cal,展示日历,并高亮显示当前日期
[bidata@tomcat03 ~]$ cal
September 2021
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
- 日期加减-d
'-d’命令是日期的常用加减方式
admin@admin-PC MINGW64 ~/Desktop
$ date -d '-1day' +%Y%m%d
20210926
#与上面命令相同含义
$ date -d '1 days ago' +%Y%m%d
20210926
#指定日期的前一天
$ date -d '1 days ago 20210926' +%Y%m%d
20210925
#前一个月
$ date -d '-1month' +%Y%m%d
20210827
命令 | 输出 | 说明 |
---|---|---|
-1day | 20210926 | 前一天,等价于1 days ago |
-1month | 20210827 | 上个月 |
引号
- 单引号与双引号
两者都表示字符串
单引号与双引号的区别:单引号直接引用字符串内容,双引号对字符串进行解释,举例如下:
$ a='1';b='$a'+'b';echo $b
$a+b
$ a='1';b="$a"+'b';echo $b
1+b
因此字符串中有引用其他变量,用双引号,不希望引用则用单引号。
变量赋值
- 直接赋值
$ a=1;echo $a
1
- 命令输出赋值
两种方式一种是``命令,一种是$()方式,第二种支持嵌套,第一种不支持。
stat_date="20210901"
day_time=`date -d "-0day ${stat_date}" +%Y-%m-%d`
echo $day_time
#运行以上shell
$ sh shell_test.sh
#结果如下
2021-09-01
注意:变量day_time将命令的结果作为值时,值时在当时定义变量时命令运行的结果,如果命令中有变量在后续发生改变,day_time也不会发生改变
变量引用
- 直接引用
通过$var_name的方式,以及${var_name}两种方式,两者等价,有括号变量名界限解释更清晰(推荐)
如变量赋值与echo打印
$ a=2;b=$a;echo ${b}
2
- 间接引用
#通过双引号的解释引用
$ a="1";b=${a}+"b";echo ${b}
1+b
shell脚本换行
- 命令单行
多行命令在一行展示,通过 ; 来分割。
- 命令多行
多行命令直接回车,不需要像一般语言那样加分号结尾。
函数传参
- 函数定义比较简单,通过function fun_name(){},可以定义一个函数,举例如下
#其中$1表示第一个参数
function test(){
printf $1
}
- 函数传参,函数参数通过$1、$2、$3…依次获取,参数之间默认通过空格分割,以上函数调用举例
[guest@hadoop03 root]$ cat test.sh
function test(){
printf $1
}
a="hello"
test $a
[guest@hadoop03 root]$ sh test.sh
hello
- 由于参数传递通过空格分割,如果参数中包含空格,则可以把参数通过引号包裹,表示一个参数,举例如下
<!--只能打印出hello一个字符,因为认为yellow为第2个参数-->
[guest@hadoop03 root]$ cat test.sh
function test(){
printf $1
}
a="hello yellow"
test $a
[guest@hadoop03 root]$ sh test.sh
hello
<!--这样就可以输出完整的字符串了,同样对于多行字符变量一样生效-->
[guest@hadoop03 wyq]$ cat test.sh
function test(){
printf "$1" #这里也要加上引号哦,也是真个参数的意思
}
a="hello yellow"
test "$a"
[guest@hadoop03 wyq]$ sh test.sh
hello yellow
<!--多行字符如下-->
[guest@hadoop03 wyq]$ cat test.sh
function test(){
printf "$1" #这里也要加上引号哦,也是真个参数的意思
}
a="hello
yellow"
test "$a"
[guest@hadoop03 wyq]$ sh test.sh
hello
yellow
函数返回值获取
- 函数可以通过return关键字显示的表示返回值,return返回的是数值类型,表示函数运行状态
#--------------------------shell脚本test.sh内容---------------------------
function fun(){
echo "$1 $2"
return 1
}
a="a"
b="b"
fun $a $b
#通过$?获取前面命令的运行状态,也就是函数fun中return定义的返回值
if [ $? -eq 1 ]; then
echo 'ok'
fi
#--------------------------运行上面脚本结果 -------------------------------
$ sh test.sh
ok
- 获取函数echo内容,有时候单一的return返回值并不够,想要获取函数返回的字符内容,那么通过定义变量为函数返回值的方式,获取内容,同上面的变量赋值中获取命令结果的方式
#--------------------------shell脚本test.sh内容---------------------------
function fun(){
echo "$1 $2"
return 1
}
a="a"
b="b"
#此处ff即为函数fun中echo返回字符内容
ff=`fun $a $b`
#通过$?获取前面命令的运行状态,也就是函数fun中return定义的返回值
if [ $? -eq 1 ]; then
#通过函数状态判断是否打印变量ff的返回内容
echo "fun:${ff}"
fi
#--------------------------运行上面脚本结果 -------------------------------
$ sh test.sh
fun:a b
多行字符串与文件按行循环读取
- 想要对多行字符串进行解析,包括文件按行来读取,可以通过循环方式进行,循环包括for与while两种,举例如下
<!--读取多行字符串-->
a="jii
jill"
<!--for循环读取-->
for line in $a
do
echo $line
done
<!--while通过管道的方式-->
echo $a |while read line
do
echo $line
done
<!--读文件-->
<!--for循环读取-->
for line in `cat test.txt`
do
echo $line
done
<!--while通过管道的方式-->
cat test.txt |while read line
do
echo $line
done
<!--while通过文件重定向的方式-->
while read line
do
echo $line
done < test.txt
以上可以实现多行字符与文件按行读取,但以下几种情况会遇到问题:
-
- 当每行中包含空格时,for循环会按多行分割,而while不会,对于读取文件建议用while来读取
-
- 如果依然想用for循环来读取,可以更改IFS变量,IFS代表shell的系统变量,对字符进行分割时默认是空格、tab、回车,采用只用回车的方式进行临时更改,任务完成再更改回默认的值,记得IFS一定要更改回来,否则影响shell的全局系统使用
<!--a的每行中包含空格-->
a="ji ji
jid ji"
IFS_old=$IFS # 记录老的分隔符
IFS=$'\n' # 以换行符作为分隔符
for line in ${a}
do
echo ${line}
done
IFS=$IFS_old # 记得一定要更改会原来的值
-
- 用while的管道方式读取每行时,如果循环内涉及外部变量的更新,如将每行内容读到变量$a中时,在循环结束后,并不会更新,原因是管道相当于启动一个子shell进程,不会对当前进程的变量进行更改,所以建议读取文件用文件重定向的方式,对于字符串,则可以将字符串保存至临时文件后,再用文件重定向方式读取
newStr=""
echo "${a}" | while read line
do
newStr=${newStr}${line}' '
echo ${newSql} #这是是有更新的
fi
done
echo ${newStr} #循环结束后,这是是空的,并不会更新