作业一 写计算器
使用bc命令
需要进行安装bc
代码如下:
#!/bin/bash
echo "-----------------------------------"
echo "输入 f 退出"
echo "可计算小数和整数"
echo "用法如:1.1+2.2"
echo "-----------------------------------"
while true; doread -p "请输入需要计算的表达式: " expressionif [ "$expression" == "f" ]; thenbreakfiresult=$(echo "$expression" | bc)echo "您输入的值是: $result"
done
使用(())
#!/bin/bash
echo "---------------------------------"
echo "输入 f 退出"
echo "运算符前后请以空格隔开"
echo "用法如:1 + 2"
echo "---------------------------------"
while true
doread -p "请输入需要计算的表达式: " expressionif [ "$expression" == "f" ]; thenbreakfiresult=$(($expression))echo "您输入的值是: $result"done
或者这里还可以使用case
对接收的运算符进行判断,然后在每个分支进行对应的操作即可
作业二 阶乘
#/bin/bash
echo "-------------------------------"
echo "输入 f 退出"
echo "计算阶乘"
echo "-------------------------------"summerize(){result=$(($1 * result))
}
while true
doread -p "请输入一个数字: " numif [ "$num" == "f" ];thenbreakfiif [ "$num" == "0" ];thenecho "阶乘为0"breakfiresult=1for ((;num>0;num--))dosummerize numdoneecho "阶乘为: $result"
done
扩展一 获取eth0网卡IP
使用grep
#!/bin/bashfor i in $(seq 0 10)
doresult=$(ip addr show eth$i 2>/dev/null | grep -Eo "inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}"|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}")if [ -n "$result" ];thenecho "eth$i的IP是:$result"fi
done
ip addr show eth0表示只显示网卡eth0的信息
grep中的用法很多
-A 2 "eth0"
表示显示包括eth0所在行的后面2行-E
使用正则表达式-o
表示只显示匹配到的
正则表达式中很多
-
^a
表示以a开头的 -
.*
贪婪匹配,就是匹配任何东西 -
q$
表示以q结尾grep -Eo "^a.*q$"
表示只显示以a开头,以q结尾的字段 -
[1-9]
表示数字1-9的任意一个 -
{1,3}
表示匹配范围,长度[1-9]{1,3}
表示匹配1-9中的任意一个数字,数字范围在1-3
使用awk
#!/bin/bash
for i in $(seq 0 10)
doresult=$(ip addr show eth$i 2>/dev/null | awk '$1 == "inet" && $2 !~ /:/ {print $2}')if [ -n "$result" ];thenecho "eth$i的IP是:$result"fi
done
/inet /
这是匹配模式,当字段中有inet加空格时,定位到这里{print $2}
表示定位到inet这一行地方时,输出第二个字符,空格隔开为字符终止- 所以这里的$1是inet,$2是inet后面的一段字符
$1 == "inet"
这个条件用于匹配输出中每行的第一个字段等于inet的情况!~
不匹配$2!~ /:/
这里是判断每行的第二个字段(也就是我们实际要获取的 IPv4 地址部分)不匹配包含:的正则表达式,以此来排除 IPv6 地址。-F'/'
表示分割,这里是以/进行分割字符,如果有的话。
若是多分割,可以采用数组形式-F'[,/]'
扩展二 设置定时任务
使用crontab
crontab -e
进入定时任务的编写
在其中的下面已经给出提示,时间顺序是分钟(m) 、小时(h)、天(dom)、月(m)、星期(dow)、命令(command)
crontab -l
查看当前定时任务
这里是把网卡ethn
系列的IP信息输出到文本中
使用at
at
命令一般可能没安装,需要先进行安装
at
命令比较灵活,可以使用now + 2 minutes -f [脚本]
表示现在开始两分钟后执行脚本,还可以设置
at 12:00 tommory
表示明天12点执行
at 8am+3 days
表示三天后的早上8点执行
等等
还可以与EOF
联合使用,EOF
算是标识符,可以使得命令不止一行,甚至可以在里面执行多条命令,开头EOF
,结尾EOF
中间就是前面命令执行的,所以好用,推荐
扩展三 无限重启
首先了解重启的命令,在linux
系统中,两个命令可以重启计算机
reboot
init 6
知道重启命令后,就可以直接在一个脚本中编写,使得重启
其次,需要知道自启动目录在哪,或者文件在哪
可以试想一下,平常在启动某项服务的时候,使用的systemctl
命令,以及这个命令可以实现服务的开机启动。不过就是需要高权限才能使用该命令。
那么该命令是通过哪些文件来让这些服务启动的呢
/etc/systemd/system/
目录,这个目录是系统服务单元文件的存放位置。所以可以在这个文件中编写。
可以查看这个目录下的文件
基本上是以.service
为结尾,这是一种服务,查看文件
以下面简单的框架描述
[Unit]
Description=IP Script Service
After=network.target[Service]
ExecStart=/bin/bash /home/kali/test/ip.sh
Type=oneshot[Install]
WantedBy=multi - user.target
[Unit]
部分
Description
:这是对服务的一个简单描述,用于在查看服务信息时能够识别服务的用途。After
:指定在哪个系统目标(target
)之后启动这个服务。在这里,network.target
表示在网络相关的服务启动之后再启动这个服务,因为你的脚本可能依赖于网络连接(例如获取 IP 地址相关的操作)。
[Service]
部分
ExecStart
:定义了服务启动时要执行的命令,这里是执行/bin/bash /home/kali/test/ip.sh
脚本。Type
:oneshot
表示这个服务只执行一次,执行完后就结束。这适用于像脚本这种只需要运行一次的情况,而不是像守护进程那样一直运行。
[Install]
部分
WantedBy
:指定这个服务应该被哪个系统目标所依赖。multi - user.target
是一个常见的目标,它表示在多用户模式下启动这个服务。
在/etc/systemd/system
目录下创建一个re.service
文件,并编写内容
[Unit]
Description=reboot[Service]
ExecStart=/bin/bash /home/kali/test/re.sh
Type=oneshot[Install]
WantedBy=multi-user.target
然后使用systemctl enable [服务名]
来使得服务开机自启动
这时候输入systemctl start re.service
会直接进行重启
这时候计算机到这个界面就会重启,根本到不了登录界面