实战自动化修改主机名
一、主程序
#!/bin/bash# 设置主机名为node01
set_hostname() {local new_hostname=$1echo "正在设置主机名为 $new_hostname ..."# 使用hostnamectl设置主机名hostnamectl set-hostname $new_hostname# 检查主机名是否更改成功if [ "$(hostname)" == "$new_hostname" ]; thenecho "主机名更改为 $new_hostname 成功."elseecho "主机名更改失败."exit 1fi
}echo "请输入新的主机名:"
read NEW_HOSTNAMEif [ -z "$NEW_HOSTNAME" ]; thenecho "未输入主机名,脚本退出。"exit 1
else# 调用函数来设置主机名set_hostname "$NEW_HOSTNAME"
fi
这个脚本的功能是允许用户通过终端输入一个新的主机名来更改系统的主机名。下面逐步解析这个脚本:
-
脚本开头的
#!/bin/bash
告诉系统此文件是一个Bash脚本,并指定了解释器的位置,即/bin/bash
。 -
脚本定义了一个名为
set_hostname
的函数。这个函数接受一个参数,即新的主机名。- 函数开始时,使用
echo
打印一条消息,告诉用户正在设置主机名。 - 接着,使用
hostnamectl set-hostname $new_hostname
命令实际设置主机名。 - 随后,脚本使用条件判断 [
if [ "$(hostname)" == "$new_hostname" ]; then
] 来检查主机名是否被成功设置。这里使用hostname
命令获取当前主机名,并与新主机名进行比较。 - 如果主机名设置成功,将打印成功消息。否则,打印失败消息,并且通过
exit 1
退出脚本,返回状态码 1,表示出错。
- 函数开始时,使用
-
脚本主体部分首先提示用户输入新的主机名,并使用
read
命令来获取用户输入的内容,保存到变量NEW_HOSTNAME
。 -
之后是一个条件判断 [
if [ -z "$NEW_HOSTNAME" ]; then
],检查用户是否输入了主机名。-z
判断字符串长度是否为零,如果是,说明用户没有输入任何内容。- 如果用户没有输入主机名,将打印错误消息,并通过
exit 1
退出脚本,返回状态码 1。 - 如果用户输入了主机名,脚本将调用
set_hostname
函数,并将用户输入的新主机名作为参数传递。
- 如果用户没有输入主机名,将打印错误消息,并通过
用户需要以 root
用户或使用 sudo
权限来执行此脚本,因为更改主机名是需要管理员权限的操作。
为了运行这个脚本,你可以将其保存在文件中,例如 change_hostname.sh
,并给予执行权限:
chmod +x change_hostname.sh
然后运行脚本:
sudo ./change_hostname.sh
脚本将提示用户输入新的主机名,并按照脚本设定的流程更改系统主机名。如果在更改过程中遇到任何错误,如无法设置新的主机名或用户未输入主机名,脚本将返回错误码 1
并退出。
二、 exit 1详解
命令exit 1
在Shell脚本中表示退出当前的Shell,并返回一个状态码。在Linux和UNIX系统中,状态码(也称为退出状态或退出码)是一个小的整数值,它用于返回给脚本的父进程,通常用于表示程序或脚本的执行结果。
在Shell脚本中,exit
语句后面可以跟一个数字,该数字就是退出状态码。状态码遵循某些惯例:
0
:表示成功完成。- 非零值:表示发生了错误或异常。
1
是一种常见的非零退出状态码,通常表示通用错误。它可以被看作是一个标准的错误代码,告诉调用该脚本的程序或用户,某些地方出了问题。
在您的脚本的上下文中,exit 1
被用在执行重要的任务失败时—例如在设置主机名失败时。如果脚本不能成功地设置主机名,使用exit 1
表示失败,并且这个状态码可以被其他程序或脚本使用来判断该脚本是否成功执行了其功能。
例如,如果这个脚本是从另一个脚本中调用的,父脚本可以检查退出状态来决定是否继续执行其他任务或是进行错误处理:
./set_hostname.sh
if [ $? -ne 0 ]; thenecho "设置主机名失败,执行错误处理..."# 这里可以添加错误处理的代码
fi
在上面的例子中,$?
是Shell中的一个特殊变量,用来存储上一个执行命令的退出状态码。如果set_hostname.sh
返回1
,表示出错,父脚本将执行错误处理的代码部分。
三、程序优化分析
在您提供的脚本中,使用 read
命令来要求用户输入新的主机名,并将其存储在变量 NEW_HOSTNAME
中。如果用户没有输入任何内容就按回车(即 NEW_HOSTNAME
变量为空),脚本将打印一条消息 "未输入主机名,脚本退出。" 并通过 exit 1
命令终止执行。
这里是您脚本的完整流程分析:
- 脚本开始执行。
set_hostname
函数定义了如何设置系统的主机名。- 脚本提示用户输入新的主机名并等待用户响应。
- 如果用户直接按回车(不输入任何内容),
read
命令将会结束,并且变量NEW_HOSTNAME
将为空。 - 脚本检查变量
NEW_HOSTNAME
是否为空。- 如果为空,脚本会输出错误消息并通过
exit 1
命令退出。 - 如果不为空,即用户输入了新的主机名,则调用
set_hostname
函数,该函数使用hostnamectl
命令来更新系统主机名,并验证更新是否成功。
- 如果为空,脚本会输出错误消息并通过
这是一个很好的处理用户输入的例子,确保当需要用户输入时,用户是按预期响应的,如果输入不正确或不存在,给予用户适当的反馈。
四、优化后程序
#!/bin/bash# 设置主机名为输入的新主机名
set_hostname() {local new_hostname=$1echo "正在设置主机名为 $new_hostname ..."# 使用hostnamectl设置主机名hostnamectl set-hostname $new_hostname# 检查主机名是否更改成功if [ "$(hostname)" == "$new_hostname" ]; thenecho "主机名更改为 $new_hostname 成功."elseecho "主机名更改失败."exit 1fi
}# 等待用户输入新的主机名
prompt_for_hostname() {read -p "请输入新的主机名:" NEW_HOSTNAME
}prompt_for_hostname# 判断用户是否输入了主机名
while [ -z "$NEW_HOSTNAME" ]; doecho "未输入主机名。"read -p "您可以再次输入或按回车键退出:" NEW_HOSTNAMEif [ -z "$NEW_HOSTNAME" ]; thenecho "脚本退出。"exit 0fi
done# 如果用户输入了主机名,则调用函数设置主机名
set_hostname "$NEW_HOSTNAME"
五、知识点拓展
在 Bash 脚本中,if
语句用于基于某个条件进行判断。这里的 if
语句用于检查变量 $NEW_HOSTNAME
是否为空。
下面是各个组成部分的详细解释:
-
if
: 是 Bash 中的条件语句关键字,后面跟一个方括号开始的条件表达式。 -
[ -z "$NEW_HOSTNAME" ]
: 这是判断条件。-z
选项是用来检查字符串长度是否为零。如果长度为零(即字符串为空),条件为真。"$NEW_HOSTNAME"
是脚本中定义的变量,它保存了用户的输入。双引号用来确保即使变量内容中包含空格也可以作为一个整体处理。 -
then
: 如果前面的条件为真(即$NEW_HOSTNAME
为空),那么then
后面的命令就会执行。 -
echo "脚本退出。"
: 这行命令会在控制台显示消息 "脚本退出。"。 -
exit 0
:exit
命令用于结束脚本的执行。后面跟着的数字0
通常表示脚本是成功或正常地退出。(按照 UNIX 约定,0
代表 "成功",非0
代表有错误发生) -
fi
: 这是if
语句的结束标志。
整个 if
块的作用,就是在用户没有提供新的主机名(即 $NEW_HOSTNAME
为空)时,打印退出消息,并且通过 exit 0
命令正常退出脚本。这样用户就知道脚本没有进行任何更改,并成功退出了。
相关文章:

实战自动化修改主机名
一、主程序 #!/bin/bash# 设置主机名为node01 set_hostname() {local new_hostname$1echo "正在设置主机名为 $new_hostname ..."# 使用hostnamectl设置主机名hostnamectl set-hostname $new_hostname# 检查主机名是否更改成功if [ "$(hostname)" "…...

无人机GB42590接收端 +接收端,同时支持2.4G与5.8G双频WIFI模组
严格按照GB42590的协议开发的发射端,通过串口和模块通讯,默认波特率 921600。 http://www.doit.am/首页-深圳四博智联科技有限公司-淘宝网https://shop144145132.taobao.com/?spma230r.7195193.1997079397.2.71f6771dJHT2r0 二、接口文档 单片机和模…...

PVE系统的安装
一.PVE系统的安装 前置准备环境:windows电脑已安装Oracle VM VirtualBox,电脑支持虚拟化,且已经开启,按住ctrl+shift+ESC打开任务管理器查看是否开启,如果被禁用,可进入BIOS开启虚拟化,重启电脑后再进行后续操作。本步骤选用windows10安装VirtualBox,版本为7.0.8。 …...

一辆汽车的节拍时间是怎样的?
节拍时间,又称 takt time,是德语中“节奏”的意思。在汽车制造业中,它指的是按照客户需求和生产计划,生产一辆汽车所需的时间。这个时间是固定的,它决定了生产线上每个工序的操作速度和节奏,是生产线上所有…...

数据结构-合并两个有效数组
题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,…...

华为2024年校招实习硬件-结构工程师机试题(四套)
华为2024年校招&实习硬件-结构工程师机试题(四套) (共四套)获取(WX: didadidadidida313,加我备注:CSDN 华为硬件结构题目,谢绝白嫖哈) 结构设计工程师,结…...

使用Pandas解决问题:对比两列数据取最大值的五种方法
目录 一、使用max方法 二、使用apply方法结合lambda函数 三、使用np.maximum函数 四、使用clip方法 五、使用where方法结合条件赋值 总结: 在数据处理和分析中,经常需要比较两个或多个列的值,并取其中的最大值。Pandas库作为Python…...

rk3588 安卓13 应用安装黑名单的接口
文章目录 概述一、app应用安装黑名单核心代码二、app应用安装黑名单核心功能分析三、代码实战1.先导入所需要的包2.添加获取黑名单方法3.添加限制黑名单方法4.上层使用PS:查看当前黑名单 总结 概述 在13.0系统rom定制化开发中,客户需求要实现应用安装黑名单功能&am…...

Grafana数据库为MySQL
一、Grafana是一款流行的开源监控和数据可视化平台,它默认使用SQLite作为数据库引擎。然而,对于大型项目或者需要更高性能的场景,我们通常会选择使用MySQL作为Grafana的数据库。在本文中,我将向你介绍如何将Grafana的数据库从SQLi…...

【计算机考研】数据结构都不会,没有思路,怎么办?
基础阶段,并不需要过于专门地练习算法。重点应该放在对各种数据结构原理的深入理解上,也可以说先学会做选择题、应用题。 因为在考试中,大部分的算法题目,尤其是大题,往往可以通过简单的暴力解决方案得到较高的分数。…...

word文档显示异常,mac安装word字体:仿宋gb2312
因为mac没有gb2312字体,windows上word里显示的gb2312字体与排版,在mac上显示为黑体、排版也错乱了,得不到想要打印格式。 需要安装gb2312字体 下载:仿宋GB2312.zip 解压后双击安装得到:仿宋GB2312.ttf 放入word&…...

【运维】Ubuntu 配置DNS服务器
背景 异常表现 部分域名无法解析,表现为 ping ***.com 提示 ping: ***.com: No address associated with hostname尝试解决方案 采用 sudo vim /etc/resolv.conf编辑的形式,指定DNS解析服务器 原始内容如下: nameserver 127.0.0.53 opti…...

头歌-机器学习实验 第8次实验 决策树
第1关:什么是决策树 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握决策树的相关基础知识。 引例 在炎热的夏天,没有什么比冰镇后的西瓜更能令人感到心旷神怡的了。现…...

Spring和Spring MVC和MyBatis面试题
面试题1:请简述Spring、Spring MVC和MyBatis在整合开发中的作用? 答案: Spring:是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。它提供了强大的依赖注入功能,…...

用vue3写一个AI聊天室
效果图如下: 1、页面布局: <template><div class"body" style"background-color: rgb(244, 245, 248); height: 730px"><div class"container"><div class"right"><div class"…...

photomaker:customizing realistic human photos via stacked id embedding
PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次,已列入Github官方Trending榜第一位,PaperswithCode热度榜第一位,HuggingFace Spaces趋势榜第一位。项…...

FFmpeg - 如何在Linux上安装支持CUDA的FFmpeg
FFmpeg - 如何在Linux(Ubuntu)上安装支持CUDA的FFmpeg 笔者认为现在的很多“xx教程”只讲干什么不讲为什么,这样即使报错了看官也不知道如何解决。 在安装过程的探索部分会记录我的整个安装过程以及报错和报错的解决办法。 在省流之一步到位的方法部分会省去安装过…...

新火种AI|商汤发布下棋机器人元萝卜,率先深入家庭场景。
作者:小岩 编辑:彩云 如今提及生成式AI(AIGC),已经不算什么新鲜产物了。自2014年GAN神经网络出现,2017年Transformer架构演进,再加上2023年ChatGPT的大火,无不说明生成式AI正在有条…...

CSS实现三栏自适应布局(两边固定,中间自适应)
绝对定位的元素会脱离文档流,它们是相对于包含块(通常是最近的具有相对定位、绝对定位或固定定位属性的父元素)进行定位的。当你把一个绝对定位的元素的高度设置为100%时,它会相对于其包含块的高度来确定自己的高度。如果包含块是…...

MoCo 算法阅读记录
论文地址:🐰 何凯明大神之作,通过无监督对比学习预训练Image Encoder的表征能力。后也被许多VLP算法作为ITC的底层算法来使用。 一方面由于源代码本身并不复杂,但是要求多GPU分布式训练,以及需要下载ImageNet这个大规模…...

华为OD机试 - 数组连续和 - 滑动窗口(Java 2024 C卷 100分)
华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…...

微店micro获得微店micro商品详情,API接口封装系列
微店商品详情API接口封装系列主要涉及注册账号、获取API密钥、选择API接口、发送请求以及处理响应等步骤。以下是详细的流程: 请求示例,API接口接入Anzexi58 一、注册账号并获取API密钥 首先,你需要在微店开放平台注册一个账号。注册成功后…...

C语言中的数据结构--链表的应用1(2)
前言 上一节我们学习了链表的概念以及链表的实现,那么本节我们就来了解一下链表具体有什么用,可以解决哪些实质性的问题,我们借用习题来加强对链表的理解,那么废话不多说,我们正式进入今天的学习 单链表相关经典算法O…...

.Net6 使用Autofac进行依赖注入
一、背景 刚接触.net 6,记录一下在.net6上是怎么使用Autofac进行动态的依赖注入的 二、注入方式 1、新建一个webapi项目,框架选择net 6 2、引用Nuget包---Autofac.Extensions.Dependency 3、在Program.cs上添加如下代码 //依赖注入 builder.Host.Us…...

第十二届蓝桥杯省赛真题(C/C++大学B组)
目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…...

DC40V降压恒压芯片H4120 40V转5V 3A 40V降压12V 车充降压恒压控制器
同步整流恒压芯片在现代电子设备中发挥着重要作用,为各种设备提供了稳定、高效的电源管理解决方案。 同步整流恒压芯片是一种电源管理芯片,它能够在不同电压输入条件下保持输出电压恒定。这种芯片广泛应用于各种电子设备中,如通讯设备、液晶…...

2、Qt UI控件 -- qucsdk项目使用
前言:上一篇文章讲了qucsdk的环境部署,可以在QDesigner和Qt Creator中看到qucsdk控件,这一篇来讲下在项目中使用qucsdk库中的控件。 一、准备材料 要想使用第三方库,需要三个先决条件, 1、控件的头文件 2、动/静态链…...

MATLAB算法实战应用案例精讲-【人工智能】AIGC概念三部曲(三)
目录 前言 算法原理 大模型 什么是AIGC? AIGC和Chat GPT的关系 常见的AIGC应用...

外汇110:外汇交易不同货币类别及交易注意事项!
外汇市场是一个庞大而复杂的市场,其中有各种各样的货币品种。对于外汇投资者来说,了解外汇品种的特性和走势是比较重要的。1. 货币种类 外汇市场中的货币品种可以分为主要货币、次要货币和外围货币。 主要货币:主要指美元、欧元、英镑、日元、…...

gerrit 拉取失败
在浏览器gerrit的设置界面设置的邮箱地址和在命令行使用git config --gloable user.email设置的邮箱地址必须保持一致吗 在浏览器gerrit的设置界面设置的邮箱地址和在命令行使用git config --global user.email设置的邮箱地址并不一定需要保持一致。这两个邮箱地址是独立的&am…...