shell脚本
shell脚本编程
1 shell概述
shell即是一种应用程序,又是一种程序设计语言
1.1 作为应用程序
交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能。
称之为shell命令解析器
shell是用户和Linux内核之间的接口程序
用户在提示符下输入的命令都由shell先解释然后传给Linux核心,它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行
shell命令解释器
Liunx系统中提供了好几种不同的shell命令解释器。如sh、ash、bash等。
默认使用bash作为默认的解释器【终端的默认解释器】
shell是用户跟内核通信方式之一
1.2 作为程序设计语言
它定义了各种变量和参数、并提供了许多在高级语言中才具有的控制结构,包括循环和分支,完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的部署称之为shell脚本
shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装shell命令解释器的环境下执行。
应用场景:帮助开发人员或系统管理员将复杂而又反复的操作放在一个文件中,通过简单的一步执行操作完成相应任务,从而解放他们的负担。
1.3 shell脚本分类
1.系统进行调用
这类脚本无需用户调用,系统会在合适的时候调用,如:/etc/profile、~/bashrc等
/etc/profile:
此文件为系统的每个用户设置环境信息,当用户第一次登录时该文件被执行
系统的公共环境变量在这里设置
开始自启动的程序,一般也在这里设置
~/.bashrc
用户自己的家目录中的.bashrc
登录时会自动调用,打开任意终端时也会自动调用
这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等等
2.手动进行调用
用户编写,需要手动调用的
无论是系统调用的还是需要我们自己调用的,其语法规则都一样
2 shell语法
2.1 shell 脚本的定义与执行
定义以开头:#!/bin/bash
#!用来声明脚本由什么shell解释,否则使用默认shell
单个"#"号代表注释当前行
三种执行方式:
1)chomd +x test.sh
./test.sh 增加可执行权限后执行
2)bash test.sh 直接指定使用bash解释test.sh
3).test.sh 使用当前shell读取解释test.sh
三种执行方式不同点:
1)./和bash执行过程基本一致,后者明确指定bash解释器去执行脚本,脚本中#!指定的解释器不起作用时前者首先检测#!,使用#!指定的shell,如果没有使用默认的shell。
2)用./和bash去执行会在后台启动一个新的shell去执行脚本
3)用.去执行脚本不会启动新的shell,直接由当前的shell去解释执行脚本。
2.2 变量
1.自定义变量【重点】
定义语法
变量名=变量值
引用语法
$变量名
清除变量语法
unset varname
变量的其它用法
read string 从键盘输入一个字符串付给变量string
readonly var=100 定义一个只读变量,只能在定义时初始化,以后不能改变,不能被清除
export var=300 使用export 说明的变量会被导出为环境变量,其它shell均可被使用 【注意】必须使用source 2_var.sh才可以生效
注意事项:
1)变量名只能包含英文字母下划线,不能以数字开头
2)等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来;双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。
2.环境变量
shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,在shell可以直接使用$name引用
在~/.bashrc或/etc/profile文件中使用export设置,传统上,所有环境变量均为大写。env命令可以查看所有的环境变量
常见环境变量
HOME:用于保存注册目录的完全路径名
PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行
PATH=$HOME/bin:/bin:/usr/bin;
export PATH
HOSTNAME:主机名
SHELL:默认的shell命令解析器
LOGNAME:此变量保存登录名
PWD:当前工作目录的绝对路径名
...
3.预设变量
$#:传给shell脚本参数的数量
$*:传给shell脚本参数的内容
$1、$2、$3...$9:运行脚本时传递给其的参数,用空格隔开
$?:命令执行后返回的状态
"$?"用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)
$0:当前执行的进程名
$$:当前进程的进程号
"$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复
4.脚本变量的特殊用法
""(双引号):包含的变量会被解释
''(单引号):包含的变量会当做字符串解释
``(反引号):反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量
\转义字符:同c语言\n \t \r \a 等echo命令需加-e转义
(命令序列):由子shell来完成,不影响当前shell中的变量,命令之间使用分号分隔
{命令序列}:在当前shell中执行,会影响当前变量,每个命令都要加分号";"
【扩展】 date命令:显示年月日,时分秒
date + "%Y-%m-%d %H:%M:%S"
2.3 条件测试语句
在写shell脚本时,经常遇到的问题就是判断字符串是否相等,可能还要检查文件状态或进行数字测试,只有测试完成才能做下一步动作。
test命令:用于测试字符串、文件状态和数字
test命令有两种格式:
1)test condition
2)[ condition ]
【注意】使用方括号时,条件两边加上空格
1.文件
文件测试:测试文件状态的条件表达式
-e 是否存在 -d 是目录 -f 是文件 -r 可读 -w 可写 -x 可执行
-L 符号连接 -c 是否字符设备 -b 是否块设备 -s 文件非空
2.字符串
语法:
test str_operator "str"
test "str1" str_operator "str2"
[ str_operator "str" ]
[ "str1" str_operator "str2" ]
str_operator
= 两个字符串相等 != 两个字符串不相等 -z 空串 -n 非空串
3.数字
语法:
test num1 num_operator num2
[ num1 num_operator num2 ]
num_operator:
-eq 数值相等 -ne 数值不相等 -gt 数1大于数2
-ge 数1大于等于数2 -lt 数1小于数2 -le 数1小于等于数2
4.复合测试
命令执行控制:
command1 && command2 左边命令执行成功(即返回0)shell 才执行右边的命令
command1 || command2 左边的命令未执行成功(即返回非0)shell才执行右边的命令
多重条件判定:
-a:(and) 两状况同时成立!
test -r file -a -x file
file同时具有r与x权限时,才为true
-o:(or) 两状况任何一个成立!
test -r file -o -x file
file具有r或x权限时,就传回true
!:相反状态
test! -x file
当file不具有x时,回传true
2.4 控制语句
shell中包含的控制语句:if case for while until break
1. if控制语句
语法1:
if [ 条件 ]; then
执行程序
fi
语法2:
if [ 条件1 ]; then
执行第一段程序
else
执行第二段程序
fi
语法3:
if [ 条件1 ]; then
执行第一段程序
elif [ 条件2 ]; then
执行第二段程序
else
执行第三段程序
fi
【扩展】read命令
read [-p "提示信息"] 变量名
2. case控制语句
语法:
case $变量名称 in
"第一个变量内容")
程序段一
;;
"第二个变量内容")
程序段二
;;
*)
其它程序段
exit 1 或 ;;
esac
【扩展】多个变量值可以通过|
进行连接,进行穿透效果
3. for控制语句
语法1:
for (( 初始值;限制值;执行步阶 ))
do
程序段
done
declare是bash的一个内建命令,可以用来声明shell变量,设置变量的属性。
declare也可以写作typeset。
declare -i s代表强制把s变量当做int型参数运算
语法2:
for var in con1 con2 con3 ...
do
程序段
done
4. while控制语句
语法:
while [ condition ]
do
程序段
done
5. until控制语句
语法:
until [ condition ]
do
程序段
done
这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环。
6. break和continue
break命令允许跳出循环,通常在进行一些处理后退出循环或case语句
continue命令类似于break命令,只有一点重要差别,他不会跳出循环,只是跳过这个循环步骤
2.5 函数
有些脚本段间互相重复,如果能只写一次代码块而在任何地方都能引用那就提高了代码的可重用行。
shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数
定义函数的两种格式
函数名(){
命令...
}
function 函数名(){
命令...
}
调用函数的格式为:
函数名 param1 param2....
使用参数同在一般脚本中使用特殊变量
$1,$2....$9一样
函数可以使用return提前结束并带回返回值.return 0无错误返回,return 1有错误返回。