学习大数据的第32天——循环、日期
for循环
格式一:
for((i=1;i<=j;i++))
do
循环体
done
格式二:
for i in {开始位置…结束位置} #中间是两个点
do
循环体
done
格式三:
for i in $(seq 结束位置)
do
循环体
done
格式四:
for i in $(seq 5 -1 1) 开始位置 加或者减 结束位置
do
循环体
done
注意:输出的数量不一样
格式二: 输出 0 1 2 下标的数
for i in (0..2)
do
循环体
done
格式三:输出 0 1 下标的数
for i in $(seq 2)
do
循环体
done
循环小练习
练习一:
产生四个随机数
格式一:
for((i=1;i<=4;i++))
do
echo $RANDOM
done
格式二:
for i in {0..4}
do
echo $RANDOM
done
格式三:
for i in $(seq 5)
do
echo $RANDOM
done
练习二:
倒数五秒
方法一:准备倒数五秒(使用格式四)
for i in $(seq 5 -1 1)
do
echo -en "$i"
sleep 1
done
方法二:(使用格式1)
for((i=1;i<=5;i++))
do
echo -en "$i"
sleep 1
done
练习3:按格式输出
# 按格式输出
# $1 is aa,
# $2 is bb,
# $3 is cc,
# $4 is dd,
# $5 is ee
N=1
for i in $@
do
echo "\$$N is $i"
((N++))
done
练习4:九九乘法表
#九九乘法表
for((i=1;i<=9;i++))
do
for((j=1;j<=i;j++))
do
echo -en "$j*$i="$(( i + j ))"\t"
done
echo -e "\n"
done
函数
从三个方面入手:1、无参无返回值,2、无参有返回值,3、有参无返回值
格式:
函数名称(){
方法体
[return int;]
}
说明:
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
无参无返回值的函数格式以及无参但是有返回值的函数格式
#!/bin/sh
#函数的注意事项
#格式 函数名(){
# 方法体
# }
#无参且无返回值的函数格式
demoFun(){
echo "这是我的第一个shell函数"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
#无参但是有返回值的函数格式
# $? 如果有返回值,返回值的范围在0-255之间,就输出结果
# 如果返回值的范围不在范围之间,就会输出一个别的值
# 如果输入的是负数 还是得看结果是不是在这个范围,在的话就输出结果,不在的话,是负数,就会>爆出不在范围
# 键盘输入:read
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字:"
read num1
echo "输入第二个数字:"
read num2
echo "两个数字分别为 $num1 和 $num2 "
return $(($num1+$num2))
# return 300
}
funWithReturn
echo "输入的两个数之和为 $? !"
无返回值但是有参数
#无返回值但是有参数
#如果输出的值,超过了传参范围,不会报错,但是不会输出
fun(){
echo "第一个参数为$1 !"
echo "第二个参数为$2 !"
echo "第三个参数为$3 !"
echo "第五个参数为$5 !"
echo "第十个参数为${12} !"
echo "参数总数有 $# 个"
echo "作为一个字符串输出所有参数 $* !"
}
fun 1 2 3 4 5 6 7 8 9 10
日期
#!/bin/sh
#shell日期
#获取当前日期时间
date
#以指定格式显示日期时间
date "+%Y-%m-%d %H:%M:%S"
#设置系统日期
#date -s "2017-01-01 01:01"
#date -set="2017-01-01 01:01"
#有时候,我们操作日期时间,经常会要获取前几天或者后几天的时间,那么date命令也给我们提供了实现这个功能的可选项'-d'和'--date'.
#date 能用来显示或设定系统的日期和时间,在显示方面,使用者能设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下:
#获取下一天的时间
date -d next-day "+%Y-%m-%d %H:%M:%S"
#获取下一天的时间 (第二种方式)
date -d tomorrow '+%Y-%m-%d %H:%M:%S'
#获取上一天的时间
date -d last-day '+%Y-%m-%d %H:%M:%S'
#获取上一天的时间(第二种方式)
date -d yesterday '+%Y-%m-%d %H:%M:%S'
#获取下个月的时间
date -d next-month '+%Y-%m-%d %H:%M:%S'
#获取上个月的时间
date -d last-month '+%Y-%m-%d %H:%M:%S'
#获取下一年的时间
date -d next-year '+%Y-%m-%d %H:%M:%S'
#获取上一年的时间
date -d last-year '+%Y-%m-%d %H:%M:%S'
#获取下一周的日期时间
date -d next-week '+%Y-%m-%d %H:%M:%S'
date -d next-monday '+%Y-%m-%d %H:%M:%S'
date -d next-thursday '+%Y-%m-%d %H:%M:%S'
#2022年03月06日 星期日 21时41分27秒
date '+%c'
date '+%D'
date '+%U'
日期方面
%a : 星期几 (Sun…Sat)
%A : 星期几 (Sunday…Saturday)
%b : 月份 (Jan…Dec)
%B : 月份 (January…December)
%c : 直接显示日期和时间
%d : 日 (01…31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001…366)
%m : 月份 (01…12)
%U : 一年中的第几周 (00…53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0…6)
%W : 一年中的第几周 (00…53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yyyy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000…9999)
时间方面
%%: 打印出%
%n : 下一行
%t : 跳格
%H : 小时(00…23)
%k : 小时(0…23)
%l : 小时(1…12)
%M : 分钟(00…59)
%p : 显示本地AM或PM
%P : 显示本地am或pm
%r : 直接显示时间(12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00…61)
%T : 直接显示时间(24小时制)
%X : 相当于%H:%M:%S %p
%Z : 显示时区
还有一种时间加减的方式
#当前时间
date +"%Y-%m-%d %H:%M:%S"#下一天(明天)的时间
date -d “+1 day” +"%Y-%m-%d %H:%M:%S"#前一天(昨天)的时间
date -d “-1 day” +"%Y-%m-%d %H:%M:%S"#后一个月(下个月)的时间
date -d “+1 month” +"%Y-%m-%d %H:%M:%S"#前一个月(上个月)的时间
date -d “-1 month” +"%Y-%m-%d %H:%M:%S"#后一周的时间
date -d “+1 week” +"%Y-%m-%d %H:%M:%S"#前一前的时间
date -d “-1 week” +"%Y-%m-%d %H:%M:%S"#下一年(明年)的时间
date -d “+1 year” +"%Y-%m-%d %H:%M:%S"#前一年(去年)的时间
date -d “-1 year” +"%Y-%m-%d %H:%M:%S"
重点:日期的有用的小技巧
获取相对某个日期前后的日期:
[root@hadoop ~]# date -d ‘may 14 -2 weeks’
把时间当中无用的0去掉,比如:01:02:25会变成1:2:25
[root@hadoop ~]# date ‘+%-H:%-M:%-S’
显示文件最后被更改的时间
[root@hadoop ~]# date “+%Y-%m-%d %H:%M:%S” -r bin/removeJDK.sh
求两个字符串日期之间相隔的天数
[root@hadoop ~]#
expr ‘(’ $(date +%s -d “2016-08-08”) - $(date +%s -d “2016-09-09”) ‘)’ / 86400
expr
expr $(date +%s -d "2016-08-08") - $(date +%s -d "2016-09-09")
/ 86400r
shell中加减指定间隔单位
[root@hadoop ~]# A=
date +%Y-%m-%d
[root@hadoop ~]# B=
date +%Y-%m-%d -d "$A +48 hours"