shell脚本基础

程序是由指令加数据组成

编程风格分为过程式和对象时

过程式:以指令为中心,数据服务于指令,适合小型程序

对象式:以数据为中心,指令服务于数据,社和大型程序

高级语言的执行方式分为编译型和解释型

编译型:先将高级语言通过编译器编译成二进制代码再执行

解释型:程序编写完成后不转换成二进制代码,在使用时才通过解释器解释运行,不生成二进制程序

shell就是一种解释器

程序的执行分为顺序执行,循环执行,条件执行

bash –n:检测脚本语法错误

bash –x:对脚本进行调试执行

PATH:默认不包括当前目录,要想直接执行脚本,除了要有执行权限,目录权限外还要写路径或将脚本所在路径加入PATH中

设置变量时使用  变量名=变量内容

注意:变量内容默认是字符型,变量内容有空格要用双引号引起来,变量名第一位不能是数字

删除变量时使用后  unset 变量名

bash是弱类型,变量无需事先定义,默认为字符型,参与运算时会自动进行隐式转换,不支持浮点式

变量命名规则:

不能使用程序保留字,如if,for等

只能使用字母,数字,下划线,不能数字开头

见命知意

统一命名规则

小驼峰:第一个单词首字母小写,其余首字母大写

大驼峰:所有单词首字母大写

set命令可以查询所有变量  env可以查询所有环境变量

各种变量范围

本地变量:对当前shell进程有效,对其他shell或当前shell子shell无效

环境变量:对当前shell及子shell有效

局部变量:对当前shell某片断有效

位置变量:$1,$2…..让脚本可以在代码中调用命令行中的参数

特殊变量:

$#:传递给脚本的参数个数

$1:传递给脚本的第一个参数

$@:传递给脚本的所有参数

$*:传递给脚本的所有参数(与$@相比,在加””情况下$*是把所有参数作为一个整体,$@是把每一个参数都单独列出来)

$?:上调命令执行结果

注:$10会被系统识别为$1   0

引用变量时要加$或者${}

定义环境变量可以使用export 或者declear –x

环境变量可以在定义时就声明或在定义普通变量后再进行声明

只读变量可以使用readonly 或者 declear –r

短路与:  第一个为0,后面不用继续运行  第一个为1,第二个必须要参与运算; 

短路或:  第一个为1,后面不用继续运行  第一个为0,第二个必须要参与运算;  

异或:^  异或的两个值,相同为假,不同为真

实现算术运算: 

1. let var=算术表达式

2.var=$[算术表达式] 

3.var=$((算术表达式)) 

4.var=$(expr arg1 arg2 arg3 …) 

5. declare –i var = 数值 

6. echo ‘算术表达式’ | bc

bash中的测试指令 test或 []或[[]]

数值比较:

gt:大于

ge:大于等于

lt:小于

le:小于等于

eq:等于

ne:不等于

字符串比较:

==:等于

!=:不等于

=~:前面的字符串能被后面的表达式所匹配(一般用在[[]]中)

>:大于

<:小于(<>比较的是字符的ascii码)

-z:字符串是否为空

-n:字符串是否为非空

存在性及类别测试

-e:文件是否存在

-b:文件是否为块设备文件

-c:文件是否为字符设备文件

-d:文件是否为目录文件

-f:文件是否为普通文件(包括了链接文件)

-p:文件是否为管道文件

-h/-L:文件是否为符号链接文件

-S:文件是否为套接字文件

-s:文件是是否存在且非空

-O:当前用户是否为该文件属主

-G:当前用户是否为该文件属组

-N:文件自上一次被读取后是否被修改过

双目测试:

#1-ef #2:两个文件是否指向同一个inode

#1-nt #2:文件1是否新与文件2

#1-ot #2: 文件1是否旧与文件2

组和测试

&&:并且

||:或者

!:非

#1&&#2 = [  #1 –a #2  ]

#1||#2 = [  #1 –o #2  ]

注:正则表达式需要写在[[]]中,而-a,-o则不支持[[]]

使用bash运行脚本相当于打开一个子shell运行

.或source相当于在当前shell运行命令

if语句使用方式

单分支:

if 判断条件;then

代码

else

代码

fi

多分支:

if 判断条件;then

代码

elif判断条件;then

代码

……

else

代码

fi

 

raad命令可以实现交互式输入变量

read –p:可以输出提示信息并接受变量

read –t:指定命令输入时间

case命令用法(case支持glob通配符):

case $变量 in 

判断条件)

分支1

;;

判断条件)

分支2

;;

……….

*)

默认分支

;;

esac

循环执行:将代码重复运行多次

for循环用法(比较适合数字)

for 变量名 in 列表;do

循环体

done

依次将列表中元素赋给变量,每次赋值后就执行循环体,知道列表中元素耗尽

列表生成方法:

1、直接给出

2、整数列表   {start…end}   $seq [start  end]

3、返回到列表的命令

4、使用通配符

5、变量引用

while循环用法

while 条件;do

循环体

done

进入循环前要先判断条件是否成立,每次循环后再次进行判断,直到条件不满足为止

判断条件中一般应有循环控制变量,该变量会随着循环体进行而修正

until循环用法

until 条件;do

循环体

done

进入循环前要先判断条件是否成立,不成立进入循环,成立则跳过

break:退出当前循环

exit:退出当前shell

continue:结束当次循环,继续下次循环

原创文章,作者:zzzzz1357x1,如若转载,请注明出处:http://www.178linux.com/36831

(0)
zzzzz1357x1zzzzz1357x1
上一篇 2016-08-18
下一篇 2016-08-18

相关推荐

  • OpenSSL用法详解

    OpenSSL用法详解 OpenSSL:        组件:libcrypto,libssl                 openssl &nb…

    Linux干货 2016-09-23
  • 计划任务&脚本进阶练习

    1、每天的2点和12点整,将/etc备份至/testdir/backup目录中,保存的文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz” mkdir /testdir/backup vim /root/bin/etcbak.sh tar cvf /testdir/backup/etcbak-`date “+%F-%H”`.tar.xz …

    Linux干货 2017-03-26
  • lvs——高可用集群

    技术简介: LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性 集群采用…

    Linux干货 2016-10-26
  • 马哥教育网络班21期-第三周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who|cut -d" " -f1|uniq -c|awk '{print $2}' 2、取出最后登录到当前系统的用户的相关信息。 last |awk 'NR==1{print $0}' last |sed -n &…

    Linux干货 2016-07-29
  • 马哥教育网络班20期+第5周课程练习

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@localhost ~]# grep '^[[:space:]]\+' /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至…

    系统运维 2016-07-12
  • vrrp_script高可用httpd&双主httpd

      vrrp_script高可用httpd 实验拓扑: HA01 192.168.150.137     MASTER HA02 192.168.150.137     BACKUP VIP 1921.168.150.131 实验1: 通过touch一个文件来控制keepalived主机的优先级 HA01的配…

    Linux干货 2016-12-06

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 09:26

    脚本语法需要总结好,更重要的是多写多练,作业需要好好完成呢