shell脚本编程基础

编程基础

程序:指令+数据
 程序: 算法+数据结构
数据:是程序的核心
数据结构:数据在计算机中的类型和组织方式
算法: 处理数据的方式
程序编程风格:
过程式 :以指令为中心,数据服务于指令
对象式 : 以数据为中心,指定服务于数据
shell程序: 提供了编程能力,解释执行

程序的执行方式

计算机:运行二进制指令
编程语言:人与计算机之间交互的语言
低级编程语言:
机器:二进制的0和1的序列
低级:汇编
高级编程语言:
编译:高级语言---编译器---机器代码---执行    
         c,   c++
解释:高级语言--执行--×××--机器代码
          shell   python   java

编程基本概念:

编程逻辑处理方式:
   顺序执行
   循环执行
   选择执行
shell编程:过程式,解释执行
 编程语言的基本结构
  各种系统命令的组合
   数据存储:变量,数组
表达式:a+b
shell脚本基础

shell脚本: 包含一些命令或声明,并符合一定格式文本文件 格式要求:首行shebang机制 #! /bin /bash #!/usr /bin/python

shell脚本的用途有:

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

创建shell脚本

第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列 :#!
   #! /bin/bash
   添加注释
	注释以#开头
第二步:运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行

脚本规范

1:第一行一般为调用的语言
2:程序名,避免更改文件名为无法找到的文件
3:版本号
4:更改后的时间
5:作者相关信息
6:该程序的作用,及注意事项
7:最后是个版本的更新简要说明

脚本调试

检测脚本中的语法错误
bash -n /path/to/some_script
调试执行
bash -x /path/to/some_script

变量

变量:命令的内存空间
         数据存储方式
         字符
         数值:整型,浮点型
变量:变量类型
	作用: 1:数据存储格式
          2:参与的运算
           3:表示的数据范围
类型:
        字符
           数值:整型,浮点型

变量:

强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转 换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明 变量会产生错误    
如   java,c# 
弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符 型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用 
 如:bash 不支持浮点数,php   

变量命令法则:

1:不能使用程序中的保留字:例如if,for
2:   只能使用数字
3:见名知义
4:统一命令规则:驼峰命名法

bash中变量的种类

根据变量的生效范围等标准划分下面变量类型: 
			局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括 当前shell的子shell进程均无效 
  环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片段,通常指函数
位置变量:  :$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它 的参数  
特殊变量::$?, $0, $*, $@, $#,$$ 

局部变量:

局部变量即普通变量   只能当前进程使用 ,子进程不能使用
变量赋值:name=‘value’
可以使用引用‘value’
		(1)可以是直接字符;name=“root“
      (2)变量引用:name="$USER" 
           (3) 命令引用:name=`COMMAND`  name=$(COMMAND) 变量引用:${name}   $name 
变量引用:${name}  $name 
			" ":弱引用,其中的变量引用会被替换为变量值
  ’ ‘:强引用,,其中的变量引用不会被替换为变量值,而保持原字符串 
显示已定义的所有变量:set
删除变量:unset name

环境变量:

环境变量   当前可以使用,子进程也能使用 父进程不能使用    加上export  例如:export    name=`hostname`
export  [只看环境变量]      set[所有变量都在里面]              unset name [取消删除变量]
	变量声明 、赋值:  
export name=VALUE 
 declare -x name=VALUE 
	变量引用:$name, ${name} 

显示所有环境变量:

env 
 printenv 
	 export  
declare -x 
删除变量:  unset name 
bash内建的环境变量:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
	HOSTNAME
HISTSIZE

只读和位置变量

只读变量:只能声明,但不能修改和删除  【例:readonly   name=dang     这就是只读变量     不能删除但是exit退出来只读变量就没有了】
查看已读变量:readonly -p 
位置变量::在脚本代码中调用通过命令行传递给脚本的参数 
    $1, $2, ...:对应第1、第2等参数,shift [n]换位置
    $0: 命令本身
     $*: 传递给脚本的所有参数,全部参数合为一个字符串  
     $@: 传递给脚本的所有参数,每个参数为独立字符串  
      $#: 传递给脚本的参数的个数  
      $@ $* 只在被双引号包起来的时候才会有差异  
 set -- 清空所有位置变量 

退出状态:

  进程使用退出状态来报告成功或失败
 0 代表成功      1-255代表失败
$?变量保存最近的命令退出状态
例如: 
   ping -c1 -W1 hostname &>/dev/null
        echo $?

退出状态码

bash自定制退出状态码
	exit [n] :自定义退出状态码
	注意: 脚本中一旦遇到exit命令,脚本会立刻终止;终止退出状取决于exit命令后面的数字
		注意::如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行 的最后一条命令的状态码 

逻辑运算:

true【真】,false【假】
            1,0  
							
与:
    1 与 1 = 1 
    1 与 0 = 0                                 &【代表与】
     0  与 1 = 0
     0 与 0 = 0 
或:
    1 或 1 = 1
    1 或 0 = 1  
     0 或 1 = 1                                  |【代表或】
     0 或 0 = 0 

逻辑运算
非:	!
    !1=0
    !0=1  

短路运算

短路与
      第一个为0 ,结果必定为0                              &&【代表短路与】
       第一个为1 ,第二个必须要参与运算
例: ls dng  &>/dev/null   && chmod +x dang 【意思: 如果前面命令存在就给他加执行权限】   


短路或
      第一个为1 ,结果必定为1                                ||【代表短路或】
       第一个为0, 第二个必定要参与运算
例:id dang &>/dev/unll  || useradd dang      【意思: 如果前面没有这个目录就创建】   

异或于同或

异或:^
      异或的两个值,相同为假,不同为真
同或:
相同为1 ,不同为0
条件性的执行操作符
根据退出状态而定,命令可以有条件地运行
 && 代表条件性的AND  THEN
 ||  代表条件性的OR  ELSE 

bash的数值测试:

-v VAR
变量VAR是否设置
数值测试:
   -gt 是否大于
   -ge 是否大于等于
   -eq 是否等于
   -ne  是否不等于
   -lt  是否小于
    -le  是否小于等于

bash 的字符串测试

     字符串测试:
              = 是否等于   
               > ascii码是否大于ascii码 
               < 是否小于   
                =~ 左侧字符串是否能够被右侧的PATTERN所匹配    【类似于包含】
                          注意: 此表达式一般用于[[  ]]中;扩展的正则表达式  

[[ ]] ==相同,字符串不加“” 支持通配符 =~ 匹配,字符串不要加“”支持扩展正则表达式

bash的文件测试

存在性测试
-a   并且
-o    或者
-e 文件存在性测试,存在为真不存在为假
-b  文件 :是否存在且为块设备文件
-c  文件 :是否存在且为字符设备文件
	-d              是否               目录文件
-f                                      普通文件
-h或-l                                链接文件
	-p                                      命令管道文件
-S                                       套接字文件
-w                                       可写文件
	-o 当前有效用户是否为文件属组
-G 当前有效用户是否为文件属组

-r                                        存在且 可读文件
-w                                        存在且可写文件
-x                                         存在且可执行  
例:查看/etc/issue是不是普通文件,如果是打印shi 如果不是打印bushi
    [   -f   "/etc/issue"   ]  && echo shi   ||  echo bushi
查看/dev/sda是不是块文件,如果是打印shi 如果不是打印bushi
    [  -b     "/dev/sda"   ]  && echo shi  || echo   bushi 
查看f1是不是普通文件并且有执行权限,如果是就加上r权限 如果不是打印bushi
  file=f1; [ -f "$file" -a  -x "$file" ] && chmod +r "$file"|| echo bushi 
查看f1如果没有执行权限,如果是就加上w权限 如果不是打印bushi
    file=f1; [ !  -x "$file" ] && chmod +w "$file"|| echo bushi
阻止普通用户登入 : touch /etc/nologin 【创建/etc/nologin文件】
把 buyunxuputongyonghudengru >/etc/nologin 【把前面字符写入,etc/nologin中  每当普通用户登入时会显示前面的字符】

使用read命令来接受输入

	使用read来把输入值分配给一个或多个shell变量
 -p 指定要显示的提示        read -p "please input your passwd "   passwd   【会显示提示  ,后面的passwd是赋值   就是把前面输入的只赋给passwd】
 -s   静默输入,一般用于密码 
-n  N 指定输入的字符长度N
 -d ‘字符’  输入结束符
 -t  N  TIMEOUT为N秒 
	read 从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量
 read -p “Enter a filename: “ FILE 

	read可以同时给几个变量赋值
例:read   z x c   <<< "aa ss dd"   【三个<号】