Shell 脚本应用(一)

一、Shell 基础

1.为什么用 Shell 脚本

用来解决服务器自动化运维,减轻管理员的工作量,解决大量的重复性的输入和交互式操作问题。

2.用户的登录 Shell

  • Shell:一个特殊的应用程序,位于用户和操作系统内核之间,用来把用户输入的命令解释给系统内核去执行,并输出执行结果 (解释器)
  • 查看 Linux 系统所支持的 Shell 脚本种类:cat /etc/shells
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash									# /bin/bash 是大多数 Linux 系统的默认 Shell
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

在这里插入图片描述
1)编写一个 Shell 脚本

基本格式:

[root@localhost ~]# vim shell.sh 							# 前面的 shell 可以随意. 后缀必须为  .sh
#!/bin/bash										# 脚本声明
# This is a Simple Shell Script					# 注释
cd /mnt											# 脚本要执行的命令
echo "当前目录位于:"
pwd

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 变量的使用能够提供更强的适应性与功能。

1.自定义变量

  • 由系统用户自己去定义,只在用户自己的 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

2.变量赋值的特殊操作

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  									# 查看当前环境变量

常见的环境变量:

  • USER:表示用户名称。
  • HOME:表示用户的宿主目录。
  • LANG:表示语言个字符集。
  • PWD:表示当前所在工作目录。
  • PATH:表示命令搜索路径。
[root@localhost ~]# echo  $HOSTNAME  = hostname 			# 查看主机名
[root@localhost ~]# echo $PWD = pwd   						# 查看当前的工作目录
[root@localhost ~]# echo $LANG     							# 查看语言个字符集
[root@localhost ~]# echo $PATH  							# 查看默认的搜索路径

改变环境变量:

  • 临时更改: 给搜索路径中添加 /root 目录时,执行 PATH=$PATH:/root 即可(但重启后便会失效)
  • 永久更改: 需要将变量写入 /etc/profile文件内(如:echo PATH="$PATH:/root" >> /etc/profile && source /etc/profile)

2.位置变量

使用 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   								# 返回的结果
  • 注意:如果当位置变量超过 $9,即 $10,$11 … 时,则需要使用 { } 来括起来。如: ${11}

2.预定义变量

  • 由 bash 程序预先定义好的一类特殊变量,用户只能使用,不能创建和修改预定义变量。

预定义变量:

变量值(作用)
$#运行脚本时的位置变量个数(如:bash 1.sh 7 1 1 9,此时 $# 的值便是 4)
$*所有位置变量的内容(如:bash 1.sh 7 1 1 9,此时 $* 的值便是 7 1 1 9
$@所有位置变量的内容
$0当前执行的进程/程序名(如:bash 1.sh 7 1 1 9,此时 $0 的值便是 1.sh
$$Shell 脚本本身的 PID 号(ProcessID,即运行脚本当前进程的 ID 号)
$!后台运行的最后一个进程的 PID 号
$?上一条命令执行后返回的状态(当返回的状态值为 0 时表示执行正常,非 0 时表示执行异常或出错)
  • $*$@ 的区别:前者是把位置变量内容视为 整体 来输出,后者是把位置变量视为 个体 来输出;
  • 注意: 上面所说的区别,只有在 for 循环中使用双引号括起来时,才会出现。
[root@localhost ~]# vim beifen.sh
#!/bin/bash
#这是一个备份脚本
A=beifen-$(date +%F).tgz										# 定义变量格式
/bin/tar czf $A $* &> /dev/null					
echo "执行 $0 脚本"
echo "共对 $# 个进行备份"
for B in "$*"
do
echo '$*的位置变量内容:'"$B"
done
for C in "$@"
do
echo '$@的位置变量内容:'"$C"
done
echo "当前脚本的进程号为:$$"
[root@localhost ~]# bash beifen.sh /etc/passwd /etc/shadow
[root@localhost ~]# echo $?

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿许浪尽天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值