shell脚本编程

shell脚本基础篇——简单介绍脚本的书写规范

编程基础

程序:指令+数据

程序编程风格:过程式:以指令为中心,数据服务于指令

对象式:以数据为中心,指令服务与数据

shell程序:提供了编程能力,解释执行

程序的执行方式:

计算机:运行二进制指令

高级语言 :   编译:   高级语言            编译器           目标代码(Java,c#)

解释:   高级语言           解释器          机器代码(shell,Perl,Python)

编程基本概念

编程逻辑处理方式:顺序执行、循环执行、选择执行

Shell编程:过程式、解释执行

编程语言的基本结构:

各种系统命令的组合

数据存储:变量、数组

表达式:a   +   b

语句:if

Shell脚本基础

Shell脚本:包含一些命令或声明,并符合一定格式的文本文件

格式要求:首行shebang机制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

Shell脚本的用途:自动化常用命令;执行系统管理和故障排除;创建简单的应用程序;处理文本或文件

创建shell脚本:1.用文本编辑器来创建文本文件(第一行必须包括shell声明序列;添加注释)    2.运行脚本(给予权限;直接运行解释器)

脚本规范

脚本代码开头约定

1、第一行一般为调用使用的语言

2、程序名,避免更改文件名为无法找到正确的文件

3、版本号

4、更改后的时间

5、作者相关信息

6、该程序的作用,及注意事项

7、最后是各版本的更新简要说明

脚本调试

bash   -n   脚本名       //检测脚本中的语法错误:语法错误,后续命令不执行;不是语法错误,后续命令继续执行

-x    脚本名      //调试执行   可查看脚本的执行过程

++    代表嵌套深度

变量:(强类型、弱类型)

如果命令可以识别变量,就可以不加$符号

$变量  //引用变量   若变量超过十个,需要用{}引起来

echo  “$变量”   //变量若赋值一个文件的内容,输出时加引号可保留原格式

变量作用:

  1. 数据存储格式
  2. 参与的运算
  3. 表示的数据范围

变量的命名法则:

  1. 不能使用程序中的保留字
  2. 只能使用数字、字母、下划线,且不能以数字开头
  3. 见名知义(最好用英文单词)
  4. 统一命名规则:驼峰命名法

=   //给变量赋值

变量种类:局部变量:【只对当前的进程有效,不能传给子进程;只在当前会话有效】、环境(全局)变量:在【父进程定义的变量,子进程可继承】、本地变量、位置变量、特殊变量

pstree   -p   //显示所有进程关系

echo  $$   //显示当前进程编号

echo   $PPID   //查看父进程编号

export   变量    //定义环境变量(declare  -x   变量)

set    //可以查看到全部的变量,还有函数信息

unset  变量    //取消给变量的赋值(变量前未加$)

$SHLVL     //查看shell的嵌套次数

 

echo   后跟的认为是字符串,直接写$CMD认为是命令

 1

 $_        //上一个命令的最后一个参数

显示所有的环境变量:env       ;     printenv      ;export     ;    declare  -x

声明只读变量:readonly   name    或者  declare   -r   name

查看只读变量:  readonly   -r  name         declare –r   //查看所有常量(readonly -p)

 

( name=haha; touch  /data/$name.log )   //小括号用于临时引用变量,开启子shell,不影响当前shell环境(该子shell,不同于之前子进程)

{  name=haha; echo $name;  }   //大括号影响当前shell环境,不开启子shell

 

位置变量

$数字   //代表第几个位置变量

$0      //代表命令本身的整个路径(若是软链接可用$0实现不同的功能)

$*      //代表传递给脚本的所有参数,全部参数合为一个字符串

$@     //代表传递给脚本的所有参数,全部参数为独立的字符串

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

set   —    //清空所有位置变量

shift     数字 //每执行一次将所有的位置参数向左移几位(默认1位)

 

退出状态

$?   //可用来查看上条命令的执行结果,0代表成功,其他代表失败

$?对于脚本来讲:脚本的返回结果正确与否,是由最后一条命令决定的

bash 的自定义退出码:  exit   [数字]

 

算数运算:+   –   *    /     %(取余)       **(乘方)

RANDOM       //随机数生成器

*//特定情况下需要转义

实现算数运算:let  sum=i+j;  $[i+j];   $((i+j));   expr   i  +  j  ;

declare   -i  n=10   //将变量n声成整数     ;   echo   1+3  |bc

a=$((a^b));b=$((a^b));a=$((a^b));echo $a $b   //实现a,b的值互换

逻辑运算(&与          |或         !非)

0   false                     1   true

cmd1   短路与(&&)   cmd2

如果cmd1为假,将不执行cmd2

如果cmd1为真,将执行cmd2

 

cmd1   短路或 (||)  cmd2

如果cmd1为假,将执行cmd2

如果cmd1为真,将不执行cmd2

 

异或XOR(^):相同为假,不同为真  (通过异或的中间值可实现两个数值的转换)

德摩根定律

(非A)与(非B)=非(A或B)

(非A )或 (非B ) =非(A与B)

[[ $filename =~ .+\.sh$ ]] && echo sh || echo no sh    //判断文件的后缀是否为.sh

条件测试:判断某需求是否满足

测试命令:test  EXPRESSION

[  EXPRESSION  ]     变量在中括号使用时,用双引号引起来

[[ EXPRESSION  ]]     //支持扩展的正则表达式  (=~  代表左侧字符串是否匹配右侧的正则;==右侧支持通配符)

表达式1   -a   表达式2      //与关系,都真结果才为真

表达式1   -o   表达式2      //或关系,都假结果才为假

-z     //判断字符串是否为空,为真代表空

-n    //判断字符串是否为空,为真代表非空(-n可以省略不写)

[    x”$var”   =  “ x”  ]          //也可用来判断字符串是否为空

-v      //判断变量是否被设置

-a 或-e   //判断文件是否存在

数值测试

gt    大于                 ge    大于等于                          eq   等于(比较数字)

lt    小于                   le     小于等于                         ne   不等于

字符串测试

=~        (代表左侧字符串是否匹配右侧的正则)

read     //实现对变量的赋值,可赋值多个变量(建议一次赋一个值)

-p    //指定提示内容

-s    //静默输入

-n   //指定输入的字符长度

-d   //可指定结束符

-t   //设置超时时间

read   x y z   <<<”I   j   k  ”   //实现批量赋值将ijk  分别赋给变量xyz

 

Bash如何展开命令行

  1. 把命令行分成单个命令词
  2. 展开别名
  3. 展开大括号的声明( {} )
  4. 展开波浪符声明( ~   )
  5. 命令替换$() 和       )
  6. 再次把命令行分成命令词
  7. 展开文件通配( *    ?   [abc] 等等)
  8. 准备I/O重导向( <     >)
  9. 运行命令

Profile 类:

按功能划分:profile类和bashrc类

Profile 类:为交互式登录的shell提供配置

功用:用于定义环境变量、运行命令或脚本

Bashrc类:为非交互式和交互式登录的shell提供配置

功用:定义命令别名和参数、定义本地变量

$- 变量 (默认功能组合himBH

h  //代表hash           set   +h     //禁用hash              set   -h         //启用hash

i    //代表当前环境是不是交互式环境

m   //代表打开监控模式

B   //代表大括号扩展

H  //代表可以展开历史列表中的命令       !!代表返回最近的一个历史命令

 

.     source     bash      直接运行脚本 之间的区别

bash  或者 直接运行脚本   //两者等价,都开启子进程

source       //表示在当前shell中运行脚本,影响当前的工作环境

source   或   .    //一般用来运行配置文件

 

脚本中不识别别名,可以使用内部命令、外部命令

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/95744

发表评论

登录后才能评论

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班