1322 字
7 分钟
Shell 脚本基础

shell脚本#

1 shell脚本概念#

什么是脚本?
脚本就是由Shell命令组成的文件,这些命令都是可执行程序的名字,脚本不用编译即可运行。

1.1 shell和shell脚本有什么区别#

shell和shell脚本有什么区别?
确切一点说,Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。

1.2 shell环境介绍#

如果是不带有图形环境的 Linux 系统(比如专用于服务器的系统),启动后就直接是命令行环境。
不过,现在大部分的 Linux 发行版,尤其是针对普通用户的发行版,都是图形环境。用户登录系统后,自动进入图形环境,需要自己启动终端模拟器,才能进入命令行环境。
所谓“终端模拟器”(terminal emulator)就是一个模拟命令行窗口的程序,让用户在一个窗口中使用命令行环境,并且提供各种附加功能,比如调整颜色、字体大小、行距等等。
不同 Linux 发行版(准确地说是不同的桌面环境)带有的终端程序是不一样的,比如 KDE 桌面环境的终端程序是 konsole,Gnome 桌面环境的终端程序是 gnome-terminal,用户也可以安装第三方的终端程序。所有终端程序,尽管名字不同,基本功能都是一样的,就是让用户可以进入命令行环境,使用 Shell。

1.3 shell脚本基本格式#

“#!” 约定的标记,告诉系统这个脚本使用哪个命令解释器来执行
/bin/bash:执行过程中,若命令执行失败,仍然会继续执行。
/bin/sh:执行过程中,若出现命令执行失败,则会停止执行。
不使用命令解释器环境:默认情况下使用/bin/bash,具体根据用户的默认命令解释器环境

2 案例1:脚本修改静态IP#

#! /bin/bash
cd /etc/sysconfig/network-scripts/
echo "TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.151.233
NETMASK=255.255.255.0
GATEWAY=192.168.151.254
DNS1=218.104.128.106" > ifcfg-ens33
systemctl restart network
ifconfig ens33

2.1 shell变量#

变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
1.命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
2.中间不能有空格,可以使用下划线“_”。
3.不能使用标点符号。
4.不能使用bash里的关键字(可用help命令查看保留关键字)。

2.2 read交互#

read简介
要与Linux交互,脚本获取键盘输入的结果是必不可少的。
选项:
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。换行符或回车算一个字符。其中
-p:给出提示符。默认不支持"\n"换行,要换行需要特殊处理,见下文示例。例如,"-p 请输入密码:"
-r:禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。
-s:静默模式。输入的内容不会回显在屏幕上。
#! /bin/bash
read -p "input IP : " IP
read -p "input GATEWAY : " GATE
cd /etc/sysconfig/network-scripts/
echo "TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=$IP
NETMASK=255.255.255.0
GATEWAY=$GATE
DNS1=218.104.128.106" > ifcfg-ens33
ifdown ens33
ifup ens33
ifconfig ens33

2.3 定时任务#

crontab --- 定时任务服务
systemctl status crond.service //查看定时任务的状态
yum -y install cronie
crontab -l //查看定时任务
vim /etc/crontab //编辑定时任务
24 14 * * * root /home/zyl/Desktop/dingshi.sh
分 小时 日 月 周 用户 脚本
crontab /etc/crontab //重新加载定时任务
cat /var/log/cron //查看定时任务的日志

3 案例2:存活主机探测#

3.1 特殊文件#

/dev/zero --- 空字节填充设备
/dev/null --- 黑洞文件(位桶)

3.2 if 判断语句#

if 条件
then 成立 语句
else 不成立 语句
fi
条件 代码
-gt(greater than) 大于
-lt(less than) 小于
-eq(equal) 等于
-ne(not equal) 不等于
-le(less than or equal) 小于等于
-ge(greater than or equal)大于等于
#! /bin/bash
if (( 10 > 100 ))
then
echo "yes"
else
echo "no"
fi
ping -c2 -i0.5 -w1 192.168.151.254
-c : 发包数
-i : 发包的间隔
-w : 等待的时间
#! /bin/bash
if `ping -c2 -i0.5 -w1 192.168.151.254 > /dev/null`
then
echo "yes"
else
echo "no"
fi

3.3 三种文本流#

0 --- 标准输入
1 --- 标准输出
2 --- 标准错误

3.4 循环语句#

3.4.1 for#

for 变量 in 取值列表
do
子语句
done
#! /bin/bash
for IP in {220..254}
do
if `ping -c2 -i0.5 -w1 192.168.151.$IP > /dev/null`
then
echo -e "192.168.151.$IP is \033[31myes\033[0m"
else
echo -e "192.168.151.$IP is \033[32mno\033[0m"
fi
done

3.4.2 while#

while 条件
do
子语句
done
#! /bin/bash
IP=0
while [ $IP -le 254 ]
do
let IP++
if `ping -c2 -i0.5 -w1 192.168.151.$IP > /dev/null`
then
echo -e "192.168.151.$IP is \033[31myes\033[0m"
else
echo -e "192.168.151.$IP is \033[32mno\033[0m"
fi
done

3.5 case选择语句#

case 变量 in
模式1)
子语句
;;
模式2)
子语句
;;
子语句
esac
#! /bin/bash
read -p "input i : " i
case $i in
1)
echo dza
;;
2)
echo wzr
;;
3)
echo djm
;;
*)
echo nobody
esac
#! /bin/bash
case $1 in
1)
echo dza
;;
2)
echo wzr
;;
3)
echo djm
;;
*)
echo nobody
esac
./case.sh 2 5
| | |
$0 $1 $2
Shell 脚本基础
https://wangyi187.top/posts/os-14-shell-script/
作者
WangYi
发布于
2024-07-27
许可协议
CC BY-NC-SA 4.0