免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。
目录
一、用shell写一个计算器
二、用Sheel定义一个求n的阶乘函数
拓展:
一、用shell写一个计算器
通过read命令获取用户输入的表达式,表达式的格式设定为操作数1 运算符 操作数2,例如5+3,然后利用涉及的脚本输出运算结果。
要求:实现加,减,乘,除运算
1. 脚本思路使用read命令获取用户输入的表达式。根据表达式中的运算符,使用case语句来执行相应的运算操作。对于除法运算,需要注意除数不能为0的情况。2. 代码实现
#!/bin/bashecho "请输入表达式(格式:操作数1 运算符 操作数2):"
read exproperand1=$(echo $expr | awk '{print $1}')
operator=$(echo $expr | awk '{print $2}')
operand2=$(echo $expr | awk '{print $3}')case $operator in"+")result=$(($operand1 + $operand2));;"-")result=$(($operand1 - $operand2));;"*")result=$(($operand1 * $operand2));;"/")if [ $operand2 -eq 0 ]; thenecho "除数不能为0"exit 1elseresult=$(echo "scale=2; $operand1 / $operand2" | bc)fi;;*)echo "不支持的运算符"exit 1;;
esacecho "结果:$result"3. 代码解释首先,通过echo提示用户输入表达式,然后使用read命令读取用户输入并存储在expr变量中。使用awk命令从表达式中分别提取出操作数1、运算符和操作数2,并分别存储在operand1、operator和operand2变量中。在case语句中,根据不同的运算符执行相应的运算:对于加法、减法和乘法,直接使用$((...))进行整数运算。对于除法,先判断除数是否为0,如果不为0,则使用bc命令进行浮点数运算(这里设置了scale=2,表示保留两位小数)。如果用户输入的运算符不被支持,则输出错误信息并退出脚本。最后,输出运算结果。
二、用Sheel定义一个求n的阶乘函数
定义一个计算n的阶乘的函数(含参函数、if判断、for循环)
写一个脚本去调用求阶乘的函数,并定义一个变量n,可用read交互输入,最终输出n的阶乘
#!/bin/bash # 定义计算阶乘的函数
factorial() { local n=$1 local result=1 if [ $n -eq 0 ] || [ $n -eq 1 ]; then result=1 else for ((i=2; i<=n; i++)); do result=$((result * i)) done fi echo $result
} # 脚本部分
echo "请输入一个整数n:"
read n # 调用阶乘函数并输出结果
echo "n的阶乘是: $(factorial $n)" 解释函数定义:factorial()函数接受一个参数n,用于计算n的阶乘。使用local关键字定义局部变量n和result,确保这些变量的作用域仅限于函数内部。if判断:如果n等于0或1,直接返回1,因为0和1的阶乘都是1。for循环:使用for循环从2到n进行迭代,计算乘积并存储在result变量中。交互输入:使用read命令从用户获取输入并存储在变量n中。函数调用:调用factorial函数,并将结果输出到终端。将上述代码保存为factorial.sh ,然后通过以下命令运行脚本:
chmod +x factorial.sh
./factorial.sh 运行后,脚本将提示用户输入一个整数,并计算并输出该整数的阶乘。
拓展:
写一个shell脚本去筛选etho网卡的ipv4地址,并赋值一个变量输出
(可以去了解grp,awk文本处理工具)
#!/bin/bash # 使用ip命令获取eth0网卡的IPv4地址
ipv4_address=$(ip addr show eth0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1') # 如果ipv4_address变量为空,则说明没有找到有效的IPv4地址
if [ -z "$ipv4_address" ]; then echo "未找到eth0网卡的IPv4地址"
else # 将IPv4地址赋值给变量并输出 echo "eth0网卡的IPv4地址是: $ipv4_address"
fi 解释ip addr show eth0:使用ip命令获取eth0网卡的网络接口信息。grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*':使用grep命令筛选出包含IPv4地址的行。-E选项表示使用扩展正则表达式,-o选项表示只输出匹配的部分。grep -Eo '([0-9]*\.){3}[0-9]*':再次使用grep命令从上一步的输出中提取出IPv4地址。grep -v '127.0.0.1':使用grep -v命令排除掉127.0.0.1(本地回环地址),确保只保留实际的外部IPv4地址。变量赋值和输出:将筛选出的IPv4地址赋值给变量ipv4_address。检查变量是否为空,如果为空则说明没有找到有效的IPv4地址,输出提示信息;否则输出IPv4地址。将上述代码保存为get_ipv4.sh ,然后通过以下命令运行脚本:
chmod +x get_ipv4.sh
./get_ipv4.sh 运行后,脚本将筛选出eth0网卡的IPv4地址,并将其赋值给变量并输出。
将上面的脚本编辑到计划任务中,并将echo输出内容重定向到一个固定的文件夹中,计划时间随意一天一次也可以。
(了解LINUX中的计划任务)
1. 创建一个计划任务
首先,编辑crontab文件以添加计划任务。使用以下命令打开crontab编辑器:crontab -e 在打开的编辑器中,添加以下行来每天运行一次脚本,并将输出重定向到指定的文件中。假设你的脚本名为get_ipv4.sh ,输出文件名为eth0_ipv4_address.log ,输出文件夹为/path/to/logs:0 0 * * * /path/to/get_ipv4.sh >> /path/to/logs/eth0_ipv4_address.log 2>&1 2. 确保脚本有执行权限
确保你的脚本有执行权限。使用以下命令为脚本添加执行权限:chmod +x /path/to/get_ipv4.sh 3. 创建日志文件夹(如果不存在)
确保日志文件夹存在。如果不存在,请创建它:mkdir -p /path/to/logs 4. 脚本内容
以下是完整的脚本内容,包括计划任务中的重定向操作:#!/bin/bash # 使用ip命令获取eth0网卡的IPv4地址
ipv4_address=$(ip addr show eth0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1') # 如果ipv4_address变量为空,则说明没有找到有效的IPv4地址
if [ -z "$ipv4_address" ]; then echo "未找到eth0网卡的IPv4地址"
else # 将IPv4地址赋值给变量并输出 echo "eth0网卡的IPv4地址是: $ipv4_address"
fi 5. 验证计划任务
你可以使用以下命令来查看已添加的计划任务,以确保其正确性:crontab -l 通过以上步骤,你已经成功将脚本添加到计划任务中,并配置其每天运行一次,同时将输出内容重定向到指定的日志文件中。确保你的脚本和日志文件路径正确,并验证计划任务是否已正确添加。
做一个像Windows中的一样无限重启脚本(了解LINUX中的自启动)
(注意:先拍个快照)
无限重启脚本
#!/bin/bash # 无限重启脚本
while true; do echo "系统将在10秒后重启..." sleep 10 reboot
done 解释#!/bin/bash:指定脚本使用Bash解释器运行。while true; do ... done:创建一个无限循环,while true表示循环将一直运行,直到被手动中断。echo "系统将在10秒后重启...":输出一条消息,通知用户系统将在10秒后重启。sleep 10:暂停脚本执行10秒,然后继续执行下一行。reboot:重启系统。使用方法保存脚本:将上述脚本保存为infinite_reboot.sh 。赋予执行权限:使用以下命令为脚本添加执行权限:chmod +x infinite_reboot.sh 运行脚本:运行脚本以开始无限重启系统:./infinite_reboot.sh 注意事项谨慎使用:无限重启系统可能会导致数据丢失或系统不稳定,请确保你了解风险并谨慎使用。手动中断:如果需要停止无限重启,可以手动中断脚本执行,例如使用Ctrl+C。系统保护:大多数现代操作系统具有防止系统无限重启的保护机制,因此这个脚本可能无法在所有系统上正常工作。