Shell基础
一、Shell概念
Shell是操作系统的外壳,可以通过Shell命令来操作和控制操作系统,例如Linux中的Shell命令包括ls、cd、pwd等。Shell是一个在内核基础上编写的应用程序,它连接了用户和Linux内核,使用户能够更加便捷、高效、安全地使用Linux内核。专业术语来说,Shell是一个命令解释器,通过接受用户输入的Shell命令来启动、暂停、停止程序运行或对计算机进行控制。
二、Shell脚本
Shell脚本是由Shell命令组成的执行文件,将一些命令整合到一个文件中,处理业务逻辑。脚本无需编译即可运行,可以减轻工作量,提高工作效率。还可以批量、定时处理主机,方便管理员进行设置或管理。
示例:
[root@wang ~]# vim helloworld.sh
#!/bin/bash
echo "hello world!"
[root@wang ~]# bash helloworld.sh
hello world!
[root@wang ~]# sh helloworld.sh
hello world!
[root@wang ~]# source helloworld.sh
hello world!
[root@wang ~]# chmod +x helloworld.sh
[root@wang ~]# ./helloworld.sh
hello world!
安装Nginx的Shell脚本示例:
[root@wang ~]# 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@wang shell]# bash install_nginx.sh
变量
一、概念
变量用于存储系统或用户所需的特定参数或值,其值可根据用户设定或系统环境变化而相应变化。在Shell脚本中使用变量可使脚本更灵活,适应性更强。与变量相对应的是常量,如"Hello World",其值不可改变。
二、变量注意事项
- 变量命名规则:由大小写字母、下划线、数字组成,首字母不能是数字。建议命名时简述变量用途。
- 变量值类型:整型、浮点型、字符串型、布尔型等,Shell默认变量类型为字符串,无需指定类型。
- 使用`env`命令查看所有环境变量。
三、位置变量
通过命令行为脚本程序传递参数,位置变量$n(n为1~9之间的数字)表示脚本要处理的第n个参数。$0表示命令名或脚本名称。
四、预定义变量
Bash中内置的一类变量,不能直接修改。如$*表示所有参数作为整体,$@表示单个参数的组合,$0保存脚本名称,$?保存命令或脚本的执行状态码,$#保存脚本要处理的参数个数。
五、变量的定义与输出
- 定义新变量:格式为变量名=变量值,注意变量名以字母或下划线开头,区分大小写。
- 变量符号运用:双引号允许通过$符号引用其他变量值,单引号禁止引用其他变量值,$视为普通字符,反撇号或$()用于命令替换。
- 输入和输出:输入格式为`read [-p "显示的提示信息"] 变量名`,输出格式为`echo $变量名`。
六、变量的作用范围
默认情况下,新定义的变量仅在当前Shell环境中有效,称为局部变量。进入子程序或新的子shell时,局部变量无法再使用。通过`export`内部命令将指定的变量导出为“全局变量”,使其在所有子Shell环境中继续使用。
七、变量的数学运算
整数运算:格式为`expr 变量1 运算符 变量2 运算符 变量3...`,运算符包括+、-、*、/。
[root@wang shell]# vim test001.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
echo $5
[root@wang shell]# bash test001.sh 1 2 3 4 5
1
2
3
4
5
[root@wang shell]# vim yonghu.sh
#!/bin/bash
useradd $1
echo $2 | passwd --stdin $1
[root@wang shell]# bash yonghu.sh www ww
更改用户 www 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@wang shell]# vim s01.sh
#!/bin/bash
for x in "$*"
do
echo $x
done
[root@wang shell]# bash s01.sh 1 q 2 w 3 e
1 q 2 w 3 e
[root@wang shell]# vim wang.sh
#!/bin/bash
read -p "输入网址" weburl
ping -c 3 $weburl &> /dev/null
if [ $? -eq 0 ]; then
echo "网络畅通"
else
echo "网络不通"
fi
[root@wang shell]# sh wang.sh
输入网址www.baidu.com
网络畅通
[root@wang shell]# vim zifu.sh
#!/bin/bash
read -p "请输入账号" user
echo $user
if [ $user == "admin" ]; then
echo "欢迎登陆: $user"
else
echo "账号或密码错误"
fi
[root@wang shell]# bash zifu.sh
请输入账号admin
admin
欢迎登陆: admin
[root@wang shell]# vim rpm1.sh
#!/bin/bash
rpm -qa | grep nginx
if [ $? -eq 1 ]; then
yum -y install nginx
else
yum -y remove nginx
yum -y install nginx
fi
[root@wang shell]# bash rpm1.sh
数字判断
一、格式
- eq:equal,等于,一般用于 `[ $? -eq 0 ]`,也就是判断上条命令返回值等于 0,直接数字与数字也可以使用 -eq 表示等于。
- ne:not equal,不等于,一般用于 `[ $? -ne 0 ]`,判断上条命令返回值不等于 0。
- gt:greater than,大于。
- ge:greater or equal,大于或等于。
- lt:less than,小于。
- le:less or equal,小于或等于。
二、字符串判断
1、格式
`[ 字符串1 == 字符串2 ]` 字符串内容相同。
`[ 字符串1 != 字符串2 ]` 字符串内容不同。
`[ -z 字符串 ]` 字符串内容为空。
`[ -n 字符串 ]` 字符串内容不为空。
三、文件、目录、权限的判断
1、格式
`[ 操作符 文件或目录]`
常用的测试操作符:
-e "文件目录或自定变量" 判断文件或目录是否存在 exists。
-f "文件目录或自定变量" 判断是否为文件 isfile。
-d "文件目录或自定变量" 判断是否为目录 isdirect。
-w "文件目录或自定变量" 判断是否可写 w。
-r "文件目录或自定变量" 判断是否可读 r。
-x "文件目录或自定变量" 判断是否可执行 x。
-s "文件目录或自定变量" 判断文件大小,非0时为真 (若为非空文件,则为真) size。
-z "文件目录或自定变量" 判断变量参数值是否为空,为空为真,非空为假 zore。
四、与或判断
判断多个条件
多个条件其中一个成立,或运算判断:|| 或,两个条件满足其一即可,还有-o。
多个条件都要成立,与运算判断:&& 与,两个条件都得满足才行,还有&。
[root@localhost test]# vim yu.sh
#!/bin/bash
read -p "请输入一个数值:" age
if [ $age -gt 30 ] && [ $age -lt 80 ]; then # 这两个条件都得满足,大于30且小于80,可使用[ $age -gt 30 -a $age -lt 80 ]
echo "age>30 and age<80"
echo "working"
else
echo "in else"
fi
[root@localhost test]# sh ./yu.sh
请输入一个数值:60
age>30 and age<80
working
[root@localhost test]# sh ./yu.sh
请输入一个数值:90
in else
七、多重判断语法 elif
if 条件1; then
#命令,条件1成立执行
elif 条件2; then
#命令,条件1不成立,条件2成立执行
elif 条件3; then
#命令,条件1不成立,条件2不成立,条件3成立执行
else
#命令,以上条件都不成立执行
fi
五、多重判断的 case 语句
1、case 语句概述
case 语句是多分支选择语句,使用case语句改写if多分支可以使脚本结构更加清晰、层次分明。针对变量的不同取值,执行不同的命令序列,case还支持正则表达式。
2、case 语句的结构
case $变量名称 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认命令序列
esac
脚本的数学运算
一、for 循环
1、作用
读取不同的变量值,以逐个执行同一组命令。
2、结构
for 变量名 in 取值列表(范围)
do
命令序列
done
取值列表可以是数字范围、字符串、多个字符串、提前设定好的变量等。for默认以所有的空白字符进行分隔:tab、空格、回车,去循环处理。分割成几段就循环几次。
[root@localhost test]# vim quzhi.sh
#!/bin/bash
for home in 北京 上海 ⼴州 深圳 # home变量在北京、上海、广州、深圳这四个地名中间循环一次
do
echo "$home 是个好地方!"
done
[root@localhost test]# bash quzhi.sh
北京 是个好地方!
上海 是个好地方!
⼴州 是个好地方!
深圳 是个好地方!
二、while 循环
1、作用
重复测试某个条件,只要条件成立则反复执行。
2、结构
while 条件测试操作
do
命令序列
done
3、while和for区别
while循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出。if判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出。
示例脚本(九九乘法表):
[root@localhost test]# vim 99.sh
#!/bin/bash
for i in {1..9}; do
for j in {1..9}; do
echo -n "$j*$i=$(($i*$j)) "
if [ $j == $i ]; then
echo -e '
'
break
fi
done
done
[root@localhost test]# bash 99.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
...
sed流式编辑器
一、概述
sed是文本处理工具,读取文本内容,根据指定条件进行处理,可实现增删改查的功能。sed依赖于正则表达式。
1、格式
sed '过滤+动作' 文件路径
2、选项
-e 指定要执行的命令 (操作),只有一个编辑命令 (操作) 时可省略。
-n 只输出处理后的行,读入时不显示,不对原文件进行修改。
-i 直接修改源文件,不输出结果。
二、编辑命令格式
'/地址 1,地址 2/操作(参数)'
1、地址
可为行数、正则表达式、$,没有地址代表全文。
2、操作
p 打印(输出)
d 删除(整行)
s 替换(字符串匹配)
c 替换(整行)
r 读取指定文件(追加到行后)
a (append)追加到指定内容到行后
i (insert)追加指定内容到行前
w 另存为
n 表示读入下一行内容
H 复制到剪贴板
g 将剪贴板中的内容覆盖到指定行
G 将剪贴板中的内容追加到指定行后
示例:
[root@localhost test]# sed -n '12p' test.txt # 输出第12行内容
HELLO
[root@localhost test]# sed -n '3,5p' test.txt # 输出3~5行内容
good
goood
gooood
...
三、sed 命令引用变量
1. sed命令使用单引号的情况下,可以使用 '"$var"' 引用(单引号,然后双引号,变量):
sed -i '2s/node_base/'"$i"'/' /etc/libvirt/qemu/$i.xml
1. sed命令中使用双引号的情况下,直接 shell command 或者 $(shellcommand) 引用命令执行。
sed -i "2s/node_base/$i/" /etc/libvirt/qemu/$i.xml
#!/bin/bash
# 备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
read -p "请输入指定ip地址:" ip
# 替换dhcp 为 none
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
# 在文档最后添加5行
[root@wang shell]# vim initserver.sh
# IPADDR
#!/bin/bash
# 备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
read -p "请输入指定ip地址:" ip
# 替换dhcp 为 none
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
# 在文档最后添加5行
# IPADDR
sed -i '$aIPADDR='"$ip"'' /etc/sysconfig/network-scripts/ifcfg-ens33
# NETMAST
sed -i '$aNETMASK=255.255.255.0' /etc/sysconfig/network-scripts/ifcfg-ens33
# GATEWAY
sed -i '$aGATEWAY=10.1.1.2' /etc/sysconfig/network-scripts/ifcfg-ens33
# DNS1
sed -i '$aDNS1=8.8.8.8' /etc/sysconfig/network-scripts/ifcfg-ens33
# DNS2
sed -i '$aDNS2=114.114.114.114' /etc/sysconfig/network-scripts/ifcfg-ens33
# 修改uuid
# 修该主机名称
read -p "请输入主机名称" hn
hostnamectl set-hostname $hn
# 停用selinux
setenforce 0
sed -i '/SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
# 停用防火墙
systemctl stop firewalld
systemctl disable firewalld
# 停用NetworkManage
systemctl stop NetworkManager
systemctl disable NetworkManager
# 重启网络服务
systemctl restart netword

被折叠的 条评论
为什么被折叠?



