这里写目录标题
一、Shell脚本编程概述
1.1 shell脚本的概念
-
将要执行的命令按顺序保存到一个文本文件;
-
给该文件可执行权限;
-
可结合各种Shell控制语句以完成更复杂的操作。
1.2Shell脚本应用场景
-
重复性操作
-
交互性任务
-
批量事务处理
-
服务运行状态监控
-
定时任务执行
1.3 shell的作用
shell就是与内核沟通的界面、应用程序等。比如你要播放音乐,你的计算机通过你在shell输入的打开音乐的命令,shell在告诉操作系统的内核用户希望打开音乐,内核在通过cpu调度、内存管理、磁盘输入输出等工作,将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者。
Shell(壳程序)是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
1.4 linux中有哪些shell
通过查看etc下面的shells可以发现当前的linux中有哪些shell
最常用的就是bash、tcsh、csh、sh、nologin这些shell。这些shell都是依据Linux发展者的不同所创造出的不同版本。
bash:基准于GNU的框架下发展出的shell。
csh:语法有点类似于c语言的shell。
tcsh:整合了csh,提供更多的功能。
sh:己经被bash所替换。
nologin:奇怪的shell,这个shell可以让用户无法登录主机。
二、 shell脚本的使用
2.1shell脚本的构成
1.脚本申明(解释器)∶若第一行为"#!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin /bash为默认解释器。还有其它类型的解释器,比如# ! /usr/bin/python、# !/usr/bin/expect。
⒉.注释信息:以"#"开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行
3.可执行语句:比如echo命令,用于输出" "之间的字符串
相关语言
面向对象: JAVA 、 PYTHON 、 C++ 、 C# 、 GO
面向过程: C 、 shell
强类型语言: JAVA 、C 、 C++ 、 C# 、 GO
弱类型语言: PYTHON、 shell 、 PHP
编译型语言:执行前需要先编译,运行速度快
解释性语言:不需要编译即可直接执行,常用于作脚本
尝试编辑一个脚本
2.2 运行脚本
运行shell脚本
1、用绝对/相对路径指定脚本文件运行,需要执行用户拥有执行权限x,脚本会在子shell环境中运行
2、用 bash/sh 程序指定脚本文件运行,不需要执行权限,脚本会在子shell环境中运行
3、用 source/. 指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值等因素)
尝试运行刚刚编辑的脚本
1、先给刚刚编辑的脚本添加执行权限
2、通过绝对路径来运行这个脚本
3、用 bash/sh 程序指定脚本文件运行(不需要执行权限)
当我把脚本的执行权限取消之后,用相对路径或者绝对路径都是用不了,于是尝试使用bash/sh来指定脚本的运行
4、用source来执行脚本(source可以用·来代替)
2.3 重定向和管道操作
2.31交互式硬件设备
●标准输入:从该设备接收用户输入的数据
●标准输出:通过该设备向用户输出数据
●标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 默认编号 | 默认设备 |
---|---|---|---|
标准输入 | stdin | 0 | 默认设备为键盘 |
标准输出 | stdout | 1 | 默认设备为屏幕 |
标准错误输出 | stderr | 2 | 默认设备为屏幕 |
2.32 重定向操作
2.33 管道符号
管道操作符:“|”: 将管道符号“|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道
[root@localhost ~]#ps aux |wc -l #查看进程数
267
[root@localhost ~]#echo "123123"|passwd --stdin zhangsan #给张三设置密码
三、shell脚本变量
3.1 shell变量的作用
-
用来存放系统和用户需要使用的特定参数(值)
-
变量名:使用固定的名称,由系统预设或用户定义
-
变量值:能够根据用户设置、系统环境的变化而变化
3.2 shell变量的类型
自定义变量:由用户自己定义、修改和使用;变量名以字母或者下划线开头,而且区分大小写
特殊变量:环境变量,只读变量,位置变量,预定义变量。
3.3 赋值时使用引号
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值, $视为普通字符
反撇号:命令替换,提取命令执行后的输出结果,``和$(…)作用相同
3.4 从键盘输入内容为变量赋值
read -p “提示信息” 变量名 从键盘输入获取值赋给变量
vim sec.sh创建一个脚本
执行脚本
3.5 变量作用范围
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时局部变量将无法再使用。
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用。我在etc/profile文件中添加脚本,并在脚本前加上export后,便可以在所有的环境中使用,而且重启后也不会消失
1、首先在profile文件中添加配置
2、使用 source 对文件profile重新刷新
3、查看结果
3.6 整数变量的算术计算
运算符:+加法 、-减法 、\*乘法 、/除法 、%取余
常见的表达方式
expr 变量1 运算符 变量2
var=$(expr 变量1 运算符 变量2)
var=$((变量1 运算符 变量2))
var=$[变量1 运算符 变量2]
let var=变量1 运算符 变量2
i++相当于i=$[$i + 1],i++是先赋值,再运算
i--相当于i=$[$i - 1],++i是先运算再赋值
i+=1相当于i=$[$i + 1]
通过这种方式也可以实现
3.7 环境变量
-
使用 env 命令可以查看到当前工作环境下的环境变量
-
变量USER表示用户名称,HOME表示用户的宿主目录,LANG表示语言和字符集,PWD表示当前所在的工作目录,变量PATH表示可执行程序的默认搜索路径
-
配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)
1、
2、
3、
3.8只读变量
readonly命令用于定义只读shell变量和shell函数。readonly命令的选项-p可以输出显示系统中所有定义的只读变量。
readonly 变量名[=值] 设置只读变量,不能被修改值和删除(unset 变量名)
3.9 位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}
3.10 预定义变量
-
$* 和 $@:都会表示命令或脚本要处理的参数。
-
$* :把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4 "
-
$@:把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表“$1” “$2” “$3” “$4”
预定义变量 | 表示的意思 |
---|---|
$* | 把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4 " |
$@ | 把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表“$1” “$2” “$3” “$4” |
$0 | 表示当前执行的脚本或命令的名称 |
$# | 表示命令或者脚本要处理的参数的个数 |
$? | 表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常,也常被用于shell脚本中return退出函数并返回的退储值 |
$*和$@都有双引号的区别:
编辑一个脚本查看一下
执行脚本