8、shell 脚本

1.shell 脚本基础

作用:介于系统内核与用户之间,负责解释命令行

1.1.第一个 shell 脚本

vim first.sh

cd /boot/
pwd
ls -lh vml*z

赋予可执行权限:chmod +x firest.sh

执行脚本方式(三种)

./first.sh

sh /first.sh

source /first.sh

完善脚本构成:脚本声明;注释信息;可执行语句

vim /first.sh

#!/bin/bash
# This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以 vml 开头的文件包括:"
ls -lh vml*

1.2.重定向与管道操作

交互式硬件设备

  标准输入:从该设备接收用户输入的数据

  标准输出:通过该设备向用户输出数据

  标准错误:通过该设备报告执行出错信息

 重定向操作

 管道符:将左侧的命令输出结果,作为右侧命令的处理对象

1.3.变量

类型:

  自定义变量

  环境变量:用于设置工作环境

  位置变量:通过命令行给脚本程序传递参数

  预定义变量:Bash 中内置的一类变量,不能直接修改

赋值时使用引号:

  双引号:允许通过 $ 符号引用其他变量值

  单引号:禁止引用其他变量值,$ 视为普通字符

  反引号:命令替换,提取命令执行后的输出结果

从键盘输入内容为变量赋值:

read [-p "提示内容"] 变量名

常用运算符:

+、-、\*、/、%(求模、取余运算)

环境变量:

配置文件:/etc/profile、~/.bash_profile

常见环境变量:

  PWD、PATH、USER、SHELL、HOME

位置变量:

表示为 $n(n为 1-9 的数字)

 预定义变量:

$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为 0 时表示执行正常,非 0 值表示执行异常或出错
$0:当前执行的进程/程序名

 1.4.一键搭建 dhcp 服务

vim /root/install-dhcp.sh

#!/bin/bash
umount /dev/sr0
mount /dev/sr0 /media
rm -rf /etc/yum.repos.d/*
echo "[test-sh]" >> /etc/yum.repos.d/test.repo
echo "name=test" >> /etc/yum.repos.d/test.repo
echo "baseurl=file:///media" >> /etc/yum.repos.d/test.repo
echo "enable=1" >> /etc/yum.repos.d/test.repo
echo "gpgcheck=0" >> /ect/yum.repos.d/test.repo
yum -y install dhcp*

read -p "subnet:" NET
read -p "network:" MASK
read -p "range:" RANGE
read -p "dns1:" DNS1
read -p "dns2:" DNS2
read -p "gateway:" GATE
read -p "broadcast:" BROA
echo "subnet $NET netmask $MASK {" > /etc/dhcp/dhcpd.conf
echo "range $RANGE;" >> /etc/dhcp/dhcpd.conf #指定IP地址范围
echo "option domain-name-servers $DNS1,$DNS2;" >> /etc/dhcp/dhcpd.conf
echo 'option domain-name "internal.example.org";' >> /etc/dhcp/dhcpd.conf
echo "option routes $GATE;" >> /etc/dhcp/dhcpd.conf
echo "option broadcast-address $BROA;" >> /etc/dhcp/dhcpd.conf
echo "default-lease-time 600;" >> /etc/dhcp/dhcpd.conf
echo "max-lease-time 7200;" >> /etc/dhcp/dhcpd.conf
echo "}" >> /etc/dhcp/dhcpd.conf
systemctl start dhcpd

1.5.test 命令

测试特定的表达式是否成立,当条件成立时,测试语句的返回值为 0,否则为其他数值

格式1:test 条件表达式

格式2:[ 条件表达式 ](至少应该有一个空格)

文件测试

[ 操作符 文件或目录 ]

常用测试操作符:

-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(excute)

[ -d /media/cdrom ]

echo $?(返回 0 表示条件成立,否则不成立)

[ -d /media/cdrom ] && echo "YES"

1.6.整数值比较

[ 整数1 操作符 整数2 ]

-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于或等于
-le:小于或等于

1.7.字符串比较

格式1:[ 字符串1 = 字符串2 ] 或者 [字符串1 != 字符串2 ]

格式2:[ -z 字符串 ]

=:字符串内容相同
!=:字符串内容不同
-z:字符串内容为空

2.shell 脚本分支语法

2.1.if 语句

if 条件测试操作
    then 命令序列
elif 条件判断
then 命令序列
else
命令执行语句 fi

3.shell 脚本循环语法

3.1.while 循环

while 条件测试操作
do
    命令序列
done

3.2.for 循环

for 变量名 in 取值列表
do
    命令序列
done

3.3.case 语句

case 变量值 in
模式1)
    命令序列1
    ;;
模式2)
    命令序列2
    ;;
*)
    默认命令序列
esac

4.正则表达式使用

4.1.正则表达式组成

普通字符:大小写字母、数字、标点符号及其他一些符号

元字符:在正则表达式中具有特殊意义的专用字符

常见元字符:

^:开头
$:结尾
.:单个任意字符
\:使右侧正则符号失去含义,变为字符
*:匹配左侧表达式 0 次到任意次
[]:范围选择匹配符,匹配的信息不再是任意,由 [] 内信息决定
{}:匹配左侧表达式的个数,在 shell 中需要转义:\{\}
{n}:匹配左侧表达式 n 个
{n,}:匹配左侧表达式 n 个到任意个
{n,m}:匹配左侧表达式 n 个到 m 个(最少 n 个,最多 m 个)

IP地址正则:[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}

扩展
+:匹配左侧表达式一个或多个
?:匹配零个或一个
|:多个信息中匹配某一个
():查找 “组” 字符串
()+:辨别多个重复的组

\t:表示横向制表符,tab 大空格
\n:换行符

 

posted @ 2024-04-12 22:28  落落的学习  阅读(17)  评论(0编辑  收藏  举报