shell脚本理论及实践

目录

一、shell脚本概述

1.1 shell的作用

1.1.1 shell的概念

1.1.2 shell的作用

1.1.3 面试题

1.2 shell的编程规范

1.2.1 shell脚本的构成

1.2.2 shell脚本执行

1.2.3 脚本实践

1.3 重定向与管道

1.3.1 重定向

1.3.2 管道操作

1.3.3 示例演示

二、shell脚本变量

2.1 自定义变量

2.1.1 理解与概念

2.1.2 特殊赋值操作(双引号、单引号、反撇号)

2.1.3 交互式定义变量(read)

2.1.4 变量的作用范围

2.2 特殊变量

 2.2.1 数值变量的常用运算符:+、-、\*、/、%及其运算

2.2.1.1 运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)

​2.2.1.2 运算符号:$(()) 和$[]

​2.2.1.3 运算命令:expr和let

​2.2.1.4 运算工具:bc(系统自带)

2.2.2 特殊变量(环境变量、只读变量、位置变量、预定义变量)

2.2.2.1 环境变量

2.2.2.2 只读变量

2.2.2.3 位置变量

2.2.2.4 预定义变量


一、shell脚本概述

1.1 shell的作用

1.1.1 shell的概念

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可是交互也可以是非交互式的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们

简单理解来说:shell是Linux系统中后台运行的一种特殊程序也可以理解成一种特殊的软件,提供了用户与内核进行交互操作的一种接口,翻译官

1.1.2 shell的作用

Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。 
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

简单理解来说: 

  • 接受用户输入的命令
  • 解释命令
  • 传递给系统内核执行

 简单解释:

[root@fzx ~]# cat /etc/shells
/bin/sh   #是bash命令的软链接  (已经被/bin/bash所替换)
/bin/bash   基准于GNU的框架下发展出的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

1.1.3 面试题

为什么我们的系统上合法的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 -s来重新指定

shell脚本是什么
shell脚本就是说我们把原来 linux 命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为 shell 脚本或 shell 程序;我们可以在脚本中输入一系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的 shell 脚本

总结:将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的

shell脚本能干什么
自动化完成软件的安装部署,如安装部署LAMP架构服务
自动化完成系统的管理,如批量添加用户
自动化完成备份,如数据库定时备份
自动化的分析处理,如网站访问量

shell脚本使用场景
在需要完成大量复杂、重复性的工作时,不需要在命令行重复执行命令,直接运行shell脚本即可,大大的节省了时间提高了效率

如何学习shell脚本
熟悉掌握各种linux命令
掌握脚本的标准格式
掌握脚本的基本语法

1.2 shell的编程规范

1.2.1 shell脚本的构成

  • 第一行为“#!/bin/bash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行
  • 其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
  • 注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
  • 可执行语句:如echo命令,用于输出“ ”之间的字符串

1.2.2 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)

1.2.3 脚本实践

1.3 重定向与管道

1.3.1 重定向

交互式硬件设备

  • 标准输入:从该设备接受用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输入/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

重定向操作

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>标准错误输出结果追加到指定的文件尾部
混合输出&>无论对错都可以重定向    将标准输出、标准错误的内容保存到同一个文件中

&>和>&符号
&表示等同于的意思
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出

*重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件   其他输出设备)

1.3.2 管道操作

概念:管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。 
在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。

注:

$bash  $表示系统提示符,$ 表示此用户为普通用户,超级用户的提示符是#
bash是shell的一种,是linux下最常用的一种shell
$bash的意思是执行一个子shell,此子shell为bash

1.3.3 示例演示

1、重定向输出

2、重定向输入

3、重定向输入“0”

4、错误重定向输出

5、管道操作

二、shell脚本变量

2.1 自定义变量

2.1.1 理解与概念

  • 变量是用来临时保存数据的,并且该数据时可以变化的,任何一个语言都离不开变量,如果某个内容需要多次使用并且会重复出现,这样就可以使用变量了,如果需要修改直接修改变量就可以了
  • 常见 Shell 变量的类型包括自定义变量、环境变量、只读变量、位置变量、预定义变量

自定义变量定义:

Bash中的变量操作相对比较简单,不像其他高级编程语言(如C/C++、Java等)那么复杂。在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可

格式:

  • 格式:变量名=变量值
  • 变量名:临时存放数据的地方
  • 变量值:临时的可变化的数据
  • 等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符(如+、-、*、/、.、?、%、&、#等)

示例一:

用echo查看和引用变量的值

通过在变量名称前添加前导符号“$”,可以引用一个变量的值,使用 echo 命令可以查看变量,可以在一条 echo 命令中同时查看多个变量值

示例二:

当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号“{}”将其括起来,否则将无法确定正确的变量名称。对于未定义的变量,将显示为空值

示例三

echo选项

  • echo -n 表示不换行输出
  • 使用echo -e输出转义字符,将转义后的内容输出到屏幕上
  • 常用的转义字符如下:
  • \c 不换行输出,在”\c”后面不存在字符的情况下,作用相当于echo -n
  • \n 换行
  • \t 转义后表示插入tab,即制表符
  • 注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变 量引用

补充:unset 变量名:取消定义

2.1.2 特殊赋值操作(双引号、单引号、反撇号)

双引号:双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略

示例一:

单引号:不识别变量

  • 当要赋值的内容中包含$、“、\等具有特殊含义的字符时,应使用单引号括起来。
  • 在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。输入什么就显示什么
  • 但赋值内容中包含单引号(‘)时,需使用\’符号进行转义,以免冲突

示例二:

反撇号:调用命令输出结果

反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。
反撇号括起来的范围内必须是能够执行的命令行,否则将会出错

示例三:

示例四:

使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用 “$()”来代替反撇号操作,以解决嵌套的问题

2.1.3 交互式定义变量(read)

read命令:

用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入 一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给 最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。

  • -p 提示用户的信息
  • -n 定义字符数
  • -s 不显示用户输入的内容,常用于输入密码  read -s -p "input your password:" pass
  • -t 定义超时时间,超过多长时间没输自动退出

示例一:

示例二:

一般来说为了使交互式操作的界面更加友好,提高易用性,read 命令可以结合“-p”选项来设置提示信息,以便告知用户应该输入什么内容等相关事项

示例三:

从文件读取内容赋值给变量

2.1.4 变量的作用范围

局部变量:

概念:默认情况下,新定义的变量只在当前的 Shell 环境中有效

缺点:当进入子程序或新的子 Shell 环境时,局部变量将无法再使用

 示例一:

export命令:

  • 作用:为了使用户定义的变量在所有的子 Shell 环境中能够继续使用,减少重复设置工作。
  • 可以通过内部命令 export 将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔
  • env查看当前环境变量
  • 使用 export 导出全局变量的同时,也可以为变量进行赋值,例:export ABC=123
  • export -n ABC:取消定义的全局变量变成局部变量

示例一:导出全局变量

示例二:使用 export 导出全局变量的同时,也可以为变量进行赋值等

2.2 特殊变量

 2.2.1 数值变量的常用运算符:+、-、\*、/、%及其运算

  • 运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
  • 运算符号:$(()) 和$[]
  • 运算命令:expr和let
  • 运算工具:bc(系统自带)

注:

  • 在 Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算
  • 整数值的运算主要通过内部命令 expr 进行
  • 运算符与变量之间必须有至少一个空格

常用的运算表达式:
i=$(expr 12 \* 5)
i=$((12 * 5))
i=[12 * 5]
let i=12*5

i++ 相当于 i=$[$i+1]
i-- 相当于 i=$[$i-1]
i+=2 相当于 i=$[$i+2]

2.2.1.1 运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)


2.2.1.2 运算符号:$(()) 和$[]

注:$[]$(()) 必须要和echo在一起用因为他只能运算无法输出结果


2.2.1.3 运算命令:expr和let

expr命令(不仅可以运算,还支持输出到屏幕)

常用的 几种运算符如下所述(示例看上面加减示例)

  • +:加法运算
  • -:减法运算
  • \*:乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符 
  • /:除法运算
  • %:求模运算,又称为取余运算,用来计算数值相除后的余数

let命令:

可以改变变量本身的值,但不显示结果,需要echo,其他的运算方式可以做运算但不改变变量本身的值

示例:


2.2.1.4 运算工具:bc(系统自带)

bc命令:

支持小数运算(例:加上scale=3 指定小数点后三位),但在脚本中不可直接使用否则会进入交互界面可以用echo结合管道使用

2.2.2 特殊变量(环境变量、只读变量、位置变量、预定义变量)

2.2.2.1 环境变量
  • 环境变量指的是出于运行需要而由 Linux 系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。
  • 环境变量的值由 Linux 系统自动维护,会随着用户状态的改变而改变。 
  • 使用 env 命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途。
  • 例如,变量 USER 表示用户名称,HOME 表示用户的宿主目录,LANG 表示语言和字符集,PWD 表示当前所在的工作目录,PATH 表示命令搜索路径等、RANDOM表示随机数,会返回0-32767的整数,USER表示当前账户的账户名称等,一般都用全大写定义,注意和自定义变量区分


PATH 变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”

[root@fzx ~]# syt.sh
bash: syt.sh: 未找到命令...
[root@fzx ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# pwd
/root

原因:syt.sh不在$PATH的目录里面,所以系统无法识别无法直接用,需要跟上绝对路径使用该脚本

方法一:将脚本的目录加入$PATH
[root@fzx ~]# PATH="$PATH:/root"  

//这时临时的,如果永久生效需要编辑/etc/profile文件
[root@fzx ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@fzx ~]# syt.sh 
hello world

方法二:将你自己写的脚本放到$PATH中的某一个目录

在 Linux 系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用 于所有用户。除此之外,每个用户还有自己的独立配置文件(~/.bash_profile)。
修改完了要重新登陆才能生效,如果想立即生效,可以使用source

注意:修改$PATH需要慎重操作,如果找不到了会影响命令的使用!!!
[root@fzx~]# PATH=      //手误将PATH设为空
[root@fzx~]# echo $PATH

[root@fzx~]# ls
-bash: ls: 没有那个文件或目录

2.2.2.2 只读变量

概念:Shell 变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变 量

  • 在创建变量的时候可将其设置为只读属性
  • 可以将已存在的变量设置为只读属性
  • 主要用于变量值不允许被修改的情况
  • 只读变量不可以改变值也不可以被删除

2.2.2.3 位置变量

概念:

当执行命令行操作时,第一个字段表示命令名或脚本程序名

其余的字符串参数按照从左到右的顺序依次赋值给位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
命令或脚本本身的名称使用“$0”表示

2.2.2.4 预定义变量

概念:

预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而 不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示

$#:表示命令行中位置参数的个数
$*:表示所有位置参数的内容,这些内容当做一个整体
$@:表示列出所有位置参数,但是是以单个的形式的列出
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0 值均表示执行出现异常。 
$0:表示当前执行的脚本或程序的名称
$$:表示返回当前进程的进程号
$!:返回最后一个后台进程的进程号

根据一个简单的脚本来理解每个预定义和位置变量的含义
#!/bin/bash
echo $1  
echo “$0 表示当前执行的脚本或程序的名称”
echo “$# 表示命令行中位置参数的个数”
echo “$* 所有位置参数的内容,这些内容当做一个整体” 
echo “$@ 表示列出所有位置参数,但是是以单个的形式的列出”

优化
#!/bin/bash
echo "当前脚本名称为$0"
echo "当前脚本的第一个参数是$1"
echo "当前脚本的第二个参数是$2"
echo "当前脚本一共有$#个参数"

touch /home/kgc.txt &
echo "$$ 表示返回当前进程的进程号"
echo “$? 0正确,1"
echo "$! 返回最后一个后台进程的进程号"

理解$*和$@的区别
$*、$@:表示命令或脚本要处理的参数。
$*:把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4"。
$@:把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1""$2""$3""$94"。

$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。

总结:
$*是将参数全部当做一个整体
$@是将参数每一个都当做单独的个体

set:查看系统所有的变量,包括环境变量和自定义变量(没有单独查看自定义变量的命令,可以set管道过滤)

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值