Shell脚本与变量
Shell脚本概述
Shell脚本概念
Shell脚本:将平时使用的各种Linux命令按顺序保存到一个文本文件中,然后添加可执行权限,可结合各种Shell控制语句以完成更复杂的操作。
应用场景:
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
Shell——命令解释器、翻译官
介于系统内核与用户之间,负责解释命令。
用户的登录Shell一般默认为/bin/bash
查看系统支持的Shell种类 cat /etc/shells
Linux常用Shell种类
- bash
大多数Linux系统默认使用的shell , bash shell是Bourne shell 的一个免费版本,它是最早的Unix. shell, bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。 - csh
C shell 使用的是“类C”语法,csh是具有C语言风格的一种shell, 其内部命令有52个,较为庞大。目前使用的并不已经被/bin/tcsh所取代。 - ksh
Korn shell 的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh, ksh有42条内部命令,与bash相比有一定的限制性。 - tcsh
tcsh是csh的增强版,与C shell完全兼容。 - zsh
最为庞大的终极shell,很少使用。 - sh
是一个快捷方式,已经被/bin/bash所取代。 - nologin
指用户不可登录。
编写Shell脚本
使用vim文本编辑器(vim能检查语法结构,编写是否存在问题)
每一条linux命令,按执行顺序编写
更完善的脚本构成包括
脚本声明 #!/bin/bash
注释信息 # 注释信息
可执行语句
赋予可执行权限:使脚本具有可执行属性
chmod +x [文件名]
执行方法:
方法一:sh 脚本文件路径 (不需要执行权限)
方法二:./脚本文件路径 (需要执行权限来操作)
方法三:source 脚本文件路径 (也不需要执行权限)
标准重定向
- 标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程需要的输入数据。
- 标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。
- 标准错误(STDERR):默认设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件。
标准输入、标准输出和标准错误默认使用键盘和显示器作为关联的设备,与操作系统进行交互,完成最基本的输入、输出操作,即从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。
在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不适用默认的标准输入、输出设备(键盘和显示器),这种操作称为重定向。
重定向操作
重定向输入 (0)< 从指定的文件读取数据,而不是从键盘输入
重定向输出 (1)> 将输出结果保存到指定的文件(覆盖原有内容)
(1)>> 将输出结果追加到指定的文件尾部
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
2>> 将错误结果追加到指定的文件中
混合输出 &>或者2>&1 将标准输出,标准错误的内容保存到同一个文件中
read命令
read [选项] [参数]
常用选项:
-p:指定读取值时候的提示符
-t: 指定读取值时候等待的时间(秒)
-a array :指定输入一个数组,赋值给array
-n 2 :指定输入字符的任意类型的个数为2
示例1:
[root@server2 ~]# read -p "输入a变量的变量值:" a
输入a变量的变量值:112233aabb
[root@server2 ~]# echo $a
112233aabb
[root@server2 ~]# read -p "yes/no" choice
yes/nono
[root@server2 ~]# echo $choice
no
示例2:免交互设置初始化密码
[root@server2 ~]# vi pass.txt
[root@server2 ~]# useradd zhangsan
[root@server2 ~]# passwd --stdin zhangsan < pass.txt
重定向输出
示例:
[root@server2 ~]# uname -p
x86_64
[root@server2 ~]# uname -p > kernel.txt 覆盖文件
[root@server2 ~]# cat kernel.txt
x86_64
[root@server2 ~]# uname -p > kernel.txt
[root@server2 ~]# cat kernel.txt
x86_64
[root@server2 ~]# uname -p >> kernel.txt 追加
[root@server2 ~]# cat kernel.txt
x86_64
x86_64
[root@server2 ~]# uname -r >> kernel.txt
[root@server2 ~]# cat kernel.txt
x86_64
x86_64
3.10.0-693.el7.x86_64 查看操作系统的内核版本
错误重定向输出
[root@server2 ~]# vim http.sh
[root@server2 ~]# chmod +x http.sh
[root@server2 ~]# ./http.sh
[root@server2 ~]# cd /opt/
[root@server2 opt]# ls -lh
[root@server2 opt]# cat cd_err.txt
[root@server2 opt]# cat con_err.txt
[root@server2 opt]# cat make_err.txt
[root@server2 opt]# cat makeinsatll_err.txt
[root@server2 opt]# cat rh
#!/bin/bash
#apache server install
cd /usr/local/httpd-2.4.25/ &> /opt/cd_err.txt
./configure &> /opt/con_err.txt
make &> /opt/make_err.txt
make install &> /opt/makeinsatll_err.txt
管道符操作“|”
将左侧的命令输出结果作为右侧命令的处理对象
示例:
[root@server2 ~]# df -Th | grep "/$" (以“/”为结尾的文件)
[root@server2 ~]# df -Th | grep "/$" | awk '{ print $6 }' (查看以“/”为结尾的文件,并输出第6字段)
Shell变量
变量作用
- 用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置。系统环境的变化而变化
变量类型
自定义变量:由用户自己定义修改和使用
特殊变量:环境变量,只读变量,位置变量,预定义变量
自定义变量
定义一个新的变量
变量名以字母或下划线开头,区分大小写,建议全大写(系统变量都是大写)
变量名=变量值
查看变量的值
echo $变量名
示例:
[root@server2 ~]# A=abc
[root@server2 ~]# echo $A
abc
[root@server2 ~]# AB=12345
[root@server2 ~]# echo $A $AB
abc 12345
赋值时使用引号
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换。提取命令执行后的输出结果
从键盘输入内容为变量赋值
read [-p “提示信息”] 变量名
设置变量的作用范围(局部/全局)
格式1:export 变量名——导出为全局变量
格式2:export 变量名=变量值——全局定义
注意:
两种格式仅对当前可用,切换用户不生效。
整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3]
常用运算符
加法运算:+
减法运算:-
乘法运算:\* (\:转义字符,回归本身意思)注意不能仅使用“*”符号,否则将被当成文件通配符
除法运算:/(取商)
求模(取余)运算:% 又称为取余运算,用来计算数值相除后的余数
元字符:具有特殊含义
两个数+、-、*、/、%的方法有三种
[root@server2 ~]# expr 1 + 2
3
[root@server2 ~]# echo $((1+2))
3
[root@server2 ~]# echo $[1+2]
3
注:乘法在直接使用过程中是需要\的,因为*是shell正则表达式中的特殊字符,所以需要转义字符\才能表示其真实含义,但是在(())和[]中不需要转义字符。
特殊的Shell变量
环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、 ~/.bash_ profile(当前用户)
常见环境变量
PWD、PATH、USER、SHELL、 HOME
只读变量
[root@localhost ~]# name=cloud
[root@localhost ~]# readonly name //设置为只读变量
[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
位置变量
表示为$n,n为1~9之间的数字
预定义变量
$#:命令行位置变量的个数
$*:所有位置变量的内容(所有参数视作一个整体) $@ (区分各个参数)
$?:上一条命令执行后返回的状态,当返回状态值为0时,表示执行正常,非0值表示执 行异常或出错
$0:当前执行的进程/程序名