一、shell基础
1.shell概念
shell 英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。可以通过shell 命令来操作和控制操作系统,比如Linux中的shell命令就包括 ls、cd、pwd 等等。
shell 在内核的基础上编写的一个应用程序,它连接了用户和 Linux 内核,从而让用户能够更加便捷、高效、安全的使用 linux 内核,这其实就是 shell 的本质。
使用专业术语的说法来解释,Shell 其实是一个命令解释器,它通过接受用户输入的 Shell 命令来启动、暂停、停止程序的运行或对计算机进行控制。
shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出,简单来说shell就是一个用户跟操作系统之间的一个命令解释器
常见的shell:
Bourne Shell (/usr/bin/sh或/bin/sh)
Bourne Again Shell (/bin/bash)
C Shell (/usr/bin/csh)
K Shell (/usr/bin/ksh)
Shell for Root (/sbin/sh)
2.shell脚本
shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行,它从一定程度上减轻了工作量,提高了工作效率,还可以批量、定时处理主机,方便管理员进行设置或者管理。
3.shell脚本编写注意事项
shell命名: shell脚本名称命名一般为英文、大写、小写、后缀以.sh结尾
不能使用特殊符号、空格
名称要写的一眼可以看出功能,也就是顾名思义
shell脚本首行需要#!/bin/bash开头
shell脚本变量不能以数字、特殊符号开头,可以使用下划线 _,但不能用破折号——
二、编写shell脚本
1.编写hello world
[root@shall ~]# vim a.sh
#!/bin/bash
echo "Hello word"
执行shell脚本的几种方法:
1)
[root@shall ~]# bash a.sh
Hello word
2)
[root@shall ~]# chmod +x a.sh
[root@shall ~]# ./a.sh
Hello word
3)
[root@shall ~]# source a.sh
Hello word
4)
[root@shall ~]# sh a.sh
Hello word
2.编写nginx安装脚本
[root@shall src]# mkdir -p /root/shell/
[root@shall src]# vim /root/shell/install_nginx.sh
#!/bin/bash
yum -y install gcc gcc-c++ make pcre-devel openssl-devel wget
cd /usr/local/src/
wget 'https://nginx.org/download/nginx-1.22.1.tar.gz'
tar -xf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/usr/local/nginx
make -j 4
make install
[root@shall src]# sh /root/shell/install_nginx.sh
[root@shall src]# nginx
3.
[root@shall src]# vim b.sh
#!/bin/bash
useradd $1
echo $2|passwd --stdin $1
[root@shall src]# bash b.sh xxxx dwa
更改用户 xxxx 的密码 。
passwd:所有的身份验证令牌已经成功更新。
4.
[root@shall src]# vim d.sh
#!/bin/bash
num1=3
num2=4
if [ $num1 -eq $num2 ];then
echo "两个数字相等"
else
echo "两个数字不相等"
fi
[root@shall src]# sh d.sh
两个数字不相等
5.
[root@shall src]# vim e.sh
#!/bin/bash
read -p "请输入要测试的网址:" web # read:命令行内输入web的变量值
ping -c 3 $web &> /dev/null # ping -c 3,连接某个网站三次
if [ $? -eq 0 ];then # 如果ping命令执行成功,那么
echo "此时网络畅通!" # 输出“此时网络畅通”
else # 否则
echo "无法访问,请检查网址是否输入正确或检查相关的网络配置!" # 输出“无法访问...”
fi # if语句的结尾
[root@shall src]# sh e.sh
请输入要测试的网址:www.baidu.com
此时网络畅通!
6.
[root@shall src]# vim f.sh
#!/bin/bash
read -p "请输入账号" user
if [ $user == "admin" ];then
echo "欢迎登录,$user"
else
echo "账号或密码错误"
fi
[root@shall src]# sh f.sh
请输入账号sw
账号或密码错误
[root@shall src]# sh f.sh
请输入账号admin
欢迎登录,admin
四、变量
1.概念
变量用来存放系统或用户需要使用的特定参数或者值,变量的值可以根据用户设定或者系统环境变化而相应变化,在Shell脚本中使用变量,可使脚本更加灵活,适应性更强。
与变量相对应的是常量,常量例如“Hello World”,是不可改变的。
变量可以给个变量名,假如为name,值是可变的。
2.变量注意事项
变量命名规则:必须由大写字母、小写字母、下划线、数字,并且首字母不能是数字
在变量命名时:建议也简写出该变量是什么用处
变量值的类型:值的类型会分为整型、浮点型、字符串型、布尔型等,而且使用变量需要指定类型Shell 默认的变量类型都是字符串,无需指定类型。
3.变量的分类
(1)自定义变量
由用户自己定义、使用和修改
[root@shall ~]# A=1314 //左边是变量,右边是值
[root@shall ~]# echo $A
1314
[root@shall ~]# unset A //清除变量
[root@shall ~]# echo $A
变量名=值中,等于号=之前和之后不能有空格,比如:name = yang,这样是错的,name=yang 才对
变量名=值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符串。
(2)环境变量
由系统维护,用于设置工作环境
$PWD
$SHELL
$USER
$PATH
[root@shall ~]# env //查看所有的环境变量
[root@shall ~]# echo $PWD
/root
[root@shall ~]# echo $SHELL
/bin/bash
[root@shall ~]# echo $USER
root
[root@shall ~]# echo $PATH
/usr/local/redis269/bin/:/usr/local/mongodb/bin/:/usr/local/python3124/bin/:/opt/apache-maven-3.9.8/bin/:/usr/local/jdk/jdk-17.0.11/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
其中PATH变量用于设置可执行程序的默认搜索路径,可以修改全局变量文件/etc/profile 或修改某用户家目录下的~/.bash_profile文件永久改变环境变量。
(3)位置变量
通过命令行给脚本程序传递参数 (也属于预定义变量)
为了在使用Shel脚本程序时,方便通过命令行为程序提供操作参数,Bash引入了位置变量的概念位置变量有 n,n为1~9之间的数字
$0:第一个字段表示命令名或脚本名称
$1:脚本要处理的第一个参数
$2:脚本要处理的第二个参数
……
Shell脚本最多可以直接处理9个参数
[root@shall ~]# vim g.sh
#!/bin/bash
ifconfig $1 | grep -w inet | awk '{print $2}'
[root@shall ~]# sh g.sh
192.168.1.100
192.168.2.100
192.168.3.100
127.0.0.1
(4)预定义变量
Bash中内置的一类变量,不能直接修改
预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$* :将所有参数作为整体
$@:单个参数的组合,每个参数占一行
$0 :保存了脚本名称
$? :保存命令或脚本的执行状态码
$# :保存脚本要处理的参数的个数
[root@shall ~]# vim h.sh
#!/bin/bash
for x in "$*"
do
echo $x
done
for y in "$@"
do
echo $y
done
[root@shall ~]# sh h.sh 1 2 3 4 5 6
1 2 3 4 5 6 //$*的结果
1
2
3
4
5
6 //$@的结果
4.变量的定义与输出
(1)定义一个新的变量
格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写
(2)变量符号运用
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:”`“或$(): 命令替换,提取命令的执行结果
[root@shall ~]# X=aaa
[root@shall ~]# echo "$X"
aaa
[root@shall ~]# echo '$X'
$X
[root@shall ~]# ip1=`ifconfig ens33 | grep -w inet | awk '{print$2}'`
[root@shall ~]# ip2=$(ifconfig ens33 | grep -w inet | awk '{print$2}')
[root@shall ~]# echo $ip1
192.168.1.100
[root@shall ~]# echo $ip2
192.168.1.100
[root@shall ~]# x=100
[root@shall ~]# y=50
[root@shall ~]# z=`expr $x + $y` //整数运算
[root@shall ~]# echo $z
150
[root@shall ~]# x=1.4
[root@shall ~]# expr $x + 1 //判断是否为浮点数
expr: 非整数参数
[root@shall ~]# [ $? -ne 0 ] && echo "x为浮点数"
x为浮点数
(3)输入与输出
输入格式:read [-p "显示的提示信息"] 变量名
输出格式:echo $变量名
[root@shall ~]# read x y
1 3
[root@shall ~]# echo $x $y
1 3
[root@shall ~]# read -p "请输入你要赋值的变量值" x y
请输入你要赋值的变量值1 5
[root@shall ~]# echo $x $y
1 5
5.变量的作用范围
默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变量。当进入子程序或新的子shell 时,局部变量将无法再使用。
为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”。
格式 1:export 变量名
格式 2:export 变量名=值
6.变量的数学运算
(1)整数运算
格式:expr 变量1 运算符 变量2 运算符 变量3....
运算符:+ - * /(+ - × ÷)
[root@shall ~]# x=123
[root@shall ~]# y=111
[root@shall ~]# expr $x + $y //加
234
[root@shall ~]# expr $x - $y //减
12
[root@shall ~]# expr $x \* $y //乘
13653
[root@shall ~]# expr $x / $y //除
1
[root@shall ~]# expr $x % $y //取余
12
(2)精度计算
[root@shall ~]# yum -y install bc //精度计算之前,必须先安装bc这个软件,否则只能进行整数运算
[root@shall ~]# echo "scale=5; $x / $y" | bc
1.10810