centosshell脚本编程1正则shell脚本结构read命令date命令的⽤
法she。。。
centos  shell脚本编程1 正则  shell脚本结构  read命令  date命令的⽤法  shell中的逻辑判断  if 判断⽂件、⽬录属性  shell数组简单⽤法 $( )和${ } 和$(( )) 与  sh -n  sh -x  sh -v 第三⼗五节课
Shebang/Sha-bang
在计算机科学中, Shebang (也称为Hashbang)是⼀个由井号和叹号构成的字符串⾏(#!), 其出现在⽂本⽂件的第⼀⾏的前两个字符.
在⽂件中存在Shebang的情况下, 类Unix操作系统的程序载⼊器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调⽤该指令, 并将载有Shebang的⽂件路径作为该解释器的参数. 例如, 以指令#!/bin/sh开头的⽂件在执⾏时会实际调⽤/bin/sh程序.)
#!⽤于帮助内核到相应的解释器,只有被直接执⾏的⽂件中才有必要加⼊#!
Shebang指明了执⾏这个脚本⽂件的解释程序。
1. 如果脚本⽂件中没有#!这⼀⾏,那么它执⾏时会默认⽤当前Shell去解释这个脚本(即:$SHELL环境变量)。
2. 如果#!之后的解释程序是⼀个可执⾏⽂件,那么执⾏这个脚本时,它就会把⽂件名及其参数⼀起作为参数传给那个解释程序去执⾏。
3. 如果#!指定的解释程序没有可执⾏权限,则会报错“bad interpreter: Permission denied”。
如果#!指定的解释程序不是⼀个可执⾏⽂件,那么指定的解释程序会被忽略,转⽽交给当前的SHELL去执⾏这个脚本。
4. 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。
注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会⾃动到$PATH中寻解释器的。
5. 当然,如果你使⽤”bash test.sh”这样的命令来执⾏脚本,那么#!这⼀⾏将会被忽略掉,解释器当然是⽤命令⾏中显式指定的bash。
注意:脚本写到⼀⾏最好⽤分号;
if ls /tmp/sdfsdf >/dev/null 2>&1 ;then echo ok;else echo notok; fi
每个结构语句后⾯都可以加分号表⽰语句的结束,但是分多⾏来书写不会加任何分号更加美观
#!/bin/bash
cd /etc/ ;
for a in `ls /etc/` ;
do
if [ -d /etc/$a ]  ;
then
ls -d /etc/$a ;
fi ;
done ;
对⽐
#!/bin/bash
cd /etc/
for a in `ls /etc/`
do
if [ -d /etc/$a ]
then
ls -d /etc/$a
fi
done
上半节课
正则
date命令的⽤法
下半节课
shell中的逻辑判断
if 判断⽂件、⽬录属性
shell数组简单⽤法
sh -n sh -x  sh -v
$( ) 和${ } 和$(( ))
内容概要:
1. shell脚本是什么
它是⼀种脚本语⾔,并⾮编程语⾔
可以使⽤⼀些逻辑判断、循环等语法
可以⾃定义⼦函数
是系统命令的集合
shell脚本可以实现⾃动化运维,⼤⼤增加我们的⼯作效率
正则
.:任意⼀个字符
*:结合星号前⾯的符号,a* 0个或多个a
+:grep不可以直接,加⼤E 或者egrep 或者脱义符号 grep 'a\+' ⼀个或多个a
:0个或多个a
.*:贪婪匹配
():匹配,然后替换
(ab){2,4}:出现2到4次ab
[^:]+:⾮冒号开头的⼀个或多个
([^:]+)(:.*:)([^:]+) 匹配多段
sed -r 's/([^:]+)(:.*:)([^:]+) /\3\2\1/' /etc/passwd
awk -F ':' '{print $7}' /etc/passwd
2. shell脚本结构以及执⾏⽅法以及命名规则
开头⾏指定bash路径: #! /bin/bash
以#开头的⾏作为解释说明
脚本的名字以.sh结尾,⽤于区分这是⼀个shell脚本
执⾏⽅式有两种:chmod +x 1.sh; ./1.sh 如果没有执⾏权限可以 bash 1.sh
exists的用法
bash -x 1.sh 可以查看脚本执⾏过程
shell的变量和函数命名不能有横杠,只能是⼤⼩写字母、下划线、数字例如  check-service(){} 错误 check_service(){} 正确
3. 学会date命令的⽤法
命令格式:date [参数]... [+格式]
选择参数:
-d<;字符串>  显⽰字符串所指的⽇期与时间。字符串前后必须加上双引号。
-s<;字符串>  根据字符串来设置系统⽇期与时间。字符串前后必须加上双引号。
注意:如果有空格需要⽤双引号引起来: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 "-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"
4. shell脚本中的变量
当脚本中使⽤某个字符串较频繁并且字符串长度很长时就应该使⽤变量代替
使⽤条件语句时,常常使⽤变量 if [ $a -gt 1 ]; then ... ; fi
引⽤某个命令的结果时,⽤变量替代 n=`wc -`或者 n=$(wc -)
写和⽤户交互的脚本时,变量也是必不可少的 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⼀览
数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
变量的作⽤域和属性:readonly 、local
5. 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
⽤两个括号可以避免使⽤lt,gt
if (($a<3)); then echo ok;else echo nook;fi
if (($a>3)); then echo ok;else echo nook;fi
字符串⽐较⽤(==)和(!=) ,不能⽤-eq和 -ne
if [ "s" == "e" ]; then echo 1 ;fi
if [ "s" != "e" ]; then echo 1 ;fi
if:
格式:注意[]两边都有空格逻辑操作符两边也要留空格
#!/bin/bash
if [ 1 == 2 ]
then
echo true;
elif [ 1 == 3 ] ;then
echo false;
else
echo error;
fi
< lt
>= ge
<= le
== eq
!= ne
if 命令
判断的基础
1、有返回值每个命令都有返回值
2、有正确的返回值 0是真⾮0是假 echo $?
注意,if 命令不能加中括号,if [ 命令 ]是错的
例⼦
if ping -c 1192.168.1.106 >/dev/null2>&1 ; then echo1; else echo2; fi if sed -i 's/i/gg/
if /bin/true ;
grep -q 避免输出
if [$a -lt 10] && [$a -gt 1]; then echo ok;fi
或者
if [$a -lt 10 -a $a -gt 1]; then echo ok;fi
if [$a -lt 10] || [$a -gt 1]; then echo ok;fi
或者
if [$a -lt 10 -o $a -gt 1]; then echo ok;fi
exit返回码 exit 1 ,那么echo $? 就会显⽰1
6. 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  ]
if 简化写法
[ -f 2.sh ] && echo "2.sh exits"
[ ! -f 2.sh ] || echo "2.sh exits"
⽰例1
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]
if [ $n1 == 0 ]
echo "even"
else
echo "odd"
fi
⽰例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
n1=$[$n%2]
if [ $n1 == 0 ]
then
echo "even"
else
echo "odd"
fi
⽰例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
n1=$[$n%2]
if [ $n1 == 0 ]
then
echo "even"
else
echo "odd"
fi
⽰例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
⽰例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`"
扩展阅读

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。