Shell脚本和变量
一、shell脚本概述
1、shell脚本的概念
什么是shell?就是与内核沟通的界面、应用程序等等。比如你要放音乐,你的计算机通过你在shell输入的打开音乐的命令,shell再告诉操作系统的内核用户希望打开音乐,内核在通过CPU调度、内存管理、磁盘输入输出等工作。将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者。
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种shell控制语句已完成更复杂的操作
2、shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- …
3、Linux中有哪些shell
检查一下/etc/shells文件,里面就是Linux所包含的shell
最常用的就是bash、tcsh、sh、nologin这些shell都是依据Linux发展者的不同所创造出的不同版本。
- bash:基准于GNU框架下发展出的shell
- csh:语法有点类似于C语言的shell
- tcsh:整合了csh,提供了更多的功能
- sh:bash的前身,如今已被bash替代
- nologin:奇怪的shell,这个shell可以让用户无法登录主机
注:bash(/bin/bash)是目前大多数Linux版本采用的默认shell
二、shell的作用
shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当一个“命令解释器”的角色,负责接受用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核文件,并输出执行结果。
1、shell脚本的作用
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
2、用户的登录shell
- 登录后默认使用的shell程序,与一般为/bin/bash
- 不同shell的内部指令、运行环境等会有所区别
三、编写shell脚本
1、编写脚本代码
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序一次编写
2、赋予可执行权限
是脚本具有可执行属性
chmod +x 脚本文件
3、shell脚本的构成
- 脚本申明(解释器):若第一行为#!/bin/bash 表示此行以下的代码语句是通过/bin.bash程序来解释执行,#!/bin/bash为默认解释器。还有其他类型的解释器,比如#!/usr/bin/python 、#!/usr/bin/expect
- 注释信息:以#号开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行
- 可执行语句:比如echo命令,用于输出“”双引号之间的字符串
编写一个脚本通常在第一行写入使用的shell环境,第二行注释脚本的信息,作者和写脚本的时间,方便日后查看。第三行往下是脚本的内容。
4、shell脚本的执行
方法一:绝对/相对路径指定脚本运行,需要执行用户 拥有执行权限,脚本会在子shell环境中运行
chmod +x /opt/first.sh
指定绝对路径:/opt/first.sh
指定相对路径:./first.sh
方法二:用bash/sh程序指定脚本文件运行,不需要执行权限,脚本会在子shell环境中运行
bash/sh 脚本路径:bash/sh first.sh
方法三:用source/.指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值等因素)
source 脚本路径:. first.sh或者source first.sh
四、重定向与管道操作
1、交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
2、重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
重定向输出 | << | 将输出结果追加到指定的文件尾部 |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
标准错误输出 | 2> | 将错误信息追加到指定的文件尾部 |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
2.1重定向输入
[root@localhost opt]# vim passwd.txt
[root@localhost opt]# useradd zhangsan
[root@localhost opt]# passwd --stdin zhangsan < passwd.txt
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
2.2重定向输出
[root@localhost opt]# cat passwd.txt
123
[root@localhost opt]# echo 456 > passwd.txt
[root@localhost opt]# cat passwd.txt
456
[root@localhost opt]#
[root@localhost opt]# cat passwd.txt
456
[root@localhost opt]# echo 456 >> passwd.txt
[root@localhost opt]# cat passwd.txt
456
456
2.3标准错误输出
2.4混合输出
3、管道操作符号“|”
将管道符左侧的命令输出结果作为右侧命令的处理对象
比如给新建用户创建密码
五、shell的变量
1、变量的作用
用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或者用户自定义
- 变量值:能够根据用户设置、系统环境的变化而变化
2、变量的类型
- 自定义变量:由用户自己定义、修改和使用
- 特殊变量:环境变量、只读变量、位置变量、预定义变量
3、自定义变量
3.1变量的定义
shell中定义变量操作简单,不像其他高级语言(c++、python等)那么复杂,直接指定变量名称并赋给初始值(内容)即可
3.2定义一个新的的变量
- 变量名以字母或者下划线开头,区分大小写,建议全大写
格式:
变量名=变量值
注意:等号两边没有空格
3.3查看变量的值
- 用echo查看和引用变量的值
通过在变量名称前面添加前导符号“$”,可以引用一个变量的值,使用echo命令可以查看变量,可以在一条echo命令中同时查看多个变量值。
3.4取消定义的变量
unset 变量名
3.5赋值时使用引号
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用其他变量值,$视为普通字符
- 反撇号:命令替换,提取命令执行后的输出结果
3.6从键盘输入内容为变量赋值
read [-p "提示信息"] 变量名
3.7整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3]...
常用运算符:
- 加法运算:+
- 减法运算:-
- 乘法运算:*
- 除法运算:/
- 求模(取余)运算:%
3.8设置变量的作用范围
默认情况下,新定义的变量只在当前shell环境中有效,因此称为局部变量,当进入子程序或新的子shell环境时,局部变量将无法再使用
格式1:
export 变量名
格式2:
export 变量名=变量值
export是将变量变为全局变量,不管在什么shell环境下都能引用变量,但此命令只是临时变为全局变量,关机再开机就没了,要想一直是全局变量,按照如下操作
vim /etc/profile
添加
export 变量名
变量名=变量值
或
export 变量名=变量值
4、特殊的shell变量
4.1环境变量
- 环境变量是由系统提前创建,用来设置用户的工作环境
- 配置文件:/etc/profile、~/.bash_profile
4.2常见的环境变量
- PWD、PATH
- USER、SHELL、HOME
使用env 命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途。例如,变量USER表示用户名称,HOME表示用户的宿主目录,LANG表示语言和字符集,PWD表示当前所在的工作目录,PATH 表示命令搜索路径等、RANDOM表示随机数,会返回0-32767的整数,USER表示当前账户的账户名称等,一般都用全大写定义,注意和自定义变量区分.
4.3PATH变量
PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在 PATIH变量指定的目录范围查找对应的可执行文件,如果找不到则会提示"command not found"。
执行脚本又多了一种方法:
可以将脚本文件复制到PATH变量定义的几个目录中
或者将脚本所在的目录加入到PATH变量中
4.4只读变量
- 用于变量值不允许被修改的情况
重启之后就失效了
4.5位置变量
- 表示为$n,n为1~9之间的数字
$0表示脚本本身
4.6预定义变量
- $# :命令行中位置变量的个数
- $* :所有位置变量的内容
- $? :上一条命令执行后返回的状态,当返回值为0时,表示执行正常,非0值表示执行异常或出错
- $0 :当前执行的进程/程序名
- $@ :表示列出所有位置参数,但是是以单个的形式的列出
- $$ :表示返回当前进程的进程号
- $! :返回最后一个后台进程的进程号
[root@c7-1 ~]# vim fuhao.sh
#!/bin.bash
echo $1
echo "$0 表示当前执行的脚本或程序的名称"
echo "$# 表示命令行中位置的参数个数"
echo "$* 所有位置参数的内容,这些内容是当做一个整体"
echo "$@ 表示列出所有未知参数,但是是以单个的形式列出
[root@c7-1 ~]# bash fuhao.sh 1 2 3 4
1
fuhao.sh 表示当前执行的脚本或程序的名称
4 表示命令行中位置的参数个数
1 2 3 4 所有位置参数的内容,这些内容是当做一个整体
1 2 3 4 表示列出所有未知参数,但是是以单个的形式列出
#理解 $* 和 $@ 的区别
$* :把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4"。
$@ :把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1" "$2" "$3" "$94"。
$* :是将参数全部当做一个整体
$@ :是将参数每一个都当做单独的个体
set:查看系统所有的变量,包括环境变量和自定义变量(没有单独查看自定义变量的命令,可以set管道过滤)