概述:
  shell脚本在Linux系统管理员的运维工作中非常重要。shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求。本篇将从编程基础、脚本基本格式、变量、运算、条件测试这几个方面详细介绍shell脚本编程的基础内容,也是我们必须要掌握熟练的内容。

编程语言:事先定义了一组规范,通过关键字按照特定的语法结构编写出来的程序,通过编译器或解释器转换成汇编程序
  程序执行逻辑:顺序执行,至上而下;选择执行(条件判断);循环执行
  动态语言:解释型语言,变量随时申明随时分配内存空间,不能合理分配内存空间(perl、bash、python)
  静态语言:编译型语言,所有的变量在程序执行之前都要分配好内存空间,变量必须手动释放,合理分配内存空间

Shell脚本
shell编程:过程式编程,解释执行,依赖于外部程序文件运行;是一个过程式的解释器,提供了编程能力,然后解释执行。
  编程语言的基本结构:
  数据存储:变量、数组
  表达式:a + b、a=1
  语句:if语句

常见解释器:
  #!/bin/bash
  #!/usr/bin/python
  #!/usr/bin/perl

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

shell脚本调试:
  检测脚本中的语法错误
  bash -n /path/to/some_script
  调试执行(单步执行)
  bash -x /path/to/some_script

shell脚本的执行方式:
  1、相对路径执行(需要执行权限):./some_script
  2、绝对路径执行(需要执行权限):/path/to/some_script
  3、命令行执行(不需要执行权限):bash /path/to/some_script
  4、.执行(不需要执行权限):. /path/to/some_script
  5、source命令执行(不需要执行权限):source /tmp/scriptname

总结:方法3、4、5不需要执行权限是因为脚本是作为命令的参数去执行的。前3种方法执行shell脚本时都是在当前shell下(称为父shell)开启一个子shell环境,此shell脚本就在这个子shell环境中执行;shell脚本执行完后子shell环境随即关闭,然后又回到父shell中(因为执行完后子shell已退出,shell脚本中得变量也会被释放掉)。第4、5种则是在当前shell中执行(脚本中的变量不会被释放)

bash脚本中的变量
变量:
  数据存储格式:ASCII(一个字符占用8bit)、Binary(二进制)
  按照其变量是否需要严格定义其类型来划分
  强类型语言:事先需要定义变量存储类型的如C
  弱类型语言:无需定义变量存储类型,bash默认所有变量都认为字符存储格式
  定义变量类型的作用:数据存储格式、数据的有限存储范围、比较机制不同、参与的运算类型不同

变量类型:分为两大类字符型和数值型
  字符型:
  数值型:正 负
  精确数值型:整数
  近似数值型:
    浮点数:
    单精度:
    双精度:
    布尔型:真与假

bash变量的类型:
  本地变量:作用域为整个bash进程,只对当前shell进程有效,对其子shell以及其他shell都无效
  定义变量 set Var_Name="Value"

局部变量:作用域为当前代码段,只对某一部分有效(在函数中会用到)
  定义变量 local Var_Name="Value"

位置变量:通过位置变量引用脚本名称和脚本执行后面指定的参数$0......$n
  $0 表示脚本名称
  $1 表示执行脚本后面指定的第一个参数,$2指定的第二个参数;后面依次类推

位置参数轮替shift
  在脚本给定的位置参数不确定,脚本求给定数字的和,但是给定的数字个数不确定;这个时候用到shift位置轮替,位置轮替的意思类似$1剔除,原来的$2变为$1,循环一次剔除一次,如果后面跟数值就是剔除几个位置变量默认不加数值就是剔除一个
#!/bin/bash
sum=0
for i in `seq 1 $#`;do
  let sum+=$1
shift
done
echo $sum

特殊变量:
  $? 上一条命令的执行状态码,状态码用0-255数字表示;0表示执行成功,1-255表示失败;1、2、127、255预留
  $# 传入脚本的参数的个数
  $* 传给脚本的所有参数(所有参数作为一个字符串)
  $@ 传给脚本的所有参数是列表方式(每个参数都作为独立的字符串)
  $$ 当前shell程序的PID
  $! 后台运行的最后一个作业的PID
  $- 显示shell当前使用的选项(通过set命令开启和关闭的shell选项)
  $_ 上一条命令的最后一个参数

注意:$*和 $@都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数

环境变量:作用域为当前shell进程及其子shell有效(反过来子shell定义的环境变量对父shell没效)
  定义变量  export Var_Name="Value"
  或下面方式先定义本地变量在通过export导出为环境变量
    Var_Name="Value"
    export Var_Name

bash的内置环境变量:用来定义bash的工作特性,用于保存当前会话的属性信息
  $PATH      命令的搜寻路径
  $HOSTNAME    显示主机名
  $HISTFILE    设定命令历史文件的路径文件名
  $HISTSIZE     定义了history命令能记录命令最大数
  $HISTFILESIZE  设定命令历史文件存储命令的最大数
  $HISTCONTROL   控制命令是否存入命令历史文件中
  $BASH      bash二进制程序文件的路径
  $BASH_SUBSHELL 子shell的层次
  $BASH_VERSION bash程序的版本
  $EDITOR     系统默认编辑器
  $EUID      有效的用户ID(运行进程的实际用户ID)
  $UID      当前用户的ID号
  $FUNCNAME    当前函数的名称
  $GROUPS     当前用户所属的组
  $HOME      当前用户的家目录
  $HOSTTYPE    主机类型,用来识别系统硬件平台
  $MACHTYPE    平台类型(硬件平台-发布版本-OS类型)
  $OSTYPE     OS类型
  $OLDPWD     上一次的工作目录
  $PWD       当前工作目录
  $IFS       输入数据时字段分隔符,默认为空白符(空格、制表符、换行符)
  $PPID      父进程的进程号
  $PS1       登陆主提示符
  $PS2       第二提示符,补充完全命令输入时的提示符(默认为>)
  $PS3       第三提示符,用于select命令中
  $PS4       第四提示符,当使用-x选项调用脚本时,显示的提示符,默认为+号
  $SECONDS     当前脚本已经运行的时长
  $SHLVL     shell级别,bash被嵌入的深度

引用变量 ${Var_Name}
  撤销变量 unset Var_Name

变量的命名要求:只能使用数字、字母和下划线组成;不能以数字开头;不能使用程序中的关键字;见名知义
  set 不带任何参数显示当前系统的所有变量
  export 不带任何参数显示所有环境的变量(env、printenv)

  declare 定义变量类型
    -i 声明整形变量
    -x 声明环境变量,类似于export
    -a 声明数组
    -f 声明函数
    -r 声明只读变量,相当于readonly(不能撤销变量及修改变量的值),shell程序终止才会消失
    name=king ; readonly name或者declare -r name=king都表示声明只读变量

bash配置文件
  bash的配置文件只会登录的时候读取一次,如果手动修改了bash的配置文件可以通过重新登录让配置生效,或者通过source或.重读bash的配置文件其实就是通过source或.重新执行了配置文件
  例子:source ~/.bashrc 或者 . ~/.bashrc 
  shell类型:
  登录式shell:
    通过终端输入用户信息登陆系统
    su - UserName或su -l UserName或su --login UserName
  非登录shell:
    su UseName
    图形界面下打开的终端
    执行脚本(执行脚本前会先读取bash的配置文件)

bash配置文件详解:
  profile类:登录式shell提供配置
  profile类功能:设定环境变量、运行命令或者脚本
    /etc/profile     全局
    /etc/profile.d/*.sh 全局
    ~/.bash_profile   个人配置,仅对当前用户有效
  登录式shell读取配置文件顺序
  /etc/profile—>/etc/profile.d/*.sh—>~/.bash_profile—>~/.bashrc—>/etc/bashrc—>~/.bash_logout

  bashrc类:非登录式shell提供配置
  bashrc类功能:设定本地变量、定义命令别名
    /etc/bashrc 全局
    ~/.bashrc  个人配置
  非登录读取配置文件顺序
  ~/.bashrc—>/etc/bashrc—>/etc/profile.d/*.sh—>~/.bash_logout

bash算术运算
  let varName=算术表达式
  varName=$[算术表达式]
  varName=$((算术表达式))
  varName=`expr 变量1 + 变量2 `
  除法运算有余数被省略(圆整)
  操作符:+、-、*、/、%(余数)
  num=10
  let num+=2或num=$[$num+2] 将变量num加2后的值再存回变量num
  +=、-=、*=、/=、%=     这些符号和前面的例子同理
  let varName++、varName--  先引用变量在运算(+1或-1存回变量自身)
  let ++varName、--varName  每次先+1或-1存回变量自身,先运算在引用

  bash中有内建的随机数生成器
    $RANDOM 生成0-32767之间的随机数
    示例:echo $[$RANDOM%50] :0-49之间随机数(取余数肯定小于50)

bash逻辑运算
  与运算:
  真 && 真 = 真(0)
  真 && 假 = 假
  假 && 真 = 假
  假 && 假 = 假
  或运算:
  真 || 真 = 真(0)
  真 || 假 = 真
  假 || 真 = 真
  假 || 假 = 假
  非运算:
  !真 = 假
  !假 = 真

逻辑与:&&(两个条件都为真的时候才为真,任何一个为假就为假)
  第一个条件为假时,第二条件不用再判断,最终结果已经为假所以第二条件不执行
  第一个条件为真时,第二条件必须判断;只有第二条件执行才能得最终结果
  逻辑或:||(两个条件其中任何一个为真就为真,同时为假才为假)
  第一个条件为假时,第二条件必须判断,只有第二条件执行才能得最终结果
  第一个条件为真时,第二条件不用再判断,最终结果已经为真所以第二条件不执行

&& 命令1&&命令2 当命令1正确执行,命令2才会执行
  当命令1执行不正确,命令2不会执行
  || 命令1||命令2 当命令1执行不正确时,命令2才会执行
  当命令1正确执行,命令2不会执行

例子:判断某条命令是否执行成功,执行成功打印yes,执行错误打印no(&&的优先级大于||,所以先执行左边的判断)
  command && echo yes || echo no
  如果命令执行成功,就执行echo yes;前面逻辑与结果为真,所以后面的echo no就不会执行
  如果命令执行不成功,就不会执行echo yes;前面逻辑与结果为假,所以后面的echo no就会执行

  如果用户user6不存在,就添加用户user6
    ! id user6 && useradd user6
    id user6 || useradd user6
  如果/etc/inittab文件的行数大于100,就显示好大的文件;
    [ `wc -l /etc/inittab | cut -d' ' -f1` -gt 100 ] && echo "Large file."

Linux Shell脚本编程-基础1的更多相关文章

  1. Linux shell脚本编程基础之练习篇

    shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...

  2. Linux Shell脚本编程基础(11)

    实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核,不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序.Shel编程语言具有普通编程 ...

  3. Linux Shell脚本编程基础

    1. 脚本是一个包含一系列命令序列的文本文件,当运行这个脚本文件时,文件中包含的命令序列将得到执行. 2. 脚本主要由两部分组成:脚本解释器和命令序列 注:#!/bin/bash 指明脚本解释器为Ba ...

  4. Linux Shell脚本编程-基础2

    命令退出状态码  bash每个命令,执行状态都有返回值 0表示成功 非0表示失败(1-255) $?特殊变量可以打印出上一条命令的状态返回值 脚本的状态返回值是脚本执行的最后一条命令 自定义脚本状态返 ...

  5. linux基础—课堂随笔_03 SHELL脚本编程基础

    shell脚本编程基础 条件选择:if语句 选择执行: 注意:if语句可嵌套 单分支 if(开头)判断条件:then条件为真的分支代码 fi(结尾) 双分支 if(开头)判断条件:then条件为真的分 ...

  6. SHELL脚本编程基础知识

    SHELL脚本编程基础知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux之父Linus有一句话很经典:"Talk is cheap, show me the ...

  7. shell脚本编程基础介绍

    Linux系统——shell脚本编程基础介绍 1.什么是shell 它是一个命令解释器,在linux/unix操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种操作输出的结果 ...

  8. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  9. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

随机推荐

  1. 用 Python 理解 Web 并发模型

    用 Python 理解 Web 并发模型 http://www.jianshu.com/users/1b1fde012122/latest_articles   来源:MountainKing 链接: ...

  2. Java枚举类型使用示例

    Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...

  3. C语言读取文件大量数据到数组

    针对.txt文档的大量有规律数据,譬如100行8列的数据将其读取到二维数组(矩阵)中,留作之后的数据处理. 改程序通过宏定义的方法来确定将要读取程序的行数和列数,将数据读取到二维数组data[100] ...

  4. VC++玩转Native Wifi API 2---Wifi on与wifi off

     有心栽花花不开,无心插柳柳成排. 今天要说的这个wifi on\off是在软件层面控制无线网卡的开和关. 问题听起来简单,调查起来复杂.但解决起来却也简单.关键函数便是Native wifi a ...

  5. elasticsearch插件开发

    检索引擎Elasticsearch支持插件模式.有些时候你可能须要安装一些插件.甚至自己开发插件,这里就提供一个開始ES插件开发演示样例,ES版本号为1.5.2. 一.插件类继承自org.elasti ...

  6. 文件I/O操作——File类

    在java.io包之中,File类是唯一一个与文件本身有关的操作类.它定义了一些与平台无关的方法来操作文件,通过调用File类提供的各种方法,能够完成创建.删除文件,重命名文件,判断文件的读写权限及文 ...

  7. Android与JS互相调用以及注意

    近期项目中常常使用Html5而Android与JS调用常常会用到,这里记录一下,測试系统5.0以上. 这里先贴一下源代码 Activity: package jwzhangjie.com.webvie ...

  8. AWS之VPC、Subnet与CIDR

    什么是CIDR? CIDR是英文Classless Inter-Domain Routing的缩写,中文是无类别域间路由,是一个在Internet上创建附加地址的方法,这些地址提供给服务提供商(ISP ...

  9. 第6章 Spring MVC的数据转换、格式化和数据校验

    使用ConversionService转换数据 <%@ page language="java" contentType="text/html; charset=U ...

  10. php Aes 128位算法

    <?php class Mcrypt { private static $key = "fsdjfojojodjiovjojgfosdjfiojio"; private st ...