shell变量的作用、类型
(1)变量的作用
- 为灵活管理Linux系统提供特定参数,有两层意思
- 变量名:使用固定的名称或由系统预设或者用户定义
- 变量值:能够根据用户设置或系统环境的变化而变化
(2)变量的类型
- 自定义变量:由用户自己定义、修改和使用
- 环境变量:由系统维护,用于设置工作环境
(改变系统环境的变量)
- 位置变量:通过命令行给脚本程序传递参数
(可以理解为脚本后面跟的字段)
- 预定义变量:Bash中内置的一类变量,不能直接修改
一、自定义变量
(1)定义一个新的变量
- 格式:变量名=变量值
- 变量名以字母或者下划线开头,区分大小写,建议全大写(小写也不影响)
(2)查看变量的值
- 格式:echo $变量名
- 删除变量:unset 变量名
示例:
[root@localhost ~]# A=AAA [root@localhost ~]# B=BBB [root@localhost ~]# echo $A AAA [root@localhost ~]# echo $A $B AAA BBB
当变量名称容易和紧跟其后的其他字符混淆时,需要使用 ’ { } ‘ 将变量名称括起来
[root@localhost ~]# echo $Aaaa [root@localhost ~]# echo $A aaa AAA aaa [root@localhost ~]# echo ${A}aaa AAAaaa
(3) 赋值时使用引号
- 双引号:允许通过$符号引用其他变量值 “ ” - 单引号:禁止引用其他变量值,$视为普通字符 ' ' - 反撇号:命令替换,提取命令执行后的输出结果,也可以使用 $() 代替,可以处理嵌套命令 `` ($() 一般用的更多一点,比 反撇号更加直观,所以一般直接使用$() ,不过也可以根据个人喜好)
(4)从键盘输入内容为变量赋值
- 格式:read [ -p “提示信息” ] 变量名
示例:
[root@localhost ~]#a=class [root@localhost ~]#b=36 [root@localhost ~]#echo $a $b class 36 [root@localhost ~]#echo $aa classa [root@localhost ~]#c=class 36 -bash: 36:未找到命令 [root@localhost ~]#c="class 36" [root@localhost ~]#echo $c class 36 [root@localhost ~]#class="class $b" [root@localhost ~]#echo $class class 36 ($b=36) [root@localhost ~]#class2='class $b' [root@localhost ~]#echo $class2 class $b `(单引号不引用变量$视为普通字符)`
[root@localhost ~]#which useradd /usr/sbin/useradd [root@localhost ~]#ls -lh `which useradd` `(ls -lh $(which useradd) 也是一样的)` -rexr-xr-x. 1 root root 135k 8月 9 2020 /usr/sbin/useradd [root@localhost ~]#rpm -qf /usr/sbin/useradd shadow-utils-4.6-5.e17.x86_64 [root@localhost ~]#rpm -qc shadow-utils-4.6-5.e17.x86_64 /etc/default/useradd /etc/login.defs [root@localhost ~]# rpm -qc `rpm -qf `which useradd`` `(rpm -qc $(rpm -qf $(which useradd))一样的)` /etc/default/useradd /etc/login.defs [root@localhost ~]#read aaa `(使用read给变量aaa赋值)` /opt/backup (这个是自己输入的,也就是变量aaa的变量值) [root@localhost ~]#echo $aaa /opt/backup [root@localhost ~]# read -p "请指定备份存放目录:" bbb `(-p会输出指定的提示信息交互式变量)` 请指定备份存放目录:/opt/backup [root@localhost ~]#echo $bbb /opt/backup
(5)设置变量的作用范围
-局部变量与全局变量
局部变量:只在当前shell环境中有效
- 变量名=变量值
全局变量:在所有shell环境中有效(有两种全局变量的格式)
格式一:export 变量名 …(把已经创建好的变量变成全局变量)
格式二:export 变量名=变量值 …(创建的时候直接创建全局变量)
————两种格式可以混合使用————
[root@localhost ~]# echo "$A $B" aaa bbb `(A=aaa B=bbb)` [root@localhost ~]# export A `(导出A为全局变量)` [root@localhost ~]# bash `(换一个shell环境)` [root@localhost ~]# echo "$A $B" aaa `(因为A是全局变量B不是,所以只会显示A的变量值)`
(6)整数变量的运算
- 格式:expr 变量1 运算符 变量2 运算符 变量3 …
(7)常用运算符
- 加法运算: +
- 减法运算: -
- 乘法运算: *
- 除法运算: /
- 求模(取余)运算: %
- 命令嵌套: $()
- 解决变量名混淆问题: ${}
- 实现整数的混合运算: $(())
变量运算示例
[root@localhost ~]# x=3 [root@localhost ~]# echo $x 3 [root@localhost ~]# y=4 [root@localhost ~]# expr $x + $y 7 [root@localhost ~]# expr $x % $y 3 [root@localhost ~]# expr $y % $x 1 [root@aaa ~]# B="$(expr $A + 1 )" `(可以这样去定义变量的算数,中间有空格)` [root@aaa ~]# A=0 [root@aaa ~]# echo "$(expr $A + $B )" 1
二、特殊的shell变量
(1)环境变量
由系统提前创建,用来设置用户的工作环境
- 配置文件: /etc/profile 、 ~/.bash_profile
(家目录下的)
查看当前环境变量
env
(2)常见的环境变量
- PWD 、 PATH
- USER、SHELL、HOME
[root@localhost ~]# echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin: /usr/bin:/root/bin [root@localhost ~]# PATH="$PATH:/root" `(改变系统变量)` [root@localhost ~]# echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin: /usr/bin:/root/bin:/root `(在末尾加了:root)`
示例:制作用户登录的欢迎脚本
[root@localhost ~]# vim /opt/welcome.sh #!/bin/bash echo "用户 $USER 您好!欢迎你登录!" [root@localhost ~]# chmod +x /opt/welcome.sh [root@localhost ~]# vim /etc/profile 在文件末尾添加 source /opt/welcome.sh (每次登录时执行脚本) [root@localhost ~]# su - ly 上一次登录:一 7月 1 11:19:51 CST 2019pts/0 上 用户 ly 您好!欢迎你登录! [ly@localhost ~]$
(2)位置变量
表示为 $n ,n 为 1 ~ 9之间的数字
[root@localhost ~]# ./myprog.sh one two three four five six
$1,第1个位置参数 (如one 就是第一个位置参数)
$2,第2个位置参数 (如two就是第二个位置参数)
$6,第6个位置参数 (如six就是第六个位置参数)
$0 为当前脚本的位置,即当前脚本
(3)预定义变量
$#:命令行中位置变量的个数 (即脚本后面跟的位置变量的总和)
$*:所有位置变量的内容 (即脚本后面跟的所有的位置变量的名称)
$@:所以位置变量的内容 (每个参数当作单个个体,利用for循环可以查看,需要使用""括起来)
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错 (一般都输出1)
$0:当前执行的进程/程序名 (即当前脚本名)
$$:显示当前shell脚本执行的pid
$!:显示最后shell脚本执行的pid (利用shell嵌套使用,显示的pid是被嵌套的脚本)
预定义变量与特殊变量的结合示例
[root@localhost ~]# vim mybak.sh #!/bin/bash A=beifen-$(date +%F).tgz tar zcf $A $* &> /dev/null (tar zcf 使用归档) echo "已执行 $0 脚本," echo "共完成 $# 个对象的备份" echo “具体内容包括: $*” [root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow 已执行 ./mybak.sh 脚本, 共完成 2 个对象的备份 具体包括:/etc/passwd /etc/shadow
[root@localhost ~]#vim myprog.sh #!/bin/bash # 这是一个显示位置变量和预定义变量的脚本 # 计算求和 A=$(expr $1 + $2 + $3 + $4 ) echo "命令行中位置变量的个数: $#" echo "所有位置变量的内容:$*" echo "第2个位置变量为:$2 " echo "当前脚本的名称:$0" echo "这4个数字的和为:$A" [root@localhost ~]# chmod +x myprog.sh (给可执行权限) [root@localhost ~]#./myprog.sh 10 20 30 40 [root@localhost ~]#./myprog.sh 10 20 30 [root@localhost ~]#./myprog.sh 10 20 30 40 50
(发现当脚本后的位置变量不够或者多的话,有些是无法计算,或者无法显示的)
shell脚本与计划任务
一、脚本应用思路
(1)确定命令操作(设计并执行任务)
mysql数据库服务器 192.168.10.1
(得先安装mysql 数据库,或者mairadb也可以,mysql用源码包,mairadb用本地光盘yum源就可以)
[root@localhost ~]# netstat -anput | grep 3306 `(看一下mysql是否开启)` [root@localhost ~]# mysql -uroot -p123 `(登录mysql,这里使用-p123密码登录,先设置一下密码在登陆)` mysql> create database test1; mysql> create database test2; `创建两个库一个test1,一个test2` mysql> create table test1.student(id int not null,name varchar(8)); mysql> create table test2.student(id int not null,name varchar(8)); `分别在两个库里写下表` mysql> grant all on test1.* to 'test1'@'192.168.10.%' identified by '123'; mysql> grant all on test2.* to 'test2'@'192.168.10.%' identified by '123'; `分别赋权给两个库相应的mysql用户` mysql> flush privileges; `更新数据库的用户数据与权限` mysql> exit
客户机 192.168.10.2 (直接安装mariadb)
[root@localhost ~]# yum -y install mariadb [root@localhost ~]# mysql -utest1 -p123 -h 192.168.10.1 先远程登录服务器看能不能登录 [root@localhost ~]# mysqldump -utest1 -p123 -h 192.168.10.1 test1 > test1.sql 远程数据库进行备份 [root@localhost ~]# ll test1.sql [root@localhost ~]# cat test1.sql 查看是否备份成功
利用shell脚本进行远程备份
(1)使用不同用户对数据库 test1、test2进行远程备份
(2)每天 2:30执行备份
(3)每个库备份为独立的sql文件,压缩为“.tar.gz”格式的文件,文件中嵌套执行备份时的日期和时间
- tar zcf *.tar.gz 源文件名称
- date +%F-%H:%M
(时间变量)
- mysqldump -u用户名 -p密码 -h 目标主机 --databases 数据库名称 > *.sql
- /usr/bin/tar zcf bf-$(date +%F-%H:%M:%S).tar.gz test1.sql
制作脚本
[root@localhost opt]# vim ly.sh #!/bin/bash `用户名` user1="test1" user2="test2" `密码` pass1="123" pass2="123" `数据库服务器主机ip` data_host="192.168.10.1" `数据库名称` data1="test1" data2="test2" `备份名称` dumpfile1="${data1}.sql" dumpfile2="${data2}.sql" `归档名称` file1="${data1}-$(date +%F-%H-%M-%S).tar.gz" file2="${data2}-$(date +%F-%H-%M-%S).tar.gz" `备份时各参数连接` conn_name1="-u$user1 -p$pass1 -h$data_host --databases $data1" conn_name2="-u$user2 -p$pass2 -h$data_host --databases $data2" ` 备份数据库` /usr/bin/mysqldump $conn_name1 > $dumpfile1 /usr/bin/mysqldump $conn_name2 > $dumpfile2 `归档` /usr/bin/tar zcf /opt/$file1 $dumpfile1 /usr/bin/tar zcf /opt/$file2 $dumpfile2
设值计划任务(控制时间,调用任务脚本)
[root@localhost ~]# crontab -e (进入计划任务) 30 2 * * * source /opt/ly.sh `(每天的两点半执行脚本)`