您的位置:时时app平台注册网站 > 彩世界网址 > centos shell脚本编制程序1 正则 shell脚本结构

centos shell脚本编制程序1 正则 shell脚本结构

2019-11-01 11:47

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

背景:

每一天营造的东西,按日期放到分歧的文书夹里。最近日的营造放到二零一五-06-01里,前天的就放到二〇一五-06-02里,依次类推。时间久了,须求一个剧本删除N天前的文件夹。(本例中N=7,即除去31日前的塑造)。

上面直接上代码,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


背景: 每一天营造的东西,按日期放到差异的公文夹里。如前日的创设放到二零一五-06-01里,后日的就放到二零一四-06-02里,...

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

 

  %D 短期格式 (mm/dd/yy)

 

  %P 小写的当前域的上早上提示 (blank in many locales)

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

还会有任何用法:

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

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

各种组织语句前边都得以加分号表示语句的终止,不过分多行来书写不会加此外分号越来越雅观

  %n 换行

 


 

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

3.字符串调换为时间戳能够这样做:

   date -d "-1 month" " %Y%m%d %A"

 

   date -d "2 day" " %Y%m%d %A"

  

#date -d "-1week" " %Y%m%d %A"


下一场 awk -v 作为三个参数那样传进去不问题。

示例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`"

  %N 十亿分之风姿洒脱秒(000000000..999999999)

  1. 保留/打字与印刷从右侧第多少个字符开首,及字符的个数

    var= echo ${var:0:5}

lastmonth=`date %Y-%m --date="-1 month"`"-01";

  1. 学会date命令的用法
    指令格式:date [参数]... [ 格式]
    筛选参数:
    -d<字符串>  显示字符串所指的日子与时光。字符串前后必得抬高双引号。
    -s<字符串>  依据字符串来设置系统日期与时间。字符串前后必得抬高双引号。

  %l 短格式12时辰制的钟点 ( 1..12)

2、将日期转为时间戳

或者:#date -d "last week" %Y%m%d

 

   date -d "-1 day" " %Y%m%d %A"   或 date --date="1 day ago"" %Y%m%d %A"

  1. 从右侧第多少个字符最早,及字符的个数

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

   date -d "-2 day" " %Y%m%d %A"   或 date --date="2 days ago"" %Y%m%d %A"

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

[ ! -f 2.sh ] || echo "2.sh exits"

   date -d "1 day" " %Y%m%d %A"

 

成立以目明天子为文件名的

内容大致:

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

 

已知日子戳,求当前不久子
date --date="19700101 $(($((`date %s`)) (8*60*60))) sec" %Y%m%d" "%H:%M:%S
PS:从1970年0一月01日开始算,  $(($((`date %s`)) (8*60*60))) sec 表示过了有个别秒,在那之中(8*60*60)表示8个时辰,时区问题,国内时间与世界时间相差8钟头。

declare补助的扬言类型如下。使用“- 类型”开启,“ 类型”关闭。
(1)i:定义整数integer
(2)a:定义数组array
(3)f:定义函数function
(4)r:定义为只读readonly
(5)x:定义为经过境况输出变量

  %r 12时辰制的时间表示(时:分:秒,双位) time, 12-hour (hh:mm:ss [AP]M)
  %福特Explorer 24小时制的光阴代表 (时:分,双位)time, 24-hour (hh:mm)
  %s 自基础时间 1968-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脚本总计离自个儿出生之日还也会有多少天?

 

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

exit重返码 exit 1 ,那么echo $? 就博览会示1

date %s   能够得到UNIX的流年戳;

#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

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

mkdir `date %Y%m%d`

shell数组轻便用法

  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." #出口结果,秒换算为天  

瞩目:脚本写到大器晚成行最棒用分号; 

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


  %h same as %b

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

 

 

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

用多个括号能够制止使用lt,gt
if (($a<3)); then echo ok;else echo nook;fi
if (($a>3)); then echo ok;else echo nook;fi

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

假诺要将三个日期转为时间戳,形式如下:

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

echo ${var *  *  * }
#    相配侧边第大器晚成   留右  从左边起
## 相配左侧最后     留右  从侧面起
%   相配侧边第黄金时代    留左  从侧面起
%% 相配左侧最终     留左  从侧面起

   echo `date -d"-1 month" " %Y-%m-%d %X"`

 

就那样类推:date命令获得前几天,不久前,今日,后天,这两日,下一个月的日子

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`

 

currentTimeStamp=`date -d "$currentTime" %s `
echo $currentTimeStamp

   date -d "1 month" " %Y%m%d %A"

 

#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 一九八六)
  %C n百年 [00-99]
  %d 两位的天 (01..31)

sh -n 11.sh

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

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

备份以时间做为文件名的

 

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

 

[plain] view plaincopy

 
if 命令 
判定的根底
1、有重返值 每一个命令都有重临值
2、有不利的重返值 0是真 非0是假 echo $?

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

  %p 大写的当前域的上早上提醒 (blank in many locales)

n1=$[$n%2]

表示从左边第多少个字符最早,一直到告竣。
结果是:123.htm
注:(右侧包车型大巴率先个字符是用 0 表示,左侧的第一个字符用 0-1 表示)

2、中间无法有空格,能够用下划线_

示例1

  1. 从侧边第多少个字符起头,一向到甘休。

    var= echo ${var:0-7}

 

  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一览

 

shell中获取时间戳的办法为:date -d "$currentTime" %s

##*/ 表示从左边发轫删除最终(最右面)三个 / 号及右边包车型地铁具备字符
即删除
结果是 123.htm


$(( )) 整数运算

 

突发性使用-v选项会尤其直观看到shell脚本的语法错误

SHELL变量名必需依据上边规律

 

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

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

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

 

${ }变量累计

read命令 选择职业输入或其余文件叙述符的输入,获得输入后,read命令将数据放入二个专门的学业变量中

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

%/* 表示从右边先导,删除第1个 / 号及侧边的字符
结果是:

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

    var= echo ${var##*/}

 

declare

1、获得当前时刻

理所必然也能够用for循环和sed -n ""p 读取文件的每行文本

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

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

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

n=$(wc -l 1.txt)

示例

个中的 0 表示侧面第三个字符起头打字与印刷,5 表示字符的总个数。
结果是:http:

 

 

sh -c 运维叁个子历程,施行字符串里的授命,字符串后面包车型地铁参数作为字符串里发令的参数

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

花括号批量开立文件或目录

 

 

 

sh -n  检查shell脚本语法

例子

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

 

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

sh -v  展现整个shell脚本并实行

那篇小说首要介绍了Shell脚本8种字符串截取方法总计,每一种方法给出了实例代码和操作结果,了如指掌,供给的意中人能够参照下

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

$( ) 援用结果

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

date -d @1287331200

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

/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

sh -x 调试shell脚本

  1. 从左边第多少个字符领头,一贯到结束。

    var= echo ${var:7}

 

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

  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

 

 

中间的 7 表示左侧第8个字符发轫,一贯到截至。
结果是 :www.aaa.com/123.htm

 

Mon Oct 18 00:00:00 CST 2010

 

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

出口形如:

 

在shell中有3种变量:系统变量,情状变量和顾客变量,当中系统变量在对参数剖断和下令重临值判定时会使用,意况变量首借使在程序运维时索要
readonly

 

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

f

专心,if 命令无法加中括号  ,if [ 命令 ]是错的

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

3、不能动用标点符号

扩大阅读

 

附 表:
[ -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 ]  “ST奥迪Q5ING” 的长度为零则为真。  
[ -n STRING ] or [ STRING ]  “ST揽胜ING” 的长度为非零 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.

示例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

  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(){} 正确

 


接受read读取文件时,每一趟调用read命令都会读取文件中的“生机勃勃行”文本。当文件未有可读的行时,read命令以非零状态退出

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

    var= echo ${var%%/*}


date -d "2010-10-18 00:00:00" %s

local


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

1、第一个假名必需为字母a-zA-Z

要是要对数字或数组进行宣示,则要declare命令,举例上例改成如下方式,就可以不荒谬进行加减。

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

 

1.数组概念, 风流倜傥对括号表示是数组,数组成分用“空格”符号分割开。

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

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

 

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

在那之中 var 是变量名,# 号是运算符,*// 代表从右边初阶删除第二个 // 号及右边的享有字符
即删除 http://
结果是 :www.aaa.com/123.htm

 

 

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

n1=$[$n%2]

对比

 

shell变量


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

 

数学生运动算a=1;b=2; c=$(($a $b))只怕$[$a $b]
变量的功效域和属性 :readonly 、local

currentTime=`date " %Y-%m-%d %H:%M:%S"`

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 避免输出
cat /tmp/myfile.txt | while read myline
do
echo "line: $myline"
done

 

linux下岁月戳转换 date

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

在意:假设有空格须求用双引号引起来: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" 二〇一六-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"

输出形如:

 

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

    var= echo ${var%/*}

直接通过 数组名[下标] 就足以对其实行援用赋值,尽管下标荒诞不经,自动加多新二个数组成分

 

里面包车型大巴 0-7 表示侧面算起第多少个字符伊始,3 表示字符的个数。
结果是:123

举个例子对注解数组变量的章程如下。
#!/bin/bash
declare -a arr=(a b c )

数字和数组的扬言
暗许的赋值是对字符串赋值,比方执行如下脚本,就能够意识这几个本子并未接纳5和6相加输出“11”,而是输出“5 6”。
#!/bin/bash
a=5
b=6
c=$a $b
echo $c

  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

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

    var= echo ${var#*//}

sh -c 'ls /tmp'
或
sh -c 'ls ' /tmp
  1. 数组读取
    # echo ${#a[@]} //获取数组的因素个数
    # echo ${a[2]} //读取数组中的某二个因素,数标从0开端,a[0]是第二个元素
    # echo ${a[*]} //那样会打字与印刷整个数组的元素,只怕接受 echo ${a[@]}

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

  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
  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  ]

Linux 的字符串截取很有用。有四种办法。
若是有变量 var=

示例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


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

%%/* 表示从侧边初始,删除最终(最左侧)贰个 / 号及左侧的字符
结果是:http:

read命令

示例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

其余,shell的变量默许是全局意义的,假设要求在早晚约束内卓有功能,则必要加多local约束。举个例子local a将设置a为部分变量。
Tar_Cd()
{
    local FileName=$1
    local DirName=$2
}

 

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


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

n1=$[$n%2]

1287331200

别的,假使在赋值后不期望退换变量,使其相像于常数,则足以应用readonly命令将其设为只读。
//先赋值,再安装只读
#a=good
#readonly a
//或然直接在赋值时设置只读
#readonly a=good
那个时候若用unset命令重新设置变量a也许对a重新赋值,则会发出错误。
#unset a
-bash: a: readonly variable
#a=Good
-bash: a: readonly variable

里头,-d参数表示展现钦定的字符串所代表的日子, %s表示输出时间戳。

本文由时时app平台注册网站发布于彩世界网址,转载请注明出处:centos shell脚本编制程序1 正则 shell脚本结构

关键词: