SHELL 基础

什么是shell:

在Linux内核与用户之间的解释器程序,通常指 /bin/bash,**负责向内核翻译及传达用户/程序指令**,相当于操作系统的“外壳”。采用非交互式命令。

解释器分类:
在这里插入图片描述
Bash的优点 :

	tab键、历史命令、快捷键、支持别名、管道、重定向。

脚本的编写规范
1, 在第一行声明解释器(使用哪种解释器)
#!/bin/bash
2,在第二行描述具体内容,内容可以是脚本的功能、作用等介绍(或者是步骤、思路、用途、变量含义等)
#这是一个测试脚本
在这里插入图片描述

脚本的执行方式
1, 使用路径指向一个具有x权限的文件
#chmod a+x test01.sh
# ./test01.sh
2, 使用解释器,无需x权限,新开启解释器子进程
[root@svr7 opt]# bash test01.sh
3, 使用source命令,无需x权限,不会开启解释器子进程,而使用默认解释器进程
[root@svr7 opt]# source test01.sh
4,bash 与 source 执行进程的区别:
在这里插入图片描述
bash执行时看不到进入abc的效果,因为bash开启了子进程,执行完任务就退出了子进程,父进程并没有进入abc目录,如果使用source执行该脚本就可以看到进入abc目录的效果,因为是父进程亲自进入没有开启子进程。

减少输出信息:
编写部署ftp的脚本,要求是开启服务的状态,并且开机自启
#!/bin/bash
#部署ftp服务
yum -y install vsftpd &> /dev/null #将输出信息输出到垃圾桶中,即不打印输出信息。
systemctl restart vsftpd
systemctl enable vsftpd
常量 固定不变的内容
变量 以固定名称存放,可能会变化的值
提高脚本对任务需求、运行环境变化的适应能力。方便在脚本中重复使用。
变量的种类:

	1,	自定义变量,定义名称时可以用数字、大小写字母,下划线,不允许使用数字开头,不允许使用特殊字符
				变量名称=变量的值
				[root@localhost opt]# a=10   定义变量(赋值)
				[root@localhost opt]# echo $a  调用变量
				[root@localhost opt]# unset a 取消变量的定义
				echo ${a}RMB   容易发生混淆的情况使用大括号

		2,环境变量,由系统提前定义好,使用时直接调用,无需用户定义
						USER当前用户名   		HOME当前用户的家目录  
						UID当前用户的id号     SHELL当前用户的解释器   
						PWD当前位置   			PATH 存储了执行指令的路径
						PS1  一级提示符         PS2   二级提示符
		3 预定义变量与位置变量  $*   $#    $$   $?   $1   $2   $3  …..
					#!/bin/bash
					#测试预定义变量和位置变量
					echo $1   执行脚本名称后面的第1个位置参数    a
					echo $2   执行脚本名称后面的第2个位置参数	b
					echo $3   执行脚本名称后面的第3个位置参数	c
					echo $*   所有的位置参数                                    a b c d
					echo $#   所有的位置参数的个数						4
					echo $$   随机的进程号										6403
					echo $?   判断上一条指令是否执行成功,0是成功,非0是失败	0
					#bash  test.sh  a  b  c  d 

变量的扩展知识:

	单引号  界定范围  可以屏蔽特殊符号 :  
			#Touch ‘a b’  可以创建a空格b的文件
			#a=10
			#echo  ‘ $ a’  : $ 是调用变量的特殊符号,echo '$a'  屏蔽了 $ 在Linux中的功能, $ 符被认为是一个字符,输出结果位 $a	
	双引号  界定范围:
			Touch “a b”  也可以创建a空格b的文件
			echo “$a” 可以调用变量
		
		` `反撇号  获取指令的执行结果 ,或者使用$()
			#a=date    定义变量时如果使用命令则不会直接识别
			#a=`date`   使用反撇号可以将命令的执行结果赋值给变量
			#a=$(date)  效果同上

使用read指令,将脚本变成交互式,使脚本可以从用户那里得到信息:

		用法:read -p “提示的信息”  变量名
						#!/bin/bash
						read -p "请输入用户名:"  u
						useradd $u
						read -p "请输入密码:"  p
						echo $p | passwd --stdin $u
			
			stty  -echo  屏蔽回显,   stty  echo   恢复回显
						#!/bin/bash
						read -p "请输入用户名:"  u
						useradd $u
						stty -echo
						read -p "请输入密码:"  p
						stty echo
						echo "$p" | passwd --stdin $u

export 定义全局变量,可以让子进程使用父进程定义的变量
export b=20 创建变量b的同时发布为全局效果
export a 将已有的变量发布为全局效果
export -n a 取消变量的全局效果
env 查看所有环境变量
set 查看所有变量

shell中的运算:

				1,	使用expr工具
						expr  可以计算并输出,运算符号两边要有空格
						expr 3 – 1   减法
						expr 2  +  2    加法
						expr 2  '*'  2    乘法,*号在Linux中是通配符的意思,单引号将*的功能屏蔽掉了,*就有的它原本的功能了,乘法
						expr 2  \*  2     使用乘法时,这里使用\代表转义符号,可以屏蔽之后1个字符的特殊效果
						expr 4  /  2   除法
						expr 10  %  3    取余数
				
				2,方法二用$[ ]结构,配合echo输出,同样可以实现加 减 乘 除 取余
						echo $[1+1]
						echo $[2-1]
						echo $[2*2]
						echo $[4/2]
						echo $[5%3]
				
				3 , 使用bc 计算器,可以进行小数运算
						echo "1.1+1" | bc    //非交互的方式使用bc工具
						echo "10/3" | bc
						echo "scale=3;10/3" | bc   //scale可以定义小数点后面的长度

				4, 使用let指令,不输出计算结果,专用于创建变量,或者对变量进行自增减
							 let a++    变量的自增减,将变量a的值加1
							 let a--    变量a减1
					  	  	 let a+=2   变量a加2
							 let a-=2   变量a减2
							 let a*=10  变量a乘以10

条件测试: 可以为脚本提供智能判断的效果
使用方式: test 表达式 或者 [ 表达式 ]

	条件测试种类:
		1,	对字符串进行判断
		可以使用的方式有: == 两边是否相等 ; != 两边是否不等
		[ a == a ]  判断字符串a是否等于a,如果相等,返回值就是0
		[ root == $USER ]   判断当前用户名是否叫root,如果是,返回值就是0
		[ root != $USER ]  判断当前用户名是否不叫root,如果不叫root,返回值就是0
		-z  : 判空
		[ -z $a ] 判断变量a是否为空,如果是,返回值是0
		[ ! -z $a ] 判断变量a是否非空,如果是,返回值是0

	2,逻辑符号
			&&  之前任务执行成功才执行之后任务
			||   之前任务执行失败才执行之后任务
			[ root == $USER ] || exit   如果当前用户不是管理员,则退出
			ls || ls   只执行第1个ls
			ls && ls  两个ls都执行
			ls || ls && ls 第一个ls成功,第二个ls没成功,第三个看的是第一个和第二个的组合,输出了ls,所以是成功的,所以第三个ls输出

练习

		编写脚本安装ftp服务,但如果是非管理员执行该脚本则给出非管理员的提示并退出:
		#!/bin/bash
		#测试|| && 符号
		[ root != $USER ]  &&  echo "你不是管理员"  &&  exit
		yum -y install vsftpd
		systemctl restart vsftpd
		systemctl enable vsftpd

		3,数字的条件测试
			-eq是否相等  -ne是否不等  -gt大于  -ge大于等于  -lt小于  -le小于等于
			[ 1 -eq 1 ]  判断1是否等于1,判断成功的话返回值是0,判断失败返回值是非0
			a=10	   
			b=20
			[ $a -eq $b ] && echo "ok" || echo "no"  判断变量a是否等于b ,是的话显示ok,否显示no
			[ $a -gt $b ] && echo "ok" || echo "no"  判断变量a是否大于b ,是的话显示ok,否显示no

		4,对文件进行条件测试
			-e是否存在不关心文件类型   
			-f是否存在且是普通文件  
			-d是否存在且是目录  
			-r判断当前用户对文件是否能读 ,对root无效
			-w判断当前用户对文件是否能写 ,对root无效
			-x 执行(文件),进入(目录)
			[  -e  a  ]   当前位置如果有a文件,不关心类型,则测试成功
			[  -f  a  ]   当前位置如果有叫a的普通文件,则测试成功
			[  -d  a  ]   当前位置如果有叫a的目录,则测试成功
			[  -r  a  ]   当前用户如果对a文件有读权限,则测试成功
			[  -w  a  ]   当前用户如果对a文件有写权限,则测试成功
			[  -x  a  ]   当前用户如果对a文件有执行(目录是进入)权限,则测试成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值