Shell脚本概念
Shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- ……
编写Shell脚本
其中echo“…………”用于输出字符串,带有#的行是注释
#!/bin/bash为特殊脚本声明,表示此行后的语句以/bin/bash程序来解释执行
[root@localhost ~]$ vim aa.sh #新建aa.sh文件
#!/bin/bash
cd /boot
#这是查看当前目录
echo "当前目录是:"
pwd
echo "我有哪些文件:"
ls -l
Shell的作用——命令解释器,“翻译官”
介于系统内核与用户之间,负责解释命令行
Shell脚本的三种执行方式
指定解释器的方式 先打开一个子bash,执行脚本,再退出子bush
bash
sh指定路径方式执行脚本,需要该文件有执行权
直接加载脚本 在当前的bush程序
.
source
重定向与管道操作
重定向
分为输出和输入,标准输出是屏幕,标准输入是键盘
重定向输出格式
命令 [选项 参数] > 文件 #将命令原本应输出到屏幕的内容输出到指定文件中
重定向输入格式
passwd --stdin 用户名 < passwd.txt #将passwd.txt的内容输入到密码修改
错误重定向
命令 >error.log
管道操作
通常用来过滤所需要的关键信息
[root@localhost ~]$ netstat -anpt | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1155/sshd
tcp 0 36 192.168.10.101:22 192.168.10.2:61795 ESTABLISHED 1410/sshd: root@pts
tcp 0 0 192.168.10.101:22 192.168.10.2:61798 ESTABLISHED 1415/sshd: root@not
tcp6 0 0 :::22 :::* LISTEN 1155/sshd
[root@localhost ~]$ netstat -anpt | grep sshd | awk -F: '{print $1}'
tcp 0 0 0.0.0.0
tcp 0 36 192.168.10.101
tcp 0 0 192.168.10.101
tcp6 0 0
上例awk命令的作用是以":"作为分隔,输出第一个区域的字符串,其中-F用于指定分隔符合
变量
自定义变量
由系统用户自己定义的变量,只在用户自己的Shell环境中有效,也叫本地变量
定义新的变量
基本格式为“变量名=变量值”,例:
name=zhangsan
查看和引用变量的值
在变量名前加上引导符号“$”可以引用以恶搞变量的值,使用echo命令可以查看变量,一条echo命令可以查看多个变量
[root@localhost ~]$ echo $name
asda
[root@localhost ~]$ echo $name $USER
asda root
当变量名称容易与紧跟其后的其他字符混淆时,使用“{}”将其括起来,否则无法确定正确的变量名
[root@localhost ~]$ echo $name2.5
.5
[root@localhost ~]$ echo ${name}2.5
asda2.5
变量赋值的特殊操作
1.双引号(“)
当变量值 中有空格时可以使用双引号括起来,在双引号范围内,使用$符号可以引用其他变量的值
[root@localhost ~]$ conf=12 3
-bash: 3: 未找到命令
[root@localhost ~]$ conf="12 3"
[root@localhost ~]$ echo $conf
12 3
[root@localhost ~]$ conf="$name 123"
[root@localhost ~]$ echo $conf
zhang san 123
2.单引号(’)
当要赋值的内容中包含特殊含义字符时,使用单引号括起来,在单引号的范围内,特殊字符都会被当作普通字符看待,当赋值内容包含单引号时,需要用"\"进行转义
[root@localhost ~]$ conf='$name 123'
[root@localhost ~]$ echo $conf
$name 123
3.反撇号(`)
主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号中必须是能够执行的命令行,否则会出错
[root@localhost ~]$ ls -lh `which useradd`
-rwxr-xr-x. 1 root root 135K 8月 9 2019 /usr/sbin/useradd
当在同一命令需要进行嵌套操作时,需要把”`“切换为$()
[root@localhost ~]$ rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
4.read命令
read命令用来提示用户输入信息,从而实现简单的交互过程。执行时从键盘读入一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余内容赋值给最后一个变量),若只指定了一个变量,则将整行内容赋值给此变量
[root@localhost ~]$ read sum
sadas
[root@localhost ~]$ echo $sum
sadas
-p选项可以设置在输入内容时的提示信息
[root@localhost ~]$ read -p "请输入" sum
请输入123
[root@localhost ~]$ echo $sum
123
设置变量的作用范围
默认情况下新定义的变量只在当前的Shell环境中有效,因此被称为局部变量。当进入其他Shell环境中时,局部变量无法再使用,这时可以使用export将变量导出为全局变量
[root@localhost ~]$ echo $sum
123
[root@localhost ~]$ bash
[root@localhost ~]$ echo $sum
[root@localhost ~]$ exit
exit
[root@localhost ~]$ export sum
[root@localhost ~]$ bash
[root@localhost ~]$ echo $sum
123
[root@localhost ~]$
export可以在创建变量时使用,可以在定义新的全局变量时,不需要提前赋值
[root@localhost ~]$ export name=zhangsan
[root@localhost ~]$ echo $name
zhangsan
数值变量的运算
在Bash Shell环境中只能进行简单的整数运算,不支持小数运算。通过expr命令进行,注意,运算符与变量之间至少有一个空格,格式如下
expr 变量 1 运算符 变量 2 [运算符 变量 3]…
变量 1、变量 2……对应为需要计算的数值变量(需要以“$”符号调用)
常用运算符如下
- +:加法运算。
- -:减法运算。
- \*:乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符。
- /:除法运算。
- %:求模运算,又称为取余运算,用来计算数值相除后的余数
下面是将x设为10,y设为5大各种运算结果
[root@localhost ~]$ expr $x + $y
15
[root@localhost ~]$ expr $x - $y
5
[root@localhost ~]$ expr $x \* $y
50
[root@localhost ~]$ expr $x / $y
2
[root@localhost ~]$ expr $x % $y
0
可以使用命令替换操作,将运算结果赋值给其他变量
特殊的Shell变量
1.环境变量
env列出当前系统的全局变量
其中的PATH 变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。
[root@localhost opt]$ aa.sh
bash: aa.sh: 没有那个文件或目录
[root@localhost opt]$ PATH="$PATH:/root"
[root@localhost opt]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@localhost opt]$ aa.sh
当前目录是:
/boot
我有哪些文件:
总用量 153352
-rw-r--r--. 1 root root 153591 10月 20 2020 config-3.10.0-1160.el7.x86_64
-rw-r--r--. 1 root root 253882 4月 18 03:24 config-6.8.7-1.el7.elrepo.x86_64
drwxr-xr-x. 3 root root 17 4月 21 00:01 efi
drwxr-xr-x. 2 root root 27 4月 21 00:02 grub
drwx------. 5 root root 97 4月 21 17:22 grub2
-rw-------. 1 root root 62118007 4月 21 00:03 initramfs-0-rescue-1de09106fce64aed8e73ee0e85d7a95f.img
-rw-------. 1 root root 21598143 4月 21 00:05 initramfs-3.10.0-1160.el7.x86_64.img
-rw-------. 1 root root 13670281 4月 21 00:05 initramfs-3.10.0-1160.el7.x86_64kdump.img
-rw-------. 1 root root 23350088 4月 21 17:22 initramfs-6.8.7-1.el7.elrepo.x86_64.img
-rw-r--r--. 1 root root 320648 10月 20 2020 symvers-3.10.0-1160.el7.x86_64.gz
-rw-r--r--. 1 root root 340956 4月 18 03:25 symvers-6.8.7-1.el7.elrepo.x86_64.gz
-rw-------. 1 root root 3616707 10月 20 2020 System.map-3.10.0-1160.el7.x86_64
-rw-------. 1 root root 6825161 4月 18 03:24 System.map-6.8.7-1.el7.elrepo.x86_64
-rwxr-xr-x. 1 root root 6769256 4月 21 00:03 vmlinuz-0-rescue-1de09106fce64aed8e73ee0e85d7a95f
-rwxr-xr-x. 1 root root 6769256 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64
-rwxr-xr-x. 1 root root 11224064 4月 18 03:24 vmlinuz-6.8.7-1.el7.elrepo.x86_64
[root@localhost opt]$
将变量设为永久,在/etc/profile的末尾加上export 变量名=变量值,若希望立即生效,应手动修改环境变 量,或者可以加载配置文件执行。
2.只读变量
使用 readonly 命令将变量定义为只读变量,定义之后不能通过再次赋值的方式进行修改。
[root@localhost opt]$ name=zhangsan
[root@localhost opt]$ readonly name #设置为只读变量
[root@localhost opt]$ echo $name
zhangsan
[root@localhost opt]$ name=lisi
bash: name: 只读变量 #只读变量无法被修改
[root@localhost opt]$ echo $name
zhangsan
[root@localhost opt]$ unset name #只读变量无法被删除
bash: unset: name: 无法反设定: 只读 variable
3.位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示。例如,当执行命令行“ls -lh
/boot/”时,其中第 1 个位置变量为“-lh”,以“$1”表示;第 2 个位置变量为“/boot/”,以“$2”表
示。命令或脚本本身的名称使用“$0”表示,虽然$0 与位置变量的格式相同,但是$0 属于预
定义变量而不是位置变量。
[root@localhost ~]$ vim cc.sh
#!/bin/bash
SUM=`expr $1 + $2`
echo "$1 + $2 = $SUM"
[root@localhost ~]$ chmod +x cc.sh
[root@localhost ~]$ ./cc.sh 10 20
10 + 20 = 30
4.预定义变量
预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而
不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一
个符号组合表示,较常用的几个预定义变量的含义如下。
$#:表示命令行中位置参数的个数。
$*:表示所有位置参数的内容。
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0
值均表示执行出现异常。关于$?变量的使用将在下一章介绍。
$0:表示当前执行的脚本或程序的名称