linux命令-date(??)

shell脚本删除N天前的文件夹

背景:

每日构建的东西,按日期放到不同的文件夹里。如今天的构建放到2015-06-01里,明天的就放到2015-06-02里,依次类推。时间久了,需要一个脚本删除N天前的文件夹。(本例中N=7,即删除一周前的构建)。

下面直接上代码,linux版:

#! /bin/bash

historyDir=~/test/

today=$(date +%Y-%m-%d)

echo "---------today is $today-----------"

tt=`date -d last-week +%Y-%m-%d`

echo "next is to delete release before $tt"

tt1=`date -d $tt +%s` #小于此数值的文件夹删掉

#echo $tt1

for file in ${historyDir}*

do

if test -d $file

then

name=`basename $file`

#echo $name

curr=`date -d $name +%s`

if [ $curr -le $tt1 ]

then

echo " delete $name-------"

rm -rf ${historyDir}${name}

fi

fi

done

注意事项:

1,historyDir=~/test/后面一定要带/,否则在后面的遍历文件夹时for file in
${historyDir}*会对应不上。

2,在linux下通过today=$(date
+%Y-%m-%d)获得格式为2015-06-01类型的日期,通过

tt1=`date -d $tt +%s`

得到整形的时间戳。当然也可以在获得时间的时候就用$(date
+%s)这样直接得到的就是时间戳,不用再转换了,但是日期是默认的年月日小时分秒的格式转换的时间戳。

PS:MAC下不行。

3,linux里通过date -d last-week +%Y-%m-%d来获得一周前的日期。

PS:MAC下没行。

4,通过 if test -d $file来判断文件夹是否存在,-f是判断文件是否存在。

name=`basename $file`

这句话获得文件夹的名字,之后是将名字(也就是日期)转为时间戳比较。

MAC上的代码

#! /bin/bash

historyDir=~/test/

today=$(date +%Y-%m-%d)

echo "---------today is $today-----------"

today1=`date -j -f %Y-%m-%d $today +%s`

#echo "today1=$today1"

#求一周前的时间

tt=$(date -v -7d +%Y-%m-%d)

echo "next is to delete release before $tt"

tt1=`date -j -f %Y-%m-%d $tt +%s` #linux上可以这样`date -d $tt +%s` #小于此数值的文件夹删掉

#echo $tt1

for file in ${historyDir}*

do

if test -d $file

then

name=`basename $file`

echo $name

curr=`date -j -f %Y-%m-%d $name +%s`

if [ $curr -le $tt1 ]

then

echo " delete $name"

rm -rf ${historyDir}${name}

fi

fi

done

echo "--------------end---------------"

跟linux上不同之处有二:

1,将字符串的时间转为整数的时间戳时,mac上要这样:

today1=`date -j -f %Y-%m-%d $today +%s`

2,获得7天之前的日期mac上要这样:

tt=$(date -v -7d +%Y-%m-%d)

图片 1


背景:
每日构建的东西,按日期放到不同的文件夹里。如今天的构建放到2015-06-01里,明天的就放到2015-06-02里,…

显示时间是个常用的命令,在写shell脚本中也经常会用到与日期相关文件名或时间显示。无论是linux还是windows下都是date命令。

date命令 显示或设置系统时间和日期

创建以当前时间为文件名的

centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法
 shell中的逻辑判断  if 判断文件、目录属性  shell数组简单用法 $( ) 和${ }
和$(( )) 与  sh -n  sh -x  sh -v 第三十五节课

Linux下date命令用法

date (选项) (参数)

mkdir `date+%Y%m%d`

 

date [OPTION]… [+FORMAT] 

选项:

备份以时间做为文件名的

注意:脚本写到一行最好用分号; 

date [-u|–utc|–universal] [MMDDhhmm[[CC]YY][.ss]] 

-d “字符串” 显示字符串所指的日期与时间,注意字符串要加双引号

tar cvf./htdocs`date +%Y%m%d`.tar ./*

if ls /tmp/sdfsdf >/dev/null 2>&1 ;then echo ok;else echo notok; fi

date命令参数

-s “字符串” 根据字符串来设置日期与时间。字符串必要有双引号

 

 

-d, –date=STRING  显示STRING指定的时间 

参数:

date命令如何获得上星期的日期?

每个结构语句后面都可以加分号表示语句的结束,但是分多行来书写不会加任何分号更加美观

-f, –file=DATEFILE  类似–date参数显示DATEFILE文件中的每行时间 

<时间日期格式>

lastmonth=`date+%Y-%m –date=”-1 month”`”-01″;

#!/bin/bash
cd /etc/ ;
for a in `ls /etc/` ;
do  
if [ -d /etc/$a ]  ;
then
ls -d /etc/$a ;
fi ;
done ;

-ITIMESPEC, –iso-8601[=TIMESPEC]  以ISO  8601
格式显示日期/时间。TIMESPEC为”date”(只显示日期)、”hours”、”minutes”、”senconds”(显示时间精度)之一,默认为”date”。 

%m 月份     %w 一个星期的第几天  %d 一个月的第几天

然后 awk -v 作为一个参数这样传进去简单点。

对比

-r, –reference=FILE  显示文件的最后修改时间 

%y 年的最后两个数字

#date -d “-1week” “+%Y%m%d %A”

#!/bin/bash
cd /etc/
for a in `ls /etc/`
do  
if [ -d /etc/$a ]  
then
ls -d /etc/$a
fi
done 

-R, –rfc-2822  以RFC-2822兼容日期格式显示时间 

实例:

或者:#date -d “last week” +%Y%m%d

 

-s, –set=STRING  设置时间为STRING 

1,格式化输出   date + “%Y-%m-%d”

举一反三:date命令获得前天,昨天,明天,后天,上个月,下个月的日期

 

-u, –utc, –universal  显示或设定为Coordinated Universal Time时间格式 

[root@localhost network-scripts]# date + “%Y-%m-%d”

date: 额外的操作数 “%Y-%m-%d”

uuwatch@i161 ~ $ date
+%Y-%m-%d

2015-07-07
uuwatch@i161 ~ $ date -d “1 day” 
+%Y-%m-%d
                   
//1天后(明天),其它类似2天后(后天)把1改成2即可
2015-07-08
uuwatch@i161 ~ $ date -d “-1 day” 
+%Y-%m-%d
       
//-1天前(昨天),其它类似2天前(前天)把-1改成-2即可
2015-07-06

 

date命令输出显示格式

有问题。。。。

#date -d “-1 week” 
+%Y-%m-%d
                  //一周前
2015-06-30
uuwatch@i161 ~ $ date -d “-2 week” 
+%Y-%m-%d
             //两周前
2015-06-23
uuwatch@i161 ~ $ date -d “1 week” 
+%Y-%m-%d
              //一周后
2015-07-14

上半节课
正则
shell脚本结构
date命令的用法

%%    字符% 

2,输出昨天日期:

uuwatch@i161 ~ $ date -d “-1 month” 
+%Y-%m-%d
           //上个月
2015-06-07
uuwatch@i161 ~ $ date -d “1 month” 
+%Y-%m-%d
            //下个月
2015-08-07

 

%a     星期的缩写(Sun..Sat) 

date -d “1 day ago” + “Y-%m-%d”

 

下半节课
shell中的逻辑判断
if 判断文件、目录属性
shell数组简单用法
sh -n sh -x  sh -v 
$( ) 和${ } 和$(( ))

%A    星期的完整名称 (Sunday..Saturday) 

date: 额外的操作数 “Y-%m-%d”

Try ‘date –help’ for more information.

[root@localhost network-scripts]# date

2017年 07月 22日 星期六 23:59:55 CST

[root@localhost network-scripts]#

   date -d “-2 day”
“+%Y%m%d %A”   或 date –date=”2 days ago””+%Y%m%d %A”

 

%b     月份的缩写(Jan..Dec) 


   date -d “-1 day”
“+%Y%m%d %A”   或 date –date=”1 day ago””+%Y%m%d %A”

 

%B     月份的完整名称(January..December) 


   date -d “1 day” “+%Y%m%d
%A”

内容概要:

%c     日期时间(Sat Nov 04 12:02:33 EST 1989) 

作业:删除目录下所有含有  test 的文件或目录

   date -d “2 day” “+%Y%m%d
%A”

  1. shell脚本是什么
    它是一种脚本语言,并非编程语言
    可以使用一些逻辑判断、循环等语法
    可以自定义子函数
    是系统命令的集合
    shell脚本可以实现自动化运维,大大增加我们的工作效率
    正则
    .:任意一个字符
    *:结合星号前面的符号,a* 0个或多个a
    +:grep不可以直接,加大E 或者egrep 或者脱义符号 grep ‘a+’
    一个或多个a
    ?:0个或多个a
    .*:贪婪匹配
    ():匹配,然后替换
    (ab){2,4}: 出现2到4次ab
    [^:]+:非冒号开头的一个或多个
    ([^:]+)(:.*:)([^:]+) 匹配多段
    sed -r ‘s/([^:]+)(:.*:)([^:]+) /321/’ /etc/passwd
    awk -F ‘:’ ‘{print $7}’ /etc/passwd

%C     世纪(年份除100后去整) [00-99] 

find /App/ido/jobs  -type f -name “*test*” -delete

   date -d “-1 month”
“+%Y%m%d %A”

 

%d     一个月的第几天(01..31) 

find /App/ido/jobs  -type d -name “*test*” -delete

   date -d “1 month”
“+%Y%m%d %A”

 

%D     日期(mm/dd/yy) 

删除文件夹这里存在一个问题,是否强制删除”非空目录“,就没有删除

   echo `date -d”-1 month”
“+%Y-%m-%d %X”`

  1. shell脚本结构以及执行方法以及命名规则
    开头行指定bash路径: #! /bin/bash
    以#开头的行作为解释说明
    脚本的名字以.sh结尾,用于区分这是一个shell脚本
    执行方式有两种:chmod +x 1.sh; ./1.sh 如果没有执行权限可以 bash 1.sh
    bash -x 1.sh 可以查看脚本执行过程
    shell的变量和函数命名不能有横杠,只能是大小写字母、 下划线、 数字  例如
     check-service(){} 错误 check_service(){} 正确

%e     一个月的第几天 ( 1..31) 

下面查看包含 test 的文件夹find /App/ido/jobs  -type d -name “*test*”


 

%F    日期,同%Y-%m-%d 

3、2秒后输出:date -d “2 second” + “%Y-%m-%d %H :%M.%s”

#man date可以看到date的help文件
  #date 获取当前时间
  #date -d “-1week” +%Y%m%d 获取上周日期(day,month,year,hour)
  #date–date=”-24 hour” +%Y%m%d 同上
  date_now=`date+%s` shell脚本里面赋给变量值
  %% 输出%符号
  %a 当前域的星期缩写 (Sun..Sat)
  %A 当前域的星期全写 (Sunday..Saturday)
  %b 当前域的月份缩写(Jan..Dec)
  %B 当前域的月份全称 (January..December)
  %c 当前域的默认时间格式 (Sat Nov 04 12:02:33 EST 1989)
  %C n百年 [00-99]
  %d 两位的天 (01..31)

 

%g     年份(yy) 

图片 2

  %D 短时间格式 (mm/dd/yy)

  1. 学会date命令的用法
    命令格式:date [参数]… [+格式]
    选择参数:
    -d<字符串>
     显示字符串所指的日期与时间。字符串前后必须加上双引号。
    -s<字符串>
     根据字符串来设置系统日期与时间。字符串前后必须加上双引号。

%G     年份(yyyy) 

4、传说中的 1234567890 秒:

  %e 短格式天 ( 1..31)

注意:如果有空格需要用双引号引起来:date +”%Y%m%d %H%M”  不用双引号date
+%Y%m%d-%H%M
CST:中国时区,北京时间
EST :东部标准时间
date +%Y-%m-%d, date +%y-%m-%d 年月日
大Y 四位年 小y两位年 小m月 大M分钟 小d天 小h月 大H小时 大S秒
小s时间戳(大Y 四位年 小m月 小d天 大H小时 大M分钟 大S秒 )
date +%H:%M:%S = date +%T 时间
date +%Y-%m-%d = date +%F 年月日
date +”%Y-%m-%d %H:%M:%S” 2016-01-20 10:36:47 双引号引起来
date +%w 星期几
date +%W 第几周
date +%s 时间戳
date -d @1434248742 反推时间戳,时间戳是1434248742
date -d “+1day” +”%Y-%m-%d”一天后
date -d “-1day” +”%Y-%m-%d”一天前
date -d “-1month” +”%Y-%m-%d”一月前
date -d “-1min” +”%Y-%m-%d %H:%M:%S”一分钟前
date -d “-1year” +”%Y-%m-%d” 一年前
date -d “-1weak” +”%Y-%m-%d” 一个星期前
两部分
第一部分-d “-1weak”
第二部分+”%Y-%m-%d”

%h     同%b 

图片 3

  %F 文件时间格式 same as %Y-%m-%d

 

%H    小时(00..23) 

这里一直报错。。没正常显示

  %h same as %b

 

%I     小时(01..12) 

5、后面还有-普通转格式-apache格式转换、格式转换后时间游走、加减操作暂时不操作,同上会出错

  %H 24小时制的小时 (00..23)

  1. shell脚本中的变量
    当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
    使用条件语句时,常常使用变量 if [ $a -gt 1 ]; then … ; fi
    引用某个命令的结果时,用变量替代 n=`wc -l 1.txt`或者 n=$(wc -l
    1.txt)
    写和用户交互的脚本时,变量也是必不可少的 read -p “Input a number: ” n;
    echo $n 如果没写这个n,可以直接使用全局变量$REPLY
    内置变量 $0, $1, $2… $0表示脚本本身,$1 第一个参数,$2 第二个 ….
    $#:表示参数个数或最后一个参数
    $* 所有参数列表。如”$*”用「”」括起来的情况、以”$1 $2 …
    $n”的形式输出所有参数。
    $@
    :表示以空格分隔的所有输入参数或者所有函数参数所有参数列表。如”$@”用「”」括起来的情况、以”$1″
    “$2” … “$n” 的形式输出所有参数。
    $$:当前shell进程的pid
    $!:后台运行的最后一个进程的pid
    $- 使用Set命令设定的Flag一览

%j     一年的第几天(001..366) 

6、设定时间: date -s

  %I 12小时制的小时 (01..12)

数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
变量的作用域和属性 :readonly 、local

%k     小时( 0..23) 

图片 4

  %j 一年中的第几天 (001..366)

 

%l      小时( 1..12) 

  %k 短格式24小时制的小时 ( 0..23)

 

%m    月份(01..12) 

  %l 短格式12小时制的小时 ( 1..12)

 

%M    分钟(00..59) 

  %m 双位月份 (01..12)

  1. shell中的逻辑判断
    格式1:if 条件 ; then 语句; fi
    格式2:if 条件; then 语句; else 语句; fi
    格式3:if …; then … ;elif …; then …; else …; fi
    格式4:if 命令;then 语句;fi
    逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10
    ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=)
    注意到处都是空格 方括号两边也有空格 if [ 1 == 1 ] then xx fi
    可以使用 && || 结合多个条件 -a也表示&&,-o也表示||
    冒号表示真 if : then xx fi

%n     换行 

  %M 双位分钟 (00..59)

用两个括号可以避免使用lt,gt
if (($a<3)); then echo ok;else echo nook;fi
if (($a>3)); then echo ok;else echo nook;fi

%N     纳秒(000000000..999999999) 

  %n 换行

 

%p     AM or PM 

  %N 十亿分之一秒(000000000..999999999)

字符串比较用(==)和(!=) ,不能用-eq和 -ne
if [ “s” == “e” ]; then echo 1 ;fi
if [ “s” != “e” ]; then echo 1 ;fi

%P     am or pm 

  %p 大写的当前域的上下午指示 (blank in many locales)

 

%r     12小时制时间(hh:mm:ss [AP]M) 

  %P 小写的当前域的上下午指示 (blank in many locales)

if:
格式:注意[]两边都有空格 逻辑操作符两边也要留空格
#!/bin/bash
if [ 1 == 2 ]
then
echo true;
elif [ 1 == 3 ] ;then
echo false;
else
echo error;
fi

%R    24小时制时间(hh:mm) 

  %r 12小时制的时间表示(时:分:秒,双位) time, 12-hour (hh:mm:ss
[AP]M)
  %R 24小时制的时间表示 (时:分,双位)time, 24-hour (hh:mm)
  %s 自基础时间 1970-01-01 00:00:00 到当前时刻的秒数(a GNU
extension)
  %S 双位秒 second (00..60);
  %t 横向制表位(tab)
  %T 24小时制时间表示(hh:mm:ss)
  %u 数字表示的星期(从星期一开始 1-7)
  %U 一年中的第几周 星期天为开始 (00..53)
  %V 一年中的第几周 星期一为开始 (01..53)
  %w 一周中的第几天 星期天为开始 (0..6)
  %W 一年中的第几周 星期一为开始 (00..53)
  %x 本地日期格式 (mm/dd/yy)
  %X 本地时间格式 (%H:%M:%S)
  %y 两位的年(00..99)
  %Y 年 (1970…)
  例子:编写shell脚本计算离自己生日还有多少天?

> gt
< lt
>= ge
<= le
== eq
!= ne

%s     从00:00:00 1970-01-01 UTC开始的秒数 

[plain] view
plaincopy

 
if 命令 
判断的基础
1、有返回值 每个命令都有返回值
2、有正确的返回值 0是真 非0是假 echo $?

%S     秒(00..60) 

  1. read -p”Input your birthday(YYYYmmdd):” date1  
  2.   m=`date–date=”$date1″ +%m` #得到生日的月  
  3.   d=`date–date=”$date1″ +%d` #得到生日的日  
  4.   date_now=`date+%s` #得到当前时间的秒值  
  5.   y=`date +%Y` #得到当前时间的年  
  6.   birth=`date–date=”$y$m$d” +%s` #得到今年的生日日期的秒值  
  7.   internal=$(($birth-$date_now)) #计算今日到生日日期的间隔时间  
  8.   if [“$internal” -lt “0” ]; then #判断今天的生日是否已过  
  9.   birth=`date–date=”$(($y+1))$m$d” +%s` #得到明天的生日日期秒值  
  10.   internal=$(($birth-$date_now))#计算今天到下一个生日的间隔时间  
  11.   fi  
  12.   echo “Thereis :$((einternal/60/60/24)) days.” #输出结果,秒换算为天  

注意,if 命令不能加中括号  ,if [ 命令 ]是错的

%t     制表符 

还有其他用法:

例子

%T    24小时制时间(hh:mm:ss) 

date+%s   可以得到UNIX的时间戳;

if  ping -c 1 192.168.1.106 >/dev/null 2>&1 ; then echo 1; else echo 2; fi

if sed -i 's/i/gg/g' sed.txt
if /bin/true ;
grep -q 避免输出

%u     一周的第几天(1..7);  1 表示星期一 

已知时间戳,求当前日期
date –date=”19700101 +$(($((`date +%s`))+(8*60*60))) sec” +%Y%m%d”
“%H:%M:%S
PS:从1970年01月01日开始算, +$(($((`date +%s`))+(8*60*60))) sec
表示过了多少秒,其中(8*60*60)表示8个小时,时区问题,我国时间与世界时间相差8小时。

 

%U     一年的第几周,周日为每周的第一天(00..53) 

if [$a -lt 10] && [$a -gt 1]; then echo ok;fi
或者
if [$a -lt 10 -a $a -gt 1]; then echo ok;fi

%V     一年的第几周,周一为每周的第一天 (01..53) 

if [$a -lt 10] || [$a -gt 1]; then echo ok;fi
或者
if [$a -lt 10 -o $a -gt 1]; then echo ok;fi

%w     一周的第几天 (0..6);  0 代表周日 

exit返回码 exit 1 ,那么echo $? 就会显示1

%W    一年的第几周,周一为每周的第一天(00..53) 

 

%x     日期(mm/dd/yy) 

  1. if 判断文件、目录属性
    [ -f file ]判断是否是普通文件,且存在 [ ! -f file ]
    [ -d file ] 判断是否是目录,且存在 [ ! -d file ]
    [ -e file ] 判断文件或目录是否存在 [ ! -e file ]
    [ -r file ] 判断文件是否可读 [ ! -r file ]
    [ -w file ] 判断文件是否可写 [ ! -w file ]
    [ -x file ] 判断文件是否可执行 [ ! -x file ]
    [ -z $a ] 判断变量是否为空 [ ! -z  ]

%X     时间(%H:%M:%S) 

if 简化写法
[ -f 2.sh ] && echo “2.sh exits”

[ ! -f 2.sh ] || echo “2.sh exits”

%y     年份(00..99) 

 

%Y     年份 (1970…) 

 

%z     RFC-2822 风格数字格式时区(-0500) 

示例1

%Z     时区(e.g., EDT), 无法确定时区则为空 

read -p  xx  n  ,n只是一个变量名,你可以用x,y,z
#!/bin/bash
read -p “input a number” n
n2=`echo $n|grep -E ‘[^0-9]’|wc -l`


if [ $n2 == 1 ]
then
echo ” not a nubmer”
exit 1
fi

实例

n1=$[$n%2]

$ date -d “2010-11-15 23:00:01” 

if [ $n1 == 0 ]
then
echo “even”
else
echo “odd”
fi

Mon Nov 15 23:00:01 PST 2010 

示例2
#根据命令的返回值 echo $? echo $n|grep -q ‘[^0-9]’ 0是真 非0是假 
(if netstat -lnp |grep -Eq ‘:80’   精确匹配 有返回值是0
无返回值是假)
#!/bin/bash
read -p “input a number” n
#n2=`echo $n|grep -E ‘[^0-9]’|wc -l`
if echo $n|grep -q ‘[^0-9]’
then
echo ” not a nubmer”
exit 1
fi

$ date -d “2010/11/15 23:0:2” 

n1=$[$n%2]

Mon Nov 15 23:00:02 PST 2010 

if [ $n1 == 0 ]
then
echo “even”
else
echo “odd”
fi

$ date -d “2010/11/15T23:0:2” 

示例2
#根据命令的返回值 echo $? echo $n|grep -q ‘[^0-9]’ 0是真 非0是假
#!/bin/bash
read -p “input a number” n
#n2=`echo $n|grep -E ‘[^0-9]’|wc -l`
if echo $n|grep -q ‘[^0-9]’
then
echo ” not a nubmer”
exit 1
fi

Mon Nov 15 08:00:02 PST 2010 

n1=$[$n%2]

if [ $n1 == 0 ]
then
echo “even”
else
echo “odd”
fi

$ echo “2010-11-15 23:00:01” > date.txt 

示例3
[root@steven ~]# if ls /tmp/sdfsdf >/dev/null 2>&1 ;then echo
ok;else echo notok; fi
notok
[root@steven ~]# if [ $? == 0 ] ;then echo ok;else echo notok; fi
ok

$ echo “2010/11/15 23:00:02” >> date.txt 

示例4
exec表示后面的命令的输出都重定向到/tmp/$d.log
#!/bin/bash
d=`date +%F`
exec >/tmp/$d.log 2>&1
echo “begin at `date`”
ls /tmp/sdfsdfcd
cd /sdfsdf
echo “end at `date`”

$ cat date.txt 

 

2010-11-15 23:00:01 


2010/11/15 23:00:02 

扩展阅读

$ date -f date.txt 

Mon Nov 15 23:00:01 PST 2010 

 

Mon Nov 15 23:00:02 PST 2010 

附 表:
[ -a FILE ]  如果 FILE 存在则为真。  
[ -b FILE ]  如果 FILE 存在且是一个块特殊文件则为真。  
[ -c FILE ]  如果 FILE 存在且是一个字特殊文件则为真。  
[ -d FILE ]  如果 FILE 存在且是一个目录则为真。  
[ -e FILE ]  如果 FILE 存在则为真。  
[ -f FILE ]  如果 FILE 存在且是一个普通文件则为真。  
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。 [ -h FILE ]  如果
FILE 存在且是一个符号连接则为真。  
[ -k FILE ]  如果 FILE 存在且已经设置了粘制位则为真。  
[ -p FILE ]  如果 FILE 存在且是一个名字管道(F如果O)则为真。  
[ -r FILE ]  如果 FILE 存在且是可读的则为真。  
[ -s FILE ]  如果 FILE 存在且大小不为0则为真。  
[ -t FD ]  如果文件描述符 FD 打开且指向一个终端则为真。  
[ -u FILE ]  如果 FILE 存在且设置了SUID (set user ID)则为真。  
[ -w FILE ]  如果 FILE 如果 FILE 存在且是可写的则为真。  
[ -x FILE ]  如果 FILE 存在且是可执行的则为真。  
[ -O FILE ]  如果 FILE 存在且属有效用户ID则为真。  
[ -G FILE ]  如果 FILE 存在且属有效用户组则为真。  
[ -L FILE ]  如果 FILE 存在且是一个符号连接则为真。  
[ -N FILE ]  如果 FILE 存在 and has been mod如果ied since it was last
read则为真。  
[ -S FILE ]  如果 FILE 存在且是一个套接字则为真。  
[ FILE1 -nt FILE2 ]  如果 FILE1 has been changed more recently than
FILE2, or 如果 FILE1 exists and FILE2 does not则为真。  
[ FILE1 -ot FILE2 ]  如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1
不存在则为真。  
[ FILE1 -ef FILE2 ]  如果 FILE1 和 FILE2
指向相同的设备和节点号则为真。  
[ -o OPTIONNAME ]  如果 shell选项 “OPTIONNAME” 开启则为真。  
[ -z STRING ]  “STRING” 的长度为零则为真。  
[ -n STRING ] or [ STRING ]  “STRING” 的长度为非零 non-zero则为真。
 
[ STRING1 == STRING2 ]  如果2个字符串相同。 “=” may be used instead of
“==” for strict POSIX compliance则为真。  
[ STRING1 != STRING2 ]  如果字符串不相等则为真。
[ STRING1 < STRING2 ]  如果 “STRING1” sorts before “STRING2”
lexicographically in the current locale则为真。  
[ STRING1 > STRING2 ]  如果 “STRING1” sorts after “STRING2”
lexicographically in the current locale则为真。  
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These
arithmetic binary operators return true if “ARG1” is equal to, not equal
to, less than, less than or equal to, greater than, or greater than or
equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

 

$ ls -l 


total 4 

 

-rw-r–r– 1 znan sybase    40 Nov 15 21:14 date.txt 

sh -x 调试shell脚本

$ date -r date.txt 

sh -x 11.sh 
+ '[' 1 -eq 1 ']'
+ eco 1
11.sh: line 4: eco: command not found

Mon Nov 15 21:14:36 PST 2010 

 

sh -n  检查shell脚本语法

$ date -I 

sh -n 11.sh

2010-11-15 

 

$ date -Ihours 

sh -v  显示整个shell脚本并执行

2010-11-15T21-0800 

sh -v 11.sh 
#!/bin/bash
if [ 1 -eq 1 ]
then 
eco 1
else
echo 2
fi
11.sh: line 4: eco: command not found

$ date -Iminutes 

有时候使用-v选项会更加直观看到shell脚本的语法错误

2010-11-15T21:16-0800 

 

$ date -Iseconds 

 

2010-11-15T21:16:24-0800 

sh -c
启动一个子进程,执行字符串里的命令,字符串后面的参数作为字符串里命令的参数

sh -c 'ls /tmp'
或
sh -c 'ls ' /tmp

$ date -R 

 

Mon, 15 Nov 2010 21:47:08 -0800 

 

$ date -u 


Tue Nov 16 05:47:13 UTC 2010 

$( ) 和${ } 和$(( )) 与差在哪 

$( ) 引用结果

$ date +”Today is %A” 

${ }变量累加

Today is Monday. 

$(( )) 整数运算

$ date +”Date:%b. %e, %G” 

 

Date:Nov. 15, 2010 

a=sss
b=${a}123
echo $b
sss123
c=$(wc -l /etc/passwd|awk ‘{print $1}’)
echo $c
38
y=$((5+c))
echo $y
43

$ date +”Date: %b.%e, %G” 

n=$(wc -l 1.txt)

Date: Nov.15, 2010 

 

$ date +”%x %X” 


11/15/2010 09:50:21 PM 

shell数组简单用法

$ date +”%Y-%m-%d %H:%M:%S” 

2010-11-15 21:51:32 

1.数组定义, 一对括号表示是数组,数组元素用“空格”符号分割开。

$ date +”%Y-%m-%d %I:%M:%S %p” 

# a=(1 2 3 4 5)
# echo $a
1

2010-11-15 09:51:55 PM 

  1. 数组读取
    # echo ${#a[@]} //获取数组的元素个数
    # echo ${a[2]}
    //读取数组中的某一个元素,数标从0开始,a[0]是第一个元素
    # echo ${a[*]} //这样会打印整个数组的元素,或者使用 echo ${a[@]}

  2. 数组赋值
    # a[1]=100

$

# echo ${a[*]} 
1 100 3 4 5

================================================================================================================

# a[5]=100 
# echo ${a[*]}
1 100 3 4 5 100

1 获取当前时间戳

直接通过 数组名[下标]
就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素

date “+%s”          #从1970年1月1日00:00:00到当前的秒数

  1. 数组的删除
    # a=(1 2 3 4 5)
    # unset a
    # echo ${a[*]}

2 获取当前日期

# a=(1 2 3 4 5)
# unset a[1] 
# echo ${a[*]} 
1 3 4 5
# echo ${#a[*]}
4

date “+%Y-%m-%d”   
#格式串中不能有空白,如有,请将格式串整体放在双引号内

  1. 数组分片
    # a=(`seq 1 5`)
    # echo ${a[@]:0:3}
    1 2 3
    # echo ${a[@]:1:4}
    2 3 4 5

  2. 数组替换,可以echo替换,也可以直接赋值
    # a=(1 2 3 4 5) 
    # echo ${a[@]/3/100}
    1 2 100 4 5
    # echo ${a[@]}
    1 2 3 4 5
    # a=(${a[@]/3/100}) 
    # echo ${a[@]} 
    1 2 100 4 5

默认情况下,在显示日期和时间时,date命令使用数字0填充数字域。例如,如果用两位数字显示月份,则6月显示为“06”,也可以用下述控制符来控制填充符号。

 

短线(-):表示不填充数字域。


下划线(_):表示用空格填充数字域。

 

例如,命令date“+%d/%m”的输出为“02/01”;命令date “+%-d/%-m”
结果为1/3(3月1号的意思);命令date +%_d/%_m的输出为“ 1/ 5”。

SHELL变量名必须遵循下面规律

3 获得相对日期

1、首个字母必须为字母a-zA-Z

相对日期相对当前日期而言。d
选项还可以告诉您,相对于当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为
-d 选项的参数,就可以完成这项任务。

2、中间不能有空格,可以用下划线_

例如,您需要了解两星期以后的日期。如果您处于 Shell
提示符处,那么可以迅速地得到答案:

3、不能使用标点符号

$ date -d ’2 weeks’

4、不能用bash关键字(可用help命令查看是否保留关键字)

关于使用该命令,还有其他一些重要的方法:


使用 next/last指令,您可以得到以后的星期几是哪一天:

 

$ date -d ‘next monday’ (下周一的日期)

read命令

$ date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d

read命令
接受标准输入或其他文件描述符的输入,得到输入后,read命令将数据放入一个标准变量中

$ date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d

利用read读取文件时,每次调用read命令都会读取文件中的“一行”文本。当文件没有可读的行时,read命令以非零状态退出

$ date -d last-month +%Y%m(上个月是几月)

示例

$ date -d next-month +%Y%m(下个月是几月)

while read myline
do
echo "line: $myline"
done < /tmp/myfile.txt

使用 ago 指令,您可以得到过去的日期:

$ date -d ’30 days ago’ (30天前的日期)

cat /tmp/myfile.txt | while read myline
do
echo "line: $myline"
done

您可以使用负数以得到相反的日期:

$ date -d ‘dec 14 -2 weeks’ (相对:dec 14这个日期的两周前的日期)

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib,move $srcdir | while read file
do
for ip in $dstip
do
rsync -avH --port=873 --progress --delete --exclude-from=$excludedir $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done

$ date -d ‘-100 days’ (100天以前的日期)

$ date -d ’50 days’(50天后的日期)

read -p "input a number" n  或read  n  #监听终端的标准输入

4 日期转时间戳

当然也可以用for循环和sed -n “”p 读取文件的每行文本

date -d | –date= ‘yyyy-mm-dd hh:mi:ss’ +%s (日期格式为yyyy-mm-dd
hh:mi:ss)

  

如:date –date=”2010-12-03″ “+%s”   #–date后面接需要转换的日期


5 时间戳转日期

shell变量

date -d ’1970-01-01 UTC time seconds’ +”%Y-%m-%d %T %z” (time为时间戳)

在shell中有3种变量:系统变量,环境变量和用户变量,其中系统变量在对参数判断和命令返回值判断时会使用,环境变量主要是在程序运行时需要
readonly

如:date –date=”1970-01-01 UTC  1291363421 seconds” “+%Y-%m-%d”

local

date date –date=”@1291363421″ 竟然也行!!

declare

6 日期比较大小

另外,如果在赋值后不希望改变变量,使其类似于常数,则可以使用readonly命令将其设为只读。
//先赋值,再设置只读
#a=good
#readonly a
//或者直接在赋值时设置只读
#readonly a=good
此时若用unset命令重置变量a或者对a重新赋值,则会产生错误。
#unset a
-bash: a: readonly variable
#a=Good
-bash: a: readonly variable

(1)比较日期先后最简单的方法就是直接对日期的字符串进行比较。例如:

另外,shell的变量默认是全局作用的,如果需要在一定范围内生效,则需要加上local限制。例如local
a将设置a为局部变量。
Tar_Cd()
{
    local FileName=$1
    local DirName=$2
}

if [ “2010-12-31” < “2011-01-01” ]   #注意小于号的转义

数字和数组的声明
默认的赋值是对字符串赋值,例如执行如下脚本,就会发现这个脚本并没有使用5和6相加输出“11”,而是输出“5+6”。
#!/bin/bash
a=5
b=6
c=$a+$b
echo $c

if [[ “2010-12-31” < “2011-01-01” ]]  #此时不需要转义

如果要对数字或数组进行声明,则要declare命令,例如上例改成如下形式,即可正常进行加减。

(2)如果觉得(1)的方法不靠谱,那么也可以把日期先转换为时间戳,再进行时间戳的对比。 
stamp1=`date –date=$date1 +%s`

#!/bin/bash
declare -i a=5
declare -i b=6
declare -i c=$a+$b
echo $c

stamp2=`date –date=$date2 +%s`

declare支持的声明类型如下。使用“- 类型”开启,“+ 类型”关闭。
(1)i:定义整数integer
(2)a:定义数组array
(3)f:定义函数function
(4)r:定义为只读readonly
(5)x:定义为通过环境输出变量

stamp=`expr $stamp2 – $stamp1`

例如对声明数组变量的方法如下。
#!/bin/bash
declare -a arr=(a b c )

echo $stamp

 

if [ $stamp -gt 0 ]   #大于0


linux下时间戳转换 date

 

shell中获取时间戳的方式为:date -d “$currentTime” +%s

$ date -d @1337743485671 “+%c”
Sun 28 May 44361 12:41:11 PM CST

如果要将一个日期转为时间戳,方式如下:

1、得到当前时间

currentTime=`date “+%Y-%m-%d %H:%M:%S”`

2、将日期转为时间戳

currentTimeStamp=`date -d “$currentTime” +%s `
echo $currentTimeStamp

3.字符串转换为时间戳可以这样做:

date -d “2010-10-18 00:00:00” +%s

输出形如:

1287331200

其中,-d参数表示显示指定的字符串所表示的时间,+%s表示输出时间戳。

4.而时间戳转换为字符串可以这样做:

date -d @1287331200

输出形如:

Mon Oct 18 00:00:00 CST 2010

 


Shell脚本8种字符串截取方法总结

这篇文章主要介绍了Shell脚本8种字符串截取方法总结,每个方法给出了实例代码和操作结果,一目了然,需要的朋友可以参考下

 

echo ${var *  *  * }
#    匹配左边第一   留右  从左边起
## 匹配左边最后     留右  从左边起
%   匹配右边第一    留左  从右边起
%% 匹配右边最后     留左  从右边起

星号表示要删除的字符
var#  * // 
删除左边字符,保留右边字符。
var## * /
var%   /  *
var%%  /  *

Linux 的字符串截取很有用。有八种方法。
假设有变量 var=

  1. # 号截取,删除左边字符,保留右边字符。

    var=
    echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 //
号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm

  1. ## 号截取,删除左边字符,保留右边字符。

    var=
    echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除
结果是 123.htm

  1. %号截取,删除右边字符,保留左边字符

    var=
    echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:

  1. %% 号截取,删除右边字符,保留左边字符

    var=
    echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:

  1. 保留/打印从左边第几个字符开始,及字符的个数

    var=
    echo ${var:0:5}

其中的 0 表示左边第一个字符开始打印,5 表示字符的总个数。
结果是:http:

  1. 从左边第几个字符开始,一直到结束。

    var=
    echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

  1. 从右边第几个字符开始,及字符的个数

    var=
    echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123

  1. 从右边第几个字符开始,一直到结束。

    var=
    echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

 


花括号批量创建文件或目录

mkdir -p man/mm{1..6} 1..6 中间一定要是两点 !!!!!!
ll
total 24
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm1
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm2
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm3
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm4
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm5
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm6

 

 

f

网站地图xml地图