Shell脚本应用(一)

Shell脚本应用(一)

  • shell 基础
    • 重定向与管道操作
      • 使用Shell 变量

shell 基础

(一)、为什么用shell?
用来解决服务器自动化运维,减轻管理员的工作量,解决大量的重复性的输入和交互式操作问题
(二)、编写shell 脚本
1、shell:一个特殊的应用程序,位于用户和操作系统内核之间,用来把用户输入的命令解释给系统内核去执行,并输出执行结果 (解释器)
2、查看Linux 系统所支持的shell 脚本种类: cat /etc/shells
Shell脚本应用(一)_第1张图片
3、编写一个shell脚本
基本格式
[root@localhost ~]# vim shell.sh 前面的shell可以随意,后缀必须为 .sh
Shell脚本应用(一)_第2张图片
(三)、执行脚本
./方式必须加可执行权限
[root@localhost ~]# chmod +x 1.sh
[root@localhost ~]# ./1.sh
sh方式不需要加执行权限
[root@localhost ~]# sh 1.sh

重定向与管道操作

1.重定向操作
1).重定向输入
< ; 从指定的文件读取数据,而不是从键盘输入

[root@localhost ~]# vim passwd.txt
ABC123,
[root@localhost ~]# useradd zhangsan
[root@localhost ~]# passwd --stdin zhangsan < passwd.txt 
更改用户 zhangsan 的密码 
passwd:所有的身份验证令牌已经成功更新。

2).重定向输出
> ;将输出结果保存到指定的文件(覆盖原文件)

[root@localhost ~]# uname -p > a.txt
[root@localhost ~]# cat a.txt 
x86_64

>>; 将输出结果追加到指定的文件

[root@localhost ~]# uname -r >> a.txt 
[root@localhost ~]# cat a.txt 
x86_64
3.10.0-1062.el7.x86_64 这是追加进来的

3).错误重定向输出
2> ;将错误信息保存到指定的文件(覆盖原文件)

[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>>; 将错误信息追加到指定的文件中

[root@localhost ~]# cdd 2>> error.log 
[root@localhost ~]# cat error.log 
tar: 从成员名中删除开头的“/
tar (child): /nonedir/etc.tgz:无法 open: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now
bash: cdd: 未找到命令...
相似命令是: 'cd'

4).混合输出
&> :表示直接把正确的输出和错误的输出都直接保存到后面的文件中,后面文件的原始数据丢失

[root@localhost ~]# pwd &> a.sh
[root@localhost ~]# cat a.sh 
/root

&>> :表示直接把正确的输出和错误的输出都直接追加到后面的文件中,原始文件数据保留

[root@localhost ~]# pwdd &>> a.sh 
[root@localhost ~]# cat a.sh 
/root
bash: pwdd: 未找到命令...
相似命令是: 'pwd'

2.管道符操作(把“|” 左侧的命令的输出结果,作为右侧命令的操作对象)

[root@localhost ~]# grep  "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
admin:x:1000:1000:admin:/home/admin:/bin/bash
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
[root@localhost ~]# grep  "/bin/bash$" /etc/passwd | wc -l
3

使用Shell 变量

是用来存放系统和用户需要使用的特定参数,这些特定参数会根据用户的设定或环境的变化而变化,shell变量的使用能够提供更强的适应性与功能。
一.自定义变量
由系统用户自己去定义,只在用户的自己shell 环境中有效,又称为本地变量

自定义变量基本格式
变量名=变量值
其中"="是赋值符号,变量名需要以字母或者下划线开头,不能包含特殊字符。
[root@localhost ~]# xm=zhangsan    定义变量xm,并赋值为zhangsan
[root@localhost ~]# nl=18          定义变量nl,并赋值为18
[root@localhost ~]# echo $xm       查看变量xm
zhangsan
[root@localhost ~]# echo $aaa      查看变量aaa,因为没有定义aaa,所以结果为空

[root@localhost ~]# echo $xm nl    每一个不同变量,都需要再前面加上一个"$"符号
zhangsan nl
[root@localhost ~]# echo $xm $nl    查看变量xm与变量nl
zhangsan 18

二.变量赋值的特殊操作
1)、双引号的使用场合
a、赋值内容时包含空格必须使用双引号;

[root@localhost ~]# PYTHON=Python 2.7.14  (错误赋值)
bash: 2.7.14: 未找到命令...
[root@localhost ~]# PYTHON="Python 2.7.14"  (正确赋值)
[root@localhost ~]# echo $PYTHON
Python 2.7.14

b、赋值时用“$"引用了其他的变量,必须要使用双引号

[root@localhost ~]# aaa="ni hao"   赋值aaa值
[root@localhost ~]# echo $aaa
ni hao
[root@localhost ~]# bbb="$aaa ma"  将aaa值赋予给bbb
[root@localhost ~]# echo $bbb
ni hao ma

2).单引号的使用场合 (当赋值的内容包含“$”、“双引号”、“\” 等含有特殊的字符时,使用单引号扩起来)

[root@localhost ~]# aaa='ni hao $b'  单引号不会引用其他变量
[root@localhost ~]# echo $aaa
ni hao $b

3).反撇号的使用 (用于命令的替换或者是命令的赋值;把某个命令的屏幕输出结果赋值给变量)

[root@localhost ~]# shijian=`date`   把date这个命令的执行结果赋值给shijian
[root@localhost ~]# echo $shijian     查询
2020 09 04 星期五 17:47:48 CST   返回的时间

4).read 命令 (用键盘所输入的内容为变量赋值)

[root@localhost ~]# read aaa   普通赋值
ni hao wo shi zhangsan
[root@localhost ~]# echo $aaa
ni hao wo shi zhangsan
[root@localhost ~]# read -p "你是谁" bbb  设置提示信息,以便告知用户输入说明内容 (使交互操作更加友好,提高易用性)
你是谁wo shi zhangsan
[root@localhost ~]# echo $bbb
wo shi zhangsan

5)、变量的使用范围
局部变量:只在当前shell环境中有效
全局变量:再所有shell环境中有效

[root@localhost ~]# boss=aaa    定义局部变量
[root@localhost ~]# export boss  把局部变量转化为全局变量
[root@localhost ~]# echo $boss   
aaa
[root@localhost ~]# bash    进入子shell
[root@localhost ~]# echo $boss    再次进行查看,可以正常显示
aaa
[root@localhost ~]# export aaa=zhangsan  直接将变量设置全局变量
[root@localhost ~]# echo $aaa
zhangsan

6)、变量的运算

[root@localhost ~]# X=100
[root@localhost ~]# echo $X
100
[root@localhost ~]# Y=20
[root@localhost ~]# echo $Y
20
[root@localhost ~]# expr $X - $Y  减法运算: "-"
80
[root@localhost ~]# expr $X \* $Y 乘法运算: "\*"
2000
[root@localhost ~]# expr $X / $Y  除法运算: "/"
5
[root@localhost ~]# expr $X % $Y  求模(取余)运算: "%"
0

三.特殊的Shell变量
1).环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、~/.bash_profile

[root@localhost ~]# env  查看当前环境变量

2).常见的环境变量
USER(表示用户名称)、HOME(表示用户的宿主目录)、LANG(表示语言个字符集)、PWD(表示当前所在工作目录)、PATH(表示命令搜索路径)等等。

[root@localhost ~]# echo  $HOSTNAME  = hostname(查看主机名)
[root@localhost ~]# echo $PWD = pwd  (查看当前的工作目录)
[root@localhost ~]# echo $LANG    (查看语言个字符集)
[root@localhost ~]# echo $PATH (查看默认的搜索路径)

3).改变环境变量
临时更改: 给搜索路径中添加/root 执行 PATH="$PATH:/root" 会立即生效,重启后失效

[root@localhost ~]# ll aaa.sh  查看脚本文件的位置
-rwxr-xr-x 1 root root 54 9   4 18:32 aaa.sh
[root@localhost ~]# chmod +x aaa.sh   赋予aaa.sh可执行权限
[root@localhost ~]# PATH="$PATH:/root"  立即生效,重启后消失
[root@localhost ~]# aaa.sh        可以直接以文件名运行脚本
当前目录位于:
/boot

永久更改: 给搜索路径中永久添加root: 执行

1)、echo  PATH="$PATH:/root" >> /etc/profile     (把搜索路径添加到环境变量的主配置文件)
2)、  .  /etc/profile                           (立即执行脚本,让环境变量立即生效)

4).位置变量
使用shell 脚本程序时,方便通过目录行为程序提供操作参数(也叫位置参数;使用$1、$2、…$9 表示;$1 表示脚本或命令后的第一个位置,然后依次类推)

[root@localhost ~]# vim qh.sh
#!/bin/bash
SUM=`expr $1 + $2`  (定义变量SUM,SUM的值是位置变量1 和位置变量2 的和)
echo "$1 + $2 = $SUM"  (返回值的含义就是  $1 + $2 = $1 + $2 )
[root@localhost ~]# chmod +x qh.sh  (赋予脚本可执行权限)
[root@localhost ~]# ./qh.sh 100 11  100就是$1;11就是$2
100 + 11 = 111   (返回的结果)

5).预定义变量
由bash 程序预先定义好的一类特殊变量,用户只能使用,不能创建和修改预定义变量
$# : 命令行中位置变量的个数
$* : 所有位置变量的内容
$0 :当前执行的进程/程序名
$? :上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

[root@localhost ~]# vim beifen.sh
#!/bin/bash
#这是一个备份脚本
aaa=beifen-$(date +%F).tgz
/usr/bin/tar zcf $aaa $* &> /dev/null
echo "执行 $0 脚本"
echo "共对 $# 个进行备份"
echo "具体包括 $* "
[root@localhost ~]# chmod +x beifen.sh
[root@localhost ~]# sh beifen.sh /etc/passwd /etc/shadow
执行 beifen.sh 脚本
共对 2 个进行备份
具体包括 /etc/passwd /etc/shadow

实验完成

你可能感兴趣的:(shell,shell,linux,centos)