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/bashcd /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 ens332.1 shell变量
变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:1.命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。2.中间不能有空格,可以使用下划线“_”。3.不能使用标点符号。4.不能使用bash里的关键字(可用help命令查看保留关键字)。2.2 read交互
read简介要与Linux交互,脚本获取键盘输入的结果是必不可少的。选项:-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。换行符或回车算一个字符。其中-p:给出提示符。默认不支持"\n"换行,要换行需要特殊处理,见下文示例。例如,"-p 请输入密码:"-r:禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。-s:静默模式。输入的内容不会回显在屏幕上。#! /bin/bashread -p "input IP : " IPread -p "input GATEWAY : " GATEcd /etc/sysconfig/network-scripts/echo "TYPE=EthernetBOOTPROTO=staticDEFROUTE=yesNAME=ens33DEVICE=ens33ONBOOT=yesIPADDR=$IPNETMASK=255.255.255.0GATEWAY=$GATEDNS1=218.104.128.106" > ifcfg-ens33
ifdown ens33ifup ens33
ifconfig ens332.3 定时任务
crontab --- 定时任务服务systemctl status crond.service //查看定时任务的状态
yum -y install croniecrontab -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/bashif (( 10 > 100 ))then echo "yes"else echo "no"fiping -c2 -i0.5 -w1 192.168.151.254-c : 发包数-i : 发包的间隔-w : 等待的时间#! /bin/bashif `ping -c2 -i0.5 -w1 192.168.151.254 > /dev/null`then echo "yes"else echo "no"fi3.3 三种文本流
0 --- 标准输入1 --- 标准输出2 --- 标准错误3.4 循环语句
3.4.1 for
for 变量 in 取值列表do子语句done#! /bin/bashfor 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" fidone3.4.2 while
while 条件do子语句done#! /bin/bashIP=0while [ $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" fidone3.5 case选择语句
case 变量 in模式1)子语句;;模式2)子语句;;子语句esac#! /bin/bashread -p "input i : " icase $i in1)echo dza;;2)echo wzr;;3)echo djm;;*)echo nobodyesac#! /bin/bashcase $1 in1)echo dza;;2)echo wzr;;3)echo djm;;*)echo nobodyesac
./case.sh 2 5 | | | $0 $1 $2
闽公网安备 35050402880173号