目录
前言
1.Shell脚本概述?2.Shell脚本变量?
1.shell脚本的概念
1.1Shell脚本概述
1)Shell脚本的概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种Shell控制语句以完成更复杂的操作
2)Shell脚本应用场景
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
1.2shell脚本编程规范与变量
1)Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可是交互也可以是非交互式的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
2) shell 的作用
Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个""命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的 Shell解释器程序有很多种,使用不同的 Shell时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells文件可以了解当前系统所支持的Shell脚本种类。
[ root@localhost ~]#cat /etc/ shells
/bin/sh#是bash命令的软链接(已经被/bin/bash所替换)/bin/bash基准于GNJ的框架下发展出的Shell。
/usr/bin/sh已经被bash所替换。
/usr/bin/bash #centos和redhat系统默认使用bash shell
/bin/tcsh #csh的增强版,与csh完全兼容整合了csh,提供更多的功能。/bin/csh #已经被/bin/bash所替换(整合c shell,提供更多的功能)
注: nologin:奇怪的shell,这个shell可以让用户无法登录主机。 bash ( /bin/bash)是目前大多数Linux版本采用的默认Shell。
为什么我们的系统上合法的shell要写入/etc/shells这个文件? 这是因为系统某些服务在运行过程中,会去检查用户能够使用的shells,而这些shell的查询就是借由/etc/shells这个文件。
用户什么时候可以取得shell来工作?还有我这个默认会取得哪一个shell? 当我登录的时候,系统就会给我shell让我来工作,而这个登录取得的shell就记录在/etc/passwd这个文件内。
不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/bash,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途
目前大多数linux系统默认使用的是bash shell,默认登陆shell是/bin/bash,可以查看/etc/passwd文件里注明 这个shell是针对用户而言的,可以查看/etc/passwd里面的最后的字段使用的是哪个shell,如果想要修改可以用chmod -s或者chsh-z来重新指定
shell脚本是什么 shell脚本就是说我们把原来 linux 命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为shell 脚本或shell程序;我们可以在脚本中输入一系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的shell 脚本
总结:将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的
4 ) shell脚本能干什么
自动化完成软件的安装部署,如安装部署LAMP架构服务
自动化完成系统的管理,如批量添加用户
自动化完成备份,如数据库定时备份
自动化的分析处理,如网站访问量
5)shell脚本使用场景
在需要完成大量复杂、重复性的工作时,不需要在命令行重复执行命令,直接运行shell脚本即可,大大的节省了时间提高了效率
6)如何学习shell脚本
熟悉掌握各种linux命令
掌握脚本的标准格式
掌握脚本的基本语法
2.shell脚本的构成
第一行为"#! /bin/basi" ,脚本申明(默认解释器)∶表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如#!/usr/bin/python、# !/usr/bin/expect
注释信息:以"#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行可执行语句:如echo命令,用于输出""之间的字符串
下面开始编写脚本
vim first.sh
cd / boot/pwd
ls -lh vml*
[ root@localhost ~]#vim first.shcd /boot/
pwd
ls -lh vml*
添加echo
创建shell 程序的步骤:
第一步:创建一个包含命令和控制结构的文件。
第二步:修改这个文件的权限使它可以执行#使用chmod +x test.sh
第三步:检测语法错误
第四步:执行./first.sh
shell脚本执行
shell 脚本的执行通常有以下几种方式
方法一:当前路径(决定路径与相对路径)下执行脚本(要有执行权限) / home / first.sh或者./first.sh
方法二:sh . bash脚本文件路劲(这种方式可以不对脚本文件添加执行限) bash first.sh或sh first.sh 方法三: source脚本文件路劲(可以没有执行权限)
source first.sh
方法四:其他方法
sh < first.sh或者cat first.sh | sh (bash)
3.重定向与管道操作
重定向: 用户通过操作系统处理信息的过程中,包括以下几类交互设备文件
标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。
标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件。
从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上
1)重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。重定向输出使用">“或”>>"操作符号,分别用于覆盖或追加文件
若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,
则将输出结果覆 盖或追加到文件中。
意思是当原来文件中有内容的话,原来的内容会被覆盖掉
意思是当原来文件中有内容的话,新加的内容会追加到里面而不会覆盖原来的内容
列1
uname -p > kernel.txt
#查看结果
cat kernel.txt
列2
uname -r >> kernel.txt
#查看结果
cat kernel.txt
2)重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用"<“操作符。通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。例如,使用passwd 命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐,若改 用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合 passwd 命令的”–stdin”选项来识别标准输入)
列1
#添加初始密码串内容"123456"123456
100%
vim pass.txt
#从pass.txt读入密码给paswd命令而不是等待用户从键盘输入123456passwd --stdin jerry <pass.txt
4.Shell自定义变量
4.1Shell变量的作用、类型
1)变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
2)变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量,只读变量,位置变量,预定义变量
4.2自定义变量
1)定义一个新的变量
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
2)查看变量的值
echo$变量名
[root@localhost ~]# Product=Python
[root@localhost ~j# Version=2.7.13
[root@localhost ~]# echo $Product
Python
[root@localhost ~]# echo $Product $Version
Python 2.7.13
4.3自定义变量
1)赋值时使用引号
双引号:允许通过符号引用其他变量值
单引号:禁止引用其他变量值,视为普通字符
反撇号:命令替换,提取命令执行后的输出结果
2)从键盘输入内容为变量赋值
read [-p "提示信息"]变量名
4.4自定义变量
1)设置变量的作用范围
格式1: export变量名
格式2:export变量名=变量值...
[root@localhost ~]# echo "$Product $Version"Benet 6.0
导出为全局变量
[root@localhost ~]# export Product Version
[root@localhost ~]# bash
[root@localhost ~]# echo ""$Product $Version"Benet 6.0
[root@localhost ~]# exit
子程序引用全局变量
5.数值变量的运算及特殊变量
在 Bash Shell环境中,只能进行简单的整数运算,不支持小数运算
整数值的运算主要通过内部命令expr进行
运算符与变量之间必须有至少一个空格。
运算内容:加(+)、减(一)、乘(*)、除(/)、取余(号)运算符号: (())和[]
运算命令: expr和let运算工具: bc(系统自带)
expr命令(不仅可以运算,还支持输出到屏幕〉常用的几种运算符如下所述。
+:加法运算。
-:咸法运算。
:乘法运算,注意不能仅使用""符号,否则将被当成文件通配符。 I/:除法运算。
%:求模运算,又称为取余运算,用来计算数值相除后的余数。
例1
[ root@server myscripts]# expr 1 + 1
2
[ root@server myscripts] # expr 1+1
f root@server myscripts] #expr 2 * 2
expr:语法错误
[ root@server myscripts] # expr 2 l*2l乘法*需要转义4
[root@server myscripts]# expr 2 '*'2//乘法也可以用单引号表示但没太大必要因为只有一个字符4
expr不仅支持常量还支持变量的运算:例2
[ root@localhost ~]#X=35[ root@localhost ~]#Y=16
[ root@localhost ~]# expr $X + 540
[ root@localhost ~]# expr $x + $Y51
[ root@localhost ~]# expr $x - $Y19
[ root@localhost ~]# expr $X \*$Y560
[ rootelocalhost ~]#expr $x/ $Y
[ root@localhost ~]# expr $X % $Y
例3
sum=`expr $Y \* $Y \* $Y `
echo $sum
例4
#!/bin/bash
#1.定义输出数字
read -p "请输入第一个数字:" num1read -p "请输入第二个数字:" num2#2.执行加法运算
expr $num1 + $num2
echo "求和数:$sum"
5.1特殊的Shell变量环境变量
1)环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、~l.bash_profile
2)常见的环境变量
oPWD、PATH
oUSER、(SHELL、)HOME
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usrlsbin:/usr/bin:/root/bin:/usrlocal/mysql/bin:/root/bin[root@localhost ~]# PATH=""$PATH:/root""
[root@localhost ~]# echo $PATH
5.2特殊的Shell变量只读变量
只读变量
用于变量值不允许被修改的情况
[root@localhost ~]# name=cloud
[root@localhost ~]# readonly namell设置为只读变量[root@localhost ~]# echo $name
cloud
[root@localhost ~]# name=yun
-bash: name: readonly variable//只读变量不可以被重新赋值[root@localhost~]#
[root@localhost ~]# unset name//只读变量不可以被删除-bash: unset: name: cannot unset: readonly variable
5.3特殊的Shell变量位置变量
位置变量
表示为$n,n为1~9之间的数字
[root@localhost ~]# ./myprog.sh one two three four five six
5.4特殊的Shell变量预定义变量
预定义变量
$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错 $0:当前执行的进程/程序名
预定义变量
预定义变量是由 Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用"s"符号和另一个符号组合表示$#:表示命令行中位置参数的个数。
$ *:表示所有位置参数的内容,这些内容当做一个整体$@:表示列出所有位置参数,但是是以单个的形式的列出
$ ?:表示前一条命令执行后的返回状态,返回值为О表示执行正确,返回任何非О值均表示执行出现异常。
$0:表示当前执行的脚本或程序的名称
$$:表示返回当前进程的进程号
$ !:返回最后一个后台进程的进程号
例1:根据一个简单的脚本来理解每个预定义和位置变量的含义#!/bin/bash
echo $1
echo "0表示当前执行的脚本或程序的名称”
echo"#表示命令行中位置参数的个数”
echo "$ *所有位置参数的内容,这些内容当做一个整体”
echo “$@表示列出所有位置参数,但是是以单个的形式的列出”
"
总结
1)Shell的作用与应用场景
2)Shell脚本的编写规范与执行方法
3)重定向与管道的作用与使用方法
4)自定义变量赋值时单引号、双引号、反撇号的使用方法
5)数值变量的常用运算符:+、-、*、/、%
6)环境变量、只读变量、位置变量、预定义变量的用途