一、什么是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
五、shell的其它变量用法
5.1、预设变量
$#:传给shell脚本参数的数量
$*:传给shell脚本参数的内容 与 $@ 一样
$1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开
$?:命令执行后返回的状态
"$?"用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示正确,任何非0值出错)。
$0:当前执行的进程名
$$:当前进程的进程号
编程例子:
运行结果
六、shell变量的特殊用法
6.1、特殊用法
" "(双引号):包含的变量会被解释
' '(单引号):包含的变量会当做字符串解释
` `(数字键1左面的反引号):反引号中的内容作为系统命令,并执行其内容,可以替换输出为
一个变量
echo "today is `date` "
today is 2012年07月29日星期日 12:55:21 CST
\ 转义字符:
同c语言 \n \t \r \a等 echo命令需加-e转义
例子:
输出结果
下一讲,shell的环境变量的使用