一、Shell脚本概述
1.1 Shell的作用——翻译官
shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
1.1.2 Linux中Shell的种类
[root@localhost ~]# cat /etc/shells ##查看系统中自带的shell
/bin/bash ##linux中默认的shell,除非指定
/sbin/nologin ##禁止用户登录
/bin/tcsh ##整合了csh的功能,提供比csh更强大的功能
/bin/csh ##类似c语言的shell
[root@localhost ~]# cat /etc/passwd ##查看系统中用户的登录shell
1.2 Shell脚本编程规范
1.2.1 Shell脚本的作用
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
1.2.2 Shell脚本的构成
- 脚本申明(解释器):若第一行为“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行,
#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect。 - 注释信息:以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
- 可执行语句:比如echo命令,用于输出" "之间的字符串
例:
vim /root/first.sh #使用vim编辑器编辑
#!/bin/bash #脚本解释器声明
# This is my first Shell-Script. #注释
cd /boot #linux命令
echo "当前的目录位于:" #linux输出命令
pwd
echo "其中以 vml 开头的文件包括:"
ls -lh vml*
1.2.3 Shell脚本的执行方法
方法一:指定路径的命令,要求文件必须有x权限,也可使用chmod 777 first.sh
[root@localhost ~]# chmod +x first.sh
[root@localhost ~]# ./first.sh
当前的目录位于:
/boot
#指定绝对路径:/root/first.sh
#指定相对路径:./first.sh
#工作中使用
方法二:指定Shell来解释脚本,不要求文件必须有 x 权限。
[root@localhost ~]# sh first.sh
当前的目录位于:
/boot
#调试阶段适用
方法三:source 脚本路径执行shell脚本
[root@localhost ~]# source first.sh
当前的目录位于:
/boot
#调试阶段适用
1.2.4 脚本错误
- 命令错误:命令出错不会影响接下来的命令继续2.语法错误
- 语法错误:会影响接下来的命令继续
- 逻辑错误:只能自己去筛查
查找方法:
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 检查逻辑错误
1.3 重定向与管道符
1.3.1 重定向操作
类型 | 操作符 | 作用 |
---|---|---|
重定向输出 | > | 将指定结果保存到文件中,并覆盖原有内容 |
>> | 将标准输出追加到指定的文件的尾部,不覆盖原有内容 | |
重定向输入 | < | 从指定的文件读取数据 |
重定向错误输出 | 2> | 将错误的信息保存到指定文件,也会覆盖原有内容 |
2>> | 将错误的信息保存到指定文件,不会覆盖原有内容 | |
混合输出 | &> | 将标准和错误都保存在文件中,会覆盖原有内容 |
1.3.2 管道符
- 管道符:“ | ”,将管道符左侧的命令输出的结果,作为右侧命令的输入参数,同一个命令可以使用多个管道符
[root@localhost opt]# ps aux |wc -l #查看进程数
201
二、Shell脚本变量
2.1 Shell变量的作用
(1)用来存放系统和用户需要使用的特定参数(值)
(2)变量名:使用固定的名称,由系统预设或用户定义
- 不能使用系统的命令作为变量名
- 不能使用中文
- 不能使用特殊符号开头,但是可用“ _ ”来开头
- 最好只用这个变量的英文名指定变量名
- 要有注释,目的:解释代码用途
(3)变量值:能够根据用户设置、系统环境的变化而变化
- int:整数
- string:字符串
- true:布尔(真假)
- false:浮点(小数)
2.2 自定义变量
自定义变量:由用户自己定义、修改和使用
2.2.1 定义新的变量
格式:变量名=变量值
#例:
[root@localhost ~]#abc=123 #定义变量
格式:unset 变量名
[root@localhost ~]#unset abc #删除变量
[root@localhost opt]# echo $abc
2.2.2 查看变量的值
格式:echo $变量名
#例:
[root@localhost ~]#echo $abc #查看单个变量值
123
[root@localhost ~]# echo ${abc}${def} #查看多个变量值,不加{}可能导致不显示正确的变量值
123456
2.2.3 只读变量
格式:readonly 变量名
#例:
[root@localhost opt]# aa=123
[root@localhost opt]# readonly aa #设置为只读变量
[root@localhost opt]# echo $aa
123
[root@localhost opt]# aa=456
-bash: aa: 只读变量 #只读变量不可以被重新赋值
[root@localhost opt]# unset aa
-bash: unset: aa: 无法反设定: 只读 variable #只读变量不可以被删除,unset 命令用于删除变量
2.2.4 赋值时使用引号
反撇号:命令替换,将命令执行的结果,赋值给变量名
单引号:强引用,用单引号打印变量,只会输出变量名,不会输出变量的值
双引号:弱引用,打印变量的赋值
#示例
[root@localhost opt]# aa=`ll -h`
[root@localhost opt]# echo "$aa"
总用量 4.0K
-rw-r--r-- 1 root root 29 7月 8 15:32 1.txt
弱引用和强引用
"$name " :弱引用,其中的变量引用会被替换为变量值
'$name ' :强引用,其中的变量引用不会被替换为变量值,而保持原字符串
2.2.5 read命令获取变量
-p:指定提示符,提示用户输入数据
格式:read -p "提示信息" 变量名
示例:
[root@localhost opt]# vim kedu.sh
read -p "请输入:" a
read -p "请输入:" b
c=$(($a+$b))
echo $c
[root@localhost opt]# sh read.sh
请输入:123
请输入:321
444
2.2.6 变量作用范围
-
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时局部变量将无法再使用。
-
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用。
[root@localhost opt]# export #查看设置的所有全局变量
[root@localhost opt]# export 变量名=变量值 #只能在当前环境生效,重启失效
[root@localhost opt]# source /etc/profile #设置全局变量
[root@localhost opt]# source /root/.bashrc_profile #只对root用户生效
注:全局变量的使用可能导致副作用和潜在的复杂性。因为全局变量是可访问的,所以它们可以被任何函数修改,这可能导致程序状态的不确定性和难以调试的问题。所以在工作中不常用。
2.3 环境变量
环境变量:系统提前创建或人工添加,用来设置用户工作环境
- 使用 env 命令可以查看到当前工作环境下的环境变量
- 变量USER表示用户名称,HOME表示用户的宿主目录,LANG表示语言和字符集,PWD表示当前所在的工作目录,变量PATH表示可执行程序的默认搜索路径
- 配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)
2.4 位置变量
-
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
-
$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}
示例:
[root@localhost opt]# cat zy.sh
#!/binbash
num1=$1
num2=$2
num3=$3
num4=$4
num5=$5
num6=$6
num7=$7
num8=$8
num9=$9
num10=${10}
num11=${11}
sum=$(($1+$2+$3+$4+$5+$6+$7+$8+$9+${10}+${11}))
echo $sum
[root@localhost opt]# sh zy.sh 1 2 3 4 5 6 7 8 9 10 11
66
2.5 预定义变量
- 编程语言或者脚本解释器提供的,可以自动设置和更新,但是由变成语言和脚本解释器自动完成,人工不能修改
- $*、$@:表示命令和脚本需要处理的参数
- $*:加引号时,会把参数当成一个整体处理,不加引号时,会把参数分别处理
- $@:加不加引号,都会把参数分开处理
- $#:统计传递给脚本参数的个数
- $?:表示前一条命令或者脚本执行后的返回码,返回码时0,表示只从正确,所有非0的返回码,时表示执行错误。也常被用于Shell脚本中return退出函数并返回的退出值。
2.6 整数变量的运算
运算符:+ 加法
、- 减法
、* 乘法
、/除法
、% 取余
常见格式:
格式一:
i=((15+6)) 或 i=(($a+$b))
格式二:
i=$(expr 15 \* 6) #乘法需要加“\”,其它运算都一样
格式三:
i=$[15*6]
格式四:
let i=15*6
重点:
- i=$((15*6))
- i=$(expr 15 \* 6)
- let i=$a*$b 使用变量时必须要加$
特殊形式:
- i++:相当于i=$(($i+1)),先赋值再加,每次自加1
- i--:相当于i=$(($i-1)),先赋值再减,每次自减1
- i+=2:相当于i=(($i+2)),先赋值再加,每次自加2
- ++i:先加再赋值,每次加1
- --i:先减再赋值,每次减1
bc:是一个简单易用的计算器程序,可以用于执行基本的数学运算,
包括加、减、乘、除和取余等操作。
示例:
[root@localhost opt]# echo 16/2 | bc
8