Приложение сценария оболочки (два)
Роль и тип переменных оболочки
(1) Роль переменных
- Укажите конкретные параметры для гибкого управления системой Linux, которые имеют два значения
- Имя переменной: используйте фиксированное имя или предустановленное системой или определяемое пользователем
- Значение переменной: может изменяться в соответствии с пользовательскими настройками или изменениями системной среды.
(2) Типы переменных
- Пользовательские переменные: определены, изменены и используются пользователями
- Переменные среды: поддерживаются системой и используются для установки рабочей среды.
(改变系统环境的变量)
- Переменная позиции: передать параметры программе сценария через командную строку
(可以理解为脚本后面跟的字段)
- Предопределенные переменные: тип переменных, встроенных в Bash, которые нельзя изменить напрямую.
Один, пользовательские переменные
(1) Определите новую переменную
- Формат: имя переменной = значение переменной
- Имена переменных начинаются с буквы или подчеркивания и чувствительны к регистру. Рекомендуются все буквы верхнего регистра (нижний регистр не затрагивается).
(2) Просмотр значения переменной
- Формат: echo $ имя переменной
- Удалить переменную: не задано Пример имени переменной
:
[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) Введите содержимое с клавиатуры, чтобы присвоить значения переменным.
- Формат: читать [-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) Установите область действия переменной
- 局部变量与全局变量
локальная переменная: действительна только в текущей среде оболочки
- Имя переменной = значение переменной
Глобальная переменная: действительна во всех средах оболочки(有两种全局变量的格式)
Формат 1: имя переменной экспорта ...(把已经创建好的变量变成全局变量)
Формат 2: имя переменной экспорта = значение переменной ...(创建的时候直接创建全局变量)
———— Эти два формата могут быть смешаны ————
[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
Две специальные переменные оболочки
(1) Переменные среды
由系统提前创建,用来设置用户的工作环境
- Файл конфигурации: / etc / profile, ~ / .bash_profile
(家目录下的)
просмотреть текущую переменную среды
env
(2) Общие переменные среды
- PWD 、 ПУТЬ
- ПОЛЬЗОВАТЕЛЬ 、 ОБОЛОЧКА 、 ГЛАВНАЯ
[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 один два три четыре пять шесть
$ 1, первый позиционный параметр(如one 就是第一个位置参数)
$ 2, второй позиционный параметр(如two就是第二个位置参数)
$ 6, шестой позиционный параметр(如six就是第六个位置参数)
$ 0 - это позиция текущего скрипта, то есть текущий сценарий
(3) Предопределенные переменные
- $ #: Количество переменных позиции в командной строке
(即脚本后面跟的位置变量的总和)
- $ *: содержимое всех переменных местоположения
(即脚本后面跟的所有的位置变量的名称)
- $ ?: Статус, возвращаемый после выполнения последней команды. Когда возвращаемое значение статуса равно 0, это означает, что выполнение является нормальным, а ненулевое значение означает, что выполнение является ненормальным или ошибочным.
(一般都输出1)
- $ 0: имя выполняемого в данный момент процесса / программы
(即当前脚本名)
Пример комбинации предопределенных переменных и специальных переменных
[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
(发现当脚本后的位置变量不够或者多的话,有些是无法计算,或者无法显示的)
Сценарии оболочки и запланированные задачи
1. Идеи применения скриптов
(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
查看是否备份成功
Удаленное резервное копирование с использованием сценария оболочки
(1) Используйте разных пользователей для удаленного резервного копирования баз данных test1 и test2
(2) Выполняйте резервное копирование в 2:30 каждый день
(3) Резервное копирование каждой библиотеки в виде отдельного файла sql, сжатого в файл в формате ".tar.gz" , в файле Дата и время, когда было выполнено вложенное резервное копирование
-
tar zcf * .tar.gz имя исходного файла
-
дата +% F-% H:% M
(时间变量)
-
mysqldump -u имя пользователя -p пароль -h целевой хост - имя базы данных базы данных> * .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 `(每天的两点半执行脚本)`