关于shell脚本语言的概念:
linux系统开启时,默认开启使用的解释器是bash
我们可以在当前系统中开启很多解释器,在命令行中直接敲解释器的绝对路径,就会变更当前终端所使用的解释器,退出当前解释器输入exit
查看都有什么解释器:
cat /etc/shells
在命令行里echo $0可以查看当前终端在用的解释器是什么
shell脚本文件的后缀.sh
脚本需要赋予x权限
执行脚本的方法:
bash 脚本
#脚本本身可以没有x权限
#新开bash解释器执行脚本,但是执行脚本完成以后,会退出这个解释器,所以就看不出cd到别的目录这样的效果
#想要看到cd到别的目录效果,加一个sleep 100就可以看到cd效果并退出解释器的效果
#新开的bash也可以通过pstree看出效果
source 脚本
#. 脚本 也相当于是source,简写
#脚本本身可以没有x权限
#使用当前系统在使用解释器执行脚本,如果脚本里有cd到别的目录这样的命令,可以直接看出效果
加了x权限后直接执行脚本:
直接可以执行脚本,使用的是当前终端中的解释器
脚本结构:
1.声明解释器
#!/bin/bash
2.注释,脚本功能变量含义等
3.具体代码,会逐行执行
用shell编写一个yum仓库示例:
#!/bin/bash
echo "[abc]
name=haha
baseurl=http://.....
gpgcheck=0
enable=0" > /etc/yum.repos.d/abc.repo
#" "里是一个整体,有空格有回车,都可以作为一个整体传递给后面
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
变量:
为了让脚本增加灵活度,适应多变的环境,而使用变量,变量是一个容器,以不变的名称存放可以变化的值
定义变量的规则:
变量名称可以使用字母、数字、下划线
不能以数字开头
不能使用特殊符号
变量类型:
环境变量(全局变量)、自定义变量、位置变量、预定义变量
————————————————————————————————————————————————————————————————————————————————————
自定义变量:
a1=10 #起了一个变量a1,赋值数字10,也可以赋值字符
想要更改这个变量的值,可以重新赋值,比如a1=20
如何使用变量:
要引用这个变量就要与$一起使用,例如
echo $a1 #就会把这个变量的值输出
echo ${a1}RMB #这就会输出10RMB,意思告诉系统我只要a1里的值,后面的RMB只是字符
echo $(命令) #会将命令的输出结果作为一条变量,比如echo $(hostname) 就会输出主机名
自定义变量的取消:
如果是在系统中的命令行定义了一个变量,想要取消可以使用unset 变量名取消这个变量,当然在脚本中也可以取消
unset a1
查看当前shell环境中所有的变量:
命令set
————————————————————————————————————————————————————————————————————————————————————
环境变量:
系统定义好的变量,可以直接使用的变量,这些变量名都是大写字母的组合,全局变量的意义就在于所有的bash(所有的终端都能使用)
echo $USER
#这个当前环境中的用户,谁去执行的这个脚本,输出谁的用户名,因为有可能不是root用户,此时就体现作用了
echo $UID
#这个当前环境中用户UID
echo $HOME
#这个当前环境中用户家目录
echo $SHELL
#这个当前环境中用户使用的解释器,默认操作系统解释器是bash
echo $PS1
#这个当前环境中用户的1级提示符,就是root@localhost ~ 这个显示
echo $PATH
#这个当前环境中当用户输入一个命令时,Bash会按照PATH变量中定义的目录顺序查找该命令,直到找到为止。
#当我们写完一个脚本,可以直接放在这个变量定义的目录里,此时那1个脚本就不用写绝对路径去执行而是可以直接执行了,我们使用的命令都在这些目录里
echo $PS2
#这个当前环境中用户的2级提示符,当我们同一条命令使用 \ 换行时,显示的 > 这个就是二级提示符
echo $PWD
#这个当前环境中用户当前所在目录
echo $HISTSIZE
#这个当前环境中历史命令的条数
在shell环境中设置一个环境变量:
a=10
export a
#将a设置为全局变量,此时再开一个新的终端(另一个终端使用新的解释器),不设置成全局变量,只有本终端生效。
#另一个终端里也有这个a变量了
export -n a
#取消a这个全局变量,让它变为当前终端中的普通变量
export VARNAME="value"
#这会设置一个名为 VARNAME 的环境变量,并将其值设置为 "value"。
#使用 export 设置的变量是临时的,如果关机,这个变量就会消失。
#永久生效需要在你的 ~/.bashrc、~/.bash_profile、~/.zshrc(取决于你使用的Shell)或其他相关的初始化文件中添加 export 命令。
命令env:
可以显示当前bash中所有的环境变量
————————————————————————————————————————————————————————————————————————————————————
位置变量:
$1 $2 ....
我们在执行脚本时,需要在脚本后面输入参数比如bash a.sh 111 222
此时111就是$1的值 222就是$2的值
————————————————————————————————————————————————————————————————————————————————————
预定义变量(在脚本里用):
$# 所有的位置变量的数量,你脚本运行时输入了几个参数,这里就是几
$$ 当前这个脚本运行时的进程号
$* 显示所有的位置变量,你参数是啥就显示啥
$? 检测上一个指令是否有问题,只要不是0,上一条指令就有问题
$0 脚本执行时,这个脚本的名称,也可以在脚本外用,在命令行用就是看当前的命令行用的哪个解释器
$! 显示上一个放在后台的进程它的进程号
————————————————————————————————————————————————————————————————————————————————————
read -p变量:与用户交互,让用户输入一个值,自动将记录的值赋值给一个变量
read -p '' 变量名
例如:
vim /b.sh
#!/bin/bash
read -p '请输入用户名' a
useradd $a &> /dev/null
#当用户执行脚本的时候,会显示‘请输入用户名’并且用户可以输入内容,用户输入的内容就会赋值给变量a
————————————————————————————————————————————————————————————————————————————————————
$RANDOM
这个变量是预定义的,存的是随机数,其范围默认是从0到32767
通常与%连用
比如:
echo $[ RANDOM%4 ]
#那么它的余数必然就是0、1、2、3,因为取余吗,余数肯定不会是4,是4就被整除了,也不可能是5,因为5还能被4除
#比4小的数,除以4,余数是这个数本身。