shell实例应用【一】

#############Shell的作用#######
d是目录文件,l是链接文件,-是普通文件,p是管道
u代表所有者,x代表执行权限。 + 表示增加权限
r是读,w是写,x是执行
介于系统内核与用户之间,负责解释命令行


############计   算   机   用    户#############
∧                    ∨                               ∨         
∧                    ∨                               ∨
∧             输入∨                               ∨输入
∧                    ∨                               ∨
∧                    ∨                               ∨
∧                    ∨                               ∨
∧                  shell《《《    》》》应用程序
∧                    ∨                               ∨
∧                    ∨                               ∨
∧                    ∨                               ∨
∧             控制∨                               ∨控制
∧                    ∨                               ∨
∧                    ∨                               ∨
∧                    ∨                               ∨
∧                    ∨                               ∨
###########系      统         硬      件#############

#####用户的登录Shell####
登录后默认使用的Shell程序,一般为 /bin/bash
不同Shell的内部指令、运行环境等会有所区别
[root@localhost /]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

####编写脚本代码#####

1、使用vi文本编辑器,每行一条Linux命令,按执行顺序依次编写-----操作
[root@localhost /]# vi first.sh
cd /boot/
pwd
ls -lh vml*

2、赋予可执行权限-----操作
使脚本具有可执行属性
[root@localhost /]# chmod +x first.sh 

3、执行脚本文件
方法一:脚本文件路径
[root@localhost /]# sh /first.sh 
/boot
-rwxr-xr-x. 1 root root 5.2M 7月  30 09:18 vmlinuz-0-rescue-78ce74241c884ba1861483f7ce9ce624
-rwxr-xr-x. 1 root root 5.2M 11月 23 2016 vmlinuz-3.10.0-514.el7.x86_64

方法二:sh  脚本文件路径
[root@localhost /]# ./first.sh 
/boot
-rwxr-xr-x. 1 root root 5.2M 7月  30 09:18 vmlinuz-0-rescue-78ce74241c884ba1861483f7ce9ce624
-rwxr-xr-x. 1 root root 5.2M 11月 23 2016 vmlinuz-3.10.0-514.el7.x86_64

方法三:source  脚本文件路径                  ###立马工作让环境生效
[root@localhost /]# source /first.sh 
/boot
-rwxr-xr-x. 1 root root 5.2M 7月  30 09:18 vmlinuz-0-rescue-78ce74241c884ba1861483f7ce9ce624
-rwxr-xr-x. 1 root root 5.2M 11月 23 2016 vmlinuz-3.10.0-514.el7.x86_64
[root@localhost boot]# pwd            ###当前会切入其他环境  如当前工作状态    
/boot

4、完善的脚本结构
脚本申明、注释信息、可执行语句

[root@localhost /]# vi /first.sh 
#!/bin/bash
# This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml*

[root@localhost /]#./first.sh 
当前的目录位于:
/boot
其中以vml开头的文件包括:
-rwxr-xr-x. 1 root root 5.2M 7月  30 09:18 vmlinuz-0-rescue-78ce74241c884ba1861483f7ce9ce624
-rwxr-xr-x. 1 root root 5.2M 11月 23 2016 vmlinuz-3.10.0-514.el7.x86_64

###############重定向与管道操作############

######交互式硬件设备#####

标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息

类型                设备文件                       文件描述编号                     默认设备
标准输入          /dev/stdin                           0                               键盘
标准输出          /dev/stdout                        1                                显示器
标准错误          /dev/stdin                           2                               显示器


########重定向操作#######

       类型                  操作符号                                                用途
重定向输入                    <                         从指定的文件读取数据,而不是从键盘输入 

                                      >                        将输出结果保存到指定的文件(覆盖原有内容)
重定向输出                    >>                       将输出结果追加到指定的文件

标准错误输出                 2>                       将错误信息保存到指定的文件(覆盖原有内容)
                                     2>>                     将错误信息追加到指定的文件中

混合输出                        &>                       将标准输出、标准错误的内容保存到同一个文件中

######列子#####
[root@localhost /]# uname -p > kernel.txt
[root@localhost /]# cat kernel.txt 
x86_64
[root@localhost /]# uname -r
3.10.0-514.el7.x86_64
[root@localhost /]# uname -p
x86_64
[root@localhost /]# uname -r >> kernel.txt 
[root@localhost /]# cat kernel.txt 
x86_64
3.10.0-514.el7.x86_64
[root@localhost /]# uname -r >1.txt
[root@localhost /]# cat 1.txt 
3.10.0-514.el7.x86_64
[root@localhost /]# uname -p >1.txt 
[root@localhost /]# cat 1.txt                          ####覆盖了
x86_64

##上面命令总结:>  覆盖   >>追加###

####列子####
[root@localhost /]# vi pass.txt
Abc123
"pass.txt" 1L, 7C written

[root@localhost ~]# passwd --stdin root < pass.txt         ####这边用的是root账户的登录的  密码Abc123
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。


#####列子###
[root@localhost /]# tar jcf /nonedir/etc.tgz /etc/ 2>error.log
[root@localhost /]# cat error.log 
tar: 从成员名中删除开头的“/”
tar (child): /nonedir/etc.tgz:无法 open: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now

####上面命令解释 2>覆盖    2>>追加###

#######管道操作符号   ”|   ”########
将左侧的命令输出结果,作为右侧命令的处理对象
cmd1  |  cmd2  [... | cmdn]

########列子######
[root@localhost ~]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
tang:x:1000:1000:tang:/home/tang:/bin/bash

[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
tang /bin/bash

#######列子#####
[root@localhost ~]# df -Th
文件系统            类型      容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root xfs       282G   12G  270G    5% /
devtmpfs            devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs               tmpfs     1.9G   84K  1.9G    1% /dev/shm
tmpfs               tmpfs     1.9G  9.0M  1.9G    1% /run
tmpfs               tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1           xfs        10G  173M  9.9G    2% /boot
tmpfs               tmpfs     378M   16K  378M    1% /run/user/42
tmpfs               tmpfs     378M     0  378M    0% /run/user/0

#####列子####     过滤出/目录的已用多少空间
[root@localhost ~]# df -Th |grep "/$" | awk  '{print $6}'
5%


########Shell变量的作用、类型############
##变量的作用##
为灵活管理Linux系统提供特定参数,有两层意思
 变量名:使用固定的名称,由系统预设或用户定义
 变量值:能够根据用户设置、系统环境的变化而变化

变量的类型
自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境
位置变量:通过命令行给脚本程序传递参数
预定义变量:Bash中内置的一类变量,不能直接修改

#############自定义变量#############
####定义一个新的变量###
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值

####查看变量的值######
echo  $变量名

#####列子####
[root@localhost ~]# Product=Python
[root@localhost ~]# Version=2.7.13
[root@localhost ~]# echo $Product
Python
[root@localhost ~]# echo $Product $Version
Python 2.7.13

#####赋值时使用引号####
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果

##从键盘输入内容为变量赋值##
read [read -p] 变量名

###列子###使用bash内置的read命令来给变量赋值,read命令提示用户输入用户信息,从而实现简单的交互过程
[root@localhost ~]# read ToDir2
/opt
[root@localhost ~]# echo $ToDir2
/opt

##设置变量的作用范围##
格式1:export   变量名 ...
格式2:export  变量名=变量值  ...

#######列子####
[root@localhost ~]# echo "$Product $Version"
Python 2.7.13
[root@localhost ~]# export Product  Version             ####设置全局变量
[root@localhost ~]# bash                                           ####进入shell环境
[root@localhost ~]# echo "$Product  $Version"        ###子程序引用全局变量
Python  2.7.13
[root@localhost ~]# exit
exit

####整数变量的运算####
expr  变量1   运算符  变量2  [运算符 变量3] ...
常用运算符
加法运算:+
减法运算: -
乘法运算: \*
除法运算: /
求模(取余)运算: % 

#####列子#####
[root@localhost ~]# X=35
[root@localhost~]# Y=16
[root@localhost ~]# expr $X + $Y
51

[root@localhost ~]# expr $X - $Y
19
[root@localhost ~]# expr $X \* $Y
560
[root@localhost ~]# expr $X / $Y
2
[root@localhost ~]# expr $X % $Y
3

[root@localhost ~]# Ycube=`expr $Y \* $Y \* $Y`
[root@localhost ~]# echo $Ycube
4096
  

##############特殊的Shell变量############
###环境变量###
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、~/.bash_profile
常见的环境变量
PWD、PATH
USER 、SHELL、HOME
#######列子####
[root@localhost /]# env
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.32.2 59924 22
OLDPWD=/boot
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/
Version=2.7.13
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
Product=Python
SSH_CONNECTION=192.168.32.2 59924 192.168.32.11 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

###位置变量####
表示为 $n,n为1~9之间的数字

####列子####
[root@localhost ~]# vi add.sh 
#!/bin/bash
SUM=`expr $1 + $2`
echo "$1 + $2 = $SUM"

[root@localhost ~]# chmod +x add.sh

[root@localhost ~]# ./add.sh 12 34
12 + 34 = 46

####预定义变量####
$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$0:当前执行的进程/程序名

####列子###
[root@localhost ~]# vi mybak.sh
#!/bin/bash
TARFILE=beifen-'date +%s'.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行 $0 脚本"
echo "共完成 $# 个对象的备份"
echo "具体内容包括:$*"

[root@localhost ~]# chmod +x mybak.sh           ###给这个脚本执行权限

[root@localhost ~]# ./mybak.sh /boot/grub       ###备份一个
已执行 ./mybak.sh 脚本
共完成 1 个对象的备份
具体内容包括:/boot/grub

                                         $0               $1                  $2
[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow     ###备份二个
已执行 ./mybak.sh 脚本
共完成 2 个对象的备份
具体内容包括:/etc/passwd /etc/shadow


#####Shell脚本与计划任务#####
确定命令操作(设计并执行任务)
编写Shell脚本(组织任务过程)
设置计划任务(控制时间,调用任务脚本)


####列子####
环境:
1、有2台Linux操作系统,一台台装mysql 一台备份机:普通的Linux
2、IP地址mysql的192.168.32.11   备份机的:192.168.32.12
3、到mysql 里面创建2个数据库分别是:studydb  coursedb
4、备份机能ping通mysql主机,备份机能连接mysql数据库(3306端口要放通)

##备份准备###
创建数据库:    ############mysql主机上操作的
mysql -uroot -p   ###密码abc123
create database studydb;
create database coursedb;

授权root账户:############mysql主机上操作的
grant select,lock tables on studydb.* to 'operator'@'192.168.32.21' identified by 'abc123';
grant select,lock tables on coursedb.* to 'operator'@'192.168.32.21' identified by 'abc123';

测试数据库连接:###########备份机上操作

mysqldump -uoperator -pabc123 -h 192.168.32.11 --databases studydb > test.sql


####编写mysql备份脚本####
[root@localhost /]#mkdir -p /opt/qnzx_dbbak/

[root@localhost /]#vi /opt/qnzx_dbbak.sh 
#!/bin/bash
#这是一个简化的mysql数据库逻辑备份脚本
#1.定义数据库连接、目标库信息
MY_USER="operator"
MY_PASS="abc123"
MY_HOST="192.168.32.11"
MY_CONN="-u$MY_USER -p$MY_PASS -h $MY_HOST"
MY_DB1="studydb"
MY_DB2="coursedb"
#2.定义备份目录、工具、时间、文件名主体
BF_DIR="/opt/qnzx_dbbak/"
BF_CMD="/usr/bin/mysqldump"
BF_TIME=`date +%Y%m%d-%H%M`
NAME_1="$MY_DB1-$BF_TIME"
NAME_2="$MY_DB2-$BF_TIME"
#3.先导出为.sql脚本,然后进行压缩(打包后删除原文件)
cd $BF_DIR
$BF_CMD $MY_CONN --databases $MY_DB1 > $NAME_1.sql
$BF_CMD $MY_CONN --databases $MY_DB2 > $NAME_2.sql
/bin/tar zcf $NAME_1.tar.gz $NAME_1.sql --remove &> /dev/null
/bin/tar zcf $NAME_2.tar.gz $NAME_2.sql --remove &> /dev/null

[root@kangkang opt]# chmod +x qnzx_dbbak.sh
[root@localhost opt]# ./qnzx_dbbak.sh 
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.

[root@localhost opt]# cd qnzx_dbbak/

[root@localhost qnzx_dbbak]# ll
总用量 8
-rw-r--r-- 1 root root 626 8月  17 12:13 coursedb-20180817-1213.tar.gz
-rw-r--r-- 1 root root 625 8月  17 12:13 studydb-20180817-1213.tar.gz
[root@localhost qnzx_dbbak]# cd ..

[root@localhost opt]# mv qnzx_dbbak.sh /opt/qnzx_dbbak/

[root@localhost opt]# crontab -e
no crontab for root - using an empty one
30 2 * * * /opt/qnzx_dbbak/qnzx_dbbak.sh
"/tmp/crontab.yZ7Nob" 1L, 41C written
crontab: installing new crontab
[root@localhost opt]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 五 2018-08-17 11:34:49 CST; 41min ago
 Main PID: 1080 (crond)
   CGroup: /system.slice/crond.service
           └─1080 /usr/sbin/crond -n

8月 17 11:34:49 localhost.localdomain systemd[1]: Started Command Scheduler.
8月 17 11:34:49 localhost.localdomain systemd[1]: Starting Command Schedul...
8月 17 11:34:49 localhost.localdomain crond[1080]: (CRON) INFO (RANDOM_DEL...
8月 17 11:34:49 localhost.localdomain crond[1080]: (CRON) INFO (running wi...
Hint: Some lines were ellipsized, use -l to show in full.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值