一、什么是shell脚本
1.1、shell 的两层含义:既是一种应用程序,又是一种程序设计语言
1.1.1、shell是一种应用程序
交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能称之为 shell 命令解析器。
shell 是用户和 Linux 内核之间的接口程序
用户在提示符下输入的命令都由 shell 先解释然后传给 Linux 核心
它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行
Linux 系统中提供了好几种不同的 shell 命令解释器,如 sh、ash、bash 等。一般默认使用 bash 作为默认的解释器。
1.1.2、shell是一种程序设计语言
它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支
完成类似于 windows 下批处理操作,简化我们对系统的管理与应用程序的部署称之为 shell 脚本
二、shell和我们使用编译性语言(如c/c++)区别
(1)我们学过的 c/c++等语言,属于编译性语言(编写完成后需要使用编译器完成编译、汇编、链接等过程变为二进制代码方可执行)
(2)shell 脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装 shell 命令解释器的环境下执行
示例讲解 :
当我们写完c代码的时候,需要使用 gcc ,才可以编译成可执行文件, 再 ./ 运行文件
而shell脚本,写完代码,只需赋一个可执行权限 ,不需要用 gcc ,就可以 ./ 运行文件
或者 不用赋权限, 直接 bash 代码文件 就可运行 可执行文件
shell 脚本主要用于:
帮助开发人员或系统管理员将复杂而又反复的操作放在一个文件中,通过简单的一步执行操作完成相应任务,从而解放他们的负担.
三、shell的简单流程
以输入 ls -l 指令为例
第一步:创建xx.sh 文件 (如: vim test.sh )
第二步:进入编辑
定义以开头:#!/bin/bash ( #!用来声明脚本由什么 shell 解释,否则使用默认 shell)
(单个"#"号代表注释当前行)
输入需要的指令 (如; ls -l)
第三步:添加可执行权限 chmod +x test.sh
第四步: ./test.sh
如下图结果
运行的 结果 和 ls -l指令显示 一致
3.1、扩展
shell的执行方式有三种:
第一种:chmod + x test.sh ./test.sh 增加可执行权限后执行 (也就是上图的执行方法)
第二种:bash test.sh (直接指定使用 bash 解释 test.sh)
第三种:. test.sh(source test.sh) ( 使用当前 shell 读取解释 test.sh)
3.2、区别:
区别1: 第三种与其它的区别
第一种和第二种,执行时,会在后台启动一个 新的 shell 去执行脚本
而第三种,是直接执行本次所创建的shell脚本 ,如上图例子,即自己创建的 test.sh
区别2:第一种和第二种的区别
第一种:运行时,计算机首先检测#!,使用#!指定的 shell,如果没有使用默认的 shell
比如上图的例子,我使用的是 #!/bin/bash 即bash解析器
而第二种:不检测#!,直接使用bash解析器
四、shell的语法
4.1、变量
定义变量
变量名=变量值 如:num=10 (注意:等号两边不可空格且无需变量类型)
引用变量
$变量名 如:i=$num 把变量 num 的值付给变量 i
显示变量
使用 echo 命令可以显示单个变量取值 如: echo $num 把num的值显示到终端
清除变量
使用 unset 命令清除变量 如:unset num
例子:演示使用
输出结果
4.2、变量的其它用法
read string
从键盘输入一个字符串付给变量 string
readonly var=100
定义一个只读变量,只能在定义时初始化,以后不能改变,不能被清除。
export var=300
使用 export 说明的变量,会被导出为环境变量,其它 shell 均可使用
注意:此时必须使用 source 2_var.sh 才可以生效
例子:演示使用
输出结果
4.3、错误用法
1、变量名只能包含英文字母下划线,不能以数字开头
1_num=100 // 错误
num_1=200 // 正确
2、等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来;双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。
name=aa bb //错误,有空格
name="aa bb" //正确,有空格q且有双引号
echo "$name is me" //输出:aa bb is me
echo '$name is me' //输出:$name is me
5、shell的其它变量用法
5.1、预设变量
$#:传给shell脚本参数的数量
$*:传给shell脚本参数的内容 与 $@ 一样
$1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开
$?:命令执行后返回的状态
"$?"用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示正确,任何非0值出错)。
$0:当前执行的进程名
$$:当前进程的进程号
编程例子:
运行结果