☰
openEuler Shell编程环境搭建:从安装到首个脚本验证
2026/10/15 4:45:12 网站建设 项目流程

很多人学Shell编程的第一步不是去装一个系统,而是随手打开终端敲一句echo "hello world"。我以前也这么干,结果后面越学越不对劲:在A机器上跑得好好的脚本,搬到B机器上就报错;同一个命令在不同发行版、不同版本里的表现完全不一样,有些是脚本直接挂掉,有些更坑——它静默给你一个错误结果,而你还以为成功了。后来我才想明白,学Shell这回事,第一个该搞定的不是语法,是你脚下的这台环境。

这个系列我打算从零开始,带着大家把Shell编程这条路走通,操作系统就选openEuler。本期是第01篇,核心任务很明确:把openEuler系统装上,装到一台你说了算的机器上,再把系统层面的基配置调顺手,最后用一个小脚本验证整条链路是通的。后续的变量、条件、循环、函数、文本处理、实战脚本,全都会在这套环境里继续展开。

这套内容适合三类人:完全没装过Linux系统的小白、想系统学Shell但总被环境问题劝退的人、以及准备在电脑上搭一个长期可用的实验环境来做开发验证的工程师。不管你是用虚拟机还是物理机,思路都是通用的。我会尽量把每个操作背后的理由讲清楚,让你不止是照着点按钮,而是知道为什么要点这个按钮。

1. 为什么Shell编程系列要先带你装系统

1.1 环境不稳定是Shell新手最大的隐性成本

我见过不少朋友学Shell的方式:今天在公司的某台老服务器上敲几行,明天在自己电脑的某种临时环境里练一练,后天又跑到别人的机器上试。语法倒是背了不少,但一遇到实际问题就抓瞎——因为分布式环境里的变量太多:默认Shell是bash还是别的、sed和awk版本是否兼容、软件包管理器是apt还是dnf、/bin/sh到底指向什么,这些都可能影响你的脚本行为。

把环境换成一台干净、可控、自己随时能重建的系统,最大的好处是减少变量。脚本出问题时,你只需要怀疑脚本自身,而不是一边查脚本一边怀疑系统哪里被改过。学习阶段的效率,很大程度上是由排障范围决定的。

1.2 openEuler为什么适合当教学载体

选openEuler作为本系列的教学系统,主要出于三个考虑。

第一,它是面向服务器场景的开源Linux发行版,定位和生产环境贴近。你在这上面练的Shell本事,换到其他同类企业级系统中几乎不用重学,命令体系、目录规范、服务管理方式都高度一致。

第二,它自带完整的软件仓库,常用开发工具、文本处理工具、编译工具链都能直接安装,不需要折腾复杂的第三方源。

第三,它有相对稳定的发布节奏和较长的支持周期。选一个长期支持版本,装完之后可以用很久,不用担心学一半系统进入停止维护状态,也不用频繁做大的版本升级。

1.3 整个系列的学习路线

这套系列我会按照"环境 → 基本功 → 进阶 → 实战"的结构推进。环境篇就是本期,把系统装好、网络通好、远端能连上。基本功篇会讲变量、引号、参数、数组、条件判断、循环、函数这些Shell核心语法。进阶篇会覆盖文本处理三件套、管道与重定向、进程与作业控制、正则这些真正在工作中高频使用的内容。最后做几个贴近真实场景的综合性脚本,把前面所有知识串起来。

为什么第一课是安装系统?因为后续每一步都要在一个真实系统上运行和验证。环境是你所有调试工作的锚点,锚点稳了,后面才谈得上脚本本身。

2. 动手前的规划:镜像、虚拟机与磁盘布局

2.1 镜像三件事:版本、架构、校验

动手安装前先把镜像准备好。版本上建议选带LTS标识的长期支持版本,这类版本经过较长周期的测试,基础软件包相对收敛,踩坑概率低。架构方面主要区分x86_64和aarch64两种,绝大多数人的电脑是x86_64,直接选对应项即可;如果你用的是ARM架构设备,就选aarch64版本。

从社区官网下载完ISO镜像之后,如果条件允许,建议做一次完整性校验。常见的校验方式是比对sha256校验和,这一步能避免下载文件损坏导致的安装中途报错。虽然现在网络条件普遍稳定,但镜像几个GB下来,偶尔出现损坏不是完全不可能,校验几秒钟就能解决问题。

2.2 用虚拟机还是物理机

我的明确建议是:学习阶段一律用虚拟机。原因不只是省一台机器,而是虚拟机给你提供了两个非常有用的能力:快照和随时销毁重建。

装完系统后先打一个干净快照,之后做任何实验都不会再担心把系统搞挂。脚本写坏了、权限改崩了、配置文件覆盖错了,一条命令退回到快照点就恢复如初。物理机没有这种成本,一旦折腾出问题,重装一轮至少半小时起步。

虚拟机配置也不用高,我建议按下面的标准:

配置项推荐值说明
CPU2核编译类实验足够,多了浪费
内存4GB最低2GB,但4GB更从容
磁盘40GB及以上太小的话后续装软件包容易吃紧
网络NAT模式可上网,又和宿主机隔离,实验安全
显示默认即可不需要图形桌面,命令行就够了

NAT模式是我特别想提醒的:很多新手为了图方便调成桥接模式,结果虚拟机直接暴露在局域网里,被局域网内其他设备扫到是小事,万一产生IP冲突,排查起来非常费劲。学习阶段用NAT,宿主机和虚拟机之间的通信没问题,同时外部环境访问不到你的虚拟机,安全上也更稳。

2.3 分区规划的两种方案

安装过程中会遇到分区选择。新手阶段,很多人图省事直接选自动分区,说实话也不是不行,但我更建议手动分区,原因后面会在踩坑章节详细说,这里先给结论。

如果你打算长期用它做实验,我推荐这套规划方案:

挂载点大小文件系统备注
/boot1GBext4给内核和引导文件留足空间
/30GBext4系统根目录,软件默认装这里
swap4GBswap内存不够时的溢出空间
/home剩余全部ext4普通用户数据,留够余量

如果条件允许,建议把/和/home都放在LVM逻辑卷里。LVM的好处是后期空间不够时可以动态扩容,不需要重新分区。你不需要现在深入理解LVM的原理,先知道"它让分区大小变得灵活可调"就够了,后续用到时我再展开讲。

3. 安装全程拆解:从引导界面到第一次登录

3.1 新建虚拟机并挂载ISO

打开你的虚拟机软件,新建虚拟机,操作系统类型选择Linux对应的64位选项,分配前面表格里建议的内核数、内存和磁盘容量。在"安装镜像"这一步,把刚下载的openEuler ISO文件挂载上去,开机时让它从光盘引导。

这里有个容易忽略的点:虚拟机固件类型建议选UEFI,而不是传统BIOS。现在主流发行版对UEFI支持已经非常成熟,openEuler也不例外。选UEFI对后续系统引导的稳定性有好处,而且与当前新硬件的兼容性更好。

3.2 安装引导的早期选项

虚拟机从ISO启动后,会进入一个引导菜单,主要选项是"安装"或者"测试并安装"之类。直接选择安装即可。这里不需要做任何额外操作,系统会自动加载安装程序。

随后会进入语言选择界面。我的建议是:学习阶段选择英文,或者至少把系统语言保持为英文。原因很现实——你在命令行里看到的大量输出、日志、帮助信息,默认都是英文,网上查到的教程和排障案例也普遍基于英文环境。如果系统界面是中文但程序输出是英文,反而会造成信息割裂,有些不成熟的程序在特定语言环境下还会出现渲染问题。

3.3 磁盘分区这一步该怎么点

进入安装摘要页后,第一件事是点开"安装目标"或类似选项。这里你会看到之前分好的虚拟磁盘,选中它,然后选择"自定义分区"。接下来按照上一节给的表格逐项建立分区。

在文件系统类型上,/boot用ext4即可,/用ext4,swap就直接选swap类型,/home同样用ext4。所有挂载点看好再确认,避免把根目录和家目录写反。写完分区方案后,安装器会显示"将要在该设备上执行分区操作"之类的确认提示,检查一遍再点击确认。

一个新手很容易犹豫的地方是swap到底要不要。现在的机器内存普遍不小,有些安装教程会建议直接不要swap。我的建议是学习环境保留一个4GB的swap,理由是给系统留一点缓冲。实验过程中如果某个进程异常占用内存,swap可以兜底,不至于让系统立刻卡死。

3.4 软件包选择、root密码与用户创建

回到安装摘要页,找到"软件选择"或"软件包"选项。这里的原则只有一个:不要选带图形桌面那一档。Shell学习根本用不到图形界面,图形桌面会额外占用大量内存和磁盘空间,还会带来不必要的系统服务。选择最小化或只带基础工具的服务器类型即可。

设置root密码时有一个学习方法上的建议:学习环境的密码可以设得简单一些,方便自己频繁登录测试。但在真实服务器上,root密码复杂度必须足够高,这条习惯不能带到生产环境。同时建议不要创建太多普通用户,Shell学习阶段大多数操作直接用root完成即可,省去权限切换的干扰。如果你愿意,创建一个普通用户用来做日常登录测试也行,但别在权限这块花太多时间纠结。

3.5 重启后的登录检查

安装完成之后,安装器会提示重启。注意在重启前把ISO镜像从虚拟光驱中卸载,或者将引导顺序调回硬盘优先,否则会再次进入安装引导。

重启后系统会进入命令行登录界面。输入root账号和刚才设置的密码,看到[root@localhost ~]#这样的提示符,就说明系统已经装好。到这里,安装阶段就算正式完成。接下来才是真正影响你后续使用体验的部分——基础环境配置。

4. 装完系统先别急着写脚本,把基础环境收拾利索

4.1 网络不通,后续寸步难行

装完系统后第一件事不是写脚本,而是确认网络可用。Shell学习中大量操作都依赖网络:安装软件包、下载依赖、更新系统,都会因为网络问题卡住。很多新人装完系统后发现dnf install报错,第一反应是软件源有问题,其实多数情况下是网络压根没配好。

先看当前网络状态:

ip addr

输出里能找到网卡名称和它当前的IP地址。如果网卡有类似192.168.x.x的地址,说明DHCP已经分配成功。如果只有inet6地址没有inet4地址,或者网卡状态是DOWN,就需要手动配置。

手动配置我推荐用nmcli工具,而不是直接改网络配置文件。NetworkManager是现代Linux系统的网络管理组件,通过它配置更规范,也避免配置文件写错导致的麻烦:

nmcli connection show

先看连接名字是什么。假设叫System eth0,你把它改成自己的实际网络参数:

nmcli connection modify "System eth0" ipv4.method manual \ ipv4.addresses 192.168.10.100/24 \ ipv4.gateway 192.168.10.1 \ ipv4.dns 114.114.114.114 nmcli connection up "System eth0"

配好之后,用ping验证连通性。先ping网关,网关通了说明局域网络没问题;再ping一个公网地址,通了说明外网正常。这里我建议优先用IP来测试,因为IP通了而域名不通,说明是DNS解析问题,这是非常常见的排查分界线。等到能正常访问软件仓库并更新系统之后,这台机器的网络才算真正可用。

4.2 软件仓库与系统更新

网络通了之后,第一时间检查软件仓库状态:

dnf repolist --all

openEuler安装完会自带配置好的软件仓库,正常情况下这个命令可以列出多个可用仓库。如果结果为空,说明仓库配置有问题,需要检查仓库文件或者考虑更换一个网络可达的镜像源。镜像源的选择逻辑很简单:选离你网络路径近、速度稳定的即可。

确认仓库之后,执行一次系统更新:

dnf update

这里我想多说一句:很多教程让你装完系统立刻更新,表面看是例行公事,实际上这步的价值在于让系统补齐安全修补和关键软件包修正。学习环境也一样,更新之后可以避免不少由于旧包导致的奇怪问题。更新完成后,后续安装开发工具软件包就会非常顺畅。

4.3 SSH远程登录顺手搞定

虚拟机本身就在你电脑上,是不是还需要配置SSH?我的回答是:需要,而且值得养成习惯。因为后续几期的Shell学习中,我会大量用到"远程到服务器上操作"的场景;更关键的是,SSH操作模式和你在图形化终端里直接敲键盘的体验是不同的,你需要尽早适应这种工作流。

openEuler默认安装了OpenSSH服务端。依次执行:

systemctl status sshd systemctl enable --now sshd

第一条命令看服务当前状态,第二条命令把它设置为开机自启并立即启动。然后在你自己的电脑上打开终端,执行:

ssh root@192.168.10.100

输入密码,能进入这台openEuler的命令行,SSH就配置成功了。这里有个小提醒:如果你刚才把IP配成192.168.10.100,记得按自己的实际IP来。成功登录后你会看到和本地终端几乎一样的界面,这背后其实是同一个命令行环境——你远程操作的就是刚才那台机器。

4.4 防火墙和SELinux的先放一放还是先调好?

openEuler默认启用了防火墙服务和SELinux安全模块。对于生产环境,这两样都必须保留;但在学习环境,它们很可能是你前几个月的头号"敌人"。

先说防火墙。如果你在SSH连接时提示连接超时或被拒绝,而sshd服务本身运行正常,那多半就是防火墙拦截了22端口。两种处理方式:

# 方式一:放行SSH服务(推荐,保留防火墙保护) firewall-cmd --permanent --add-service=ssh firewall-cmd --reload # 方式二:直接关闭防火墙(学习环境图省事) systemctl disable --now firewalld

我个人建议用方式一。防火墙留着不影响你,而且能锻炼"服务有问题先查防火墙"的排障意识。

至于SELinux,先用getenforce查看状态。如果脚本操作某些文件时报各种权限错误、普通命令执行失败,可以考虑临时把它调成宽松模式:

setenforce 0

想持久生效,修改/etc/selinux/config,把SELINUX=一行改为permissive,然后重启。这里必须说清楚:这只是学习阶段为降低入门门槛做的妥协,真实服务器上我建议始终保留SELinux的强制模式,这对系统安全有实质性保护意义。

5. 验证Shell环境:跑通第一个脚本

5.1 先确认你用的就是bash

很多教程默认Shell就是bash,实际上不一定。在某些系统里,默认Shell可能是别的实现,而/bin/sh在不同的发行版中也可能指向不同的程序——这正是我在开头说的"环境差异"最典型例子。

所以在写第一个脚本之前,先确认环境:

echo $SHELL which bash bash --version

$SHELL是你登录时默认使用的Shell完整路径,通常是/bin/bash。接着确认bash版本号,说明系统里已经有bash解释器。最后可以看一眼file /bin/sh,看看系统的sh指向哪里。在openEuler上,通常它会指向bash;而在有的发行版上,/bin/sh指向的可能是dash这种更精简的Shell。这种差异会直接影响你脚本里某些写法在不同机器上是否能运行。

5.2 第一个脚本的三行代码

环境确认完毕后,创建一个实验目录,然后把第一个脚本写进去:

mkdir -p ~/shell-lab cd ~/shell-lab cat > hello.sh << 'EOF' #!/bin/bash echo "Hello, OpenEuler Shell!" echo "当前登录用户: $(whoami)" echo "当前时间: $(date '+%Y-%m-%d %H:%M:%S')" EOF

脚本第一行#!/bin/bash叫shebang,它的作用是告诉系统"这个脚本应该用哪个解释器来执行"。即使你的计算机上还有其他Shell,shebang也能确保脚本执行时用的是bash。第二行用echo输出一句问候,第三行通过$(whoami)把当前用户的输出拼接到文本里,第四行同理输出当前时间。

这里$()是Shell的命令替换语法,它会把括号内命令的结果当作值,嵌入到外面的字符串里。这是Shell里最常用、也最实用的能力之一,后续几乎每个脚本都会用到。

5.3 三种运行方式背后的区别

写完之后,有几种执行脚本的方式,它们的差异很多人一开始搞不清楚。

第一种是给脚本加执行权限再运行:

chmod +x hello.sh ./hello.sh

./表示"当前目录下"的hello.sh。你可能听说过,直接输入hello.sh会提示找不到命令,原因是当前目录通常不在PATH环境变量中,系统不会主动去当前目录寻找可执行文件,所以要显式用./指明路径。这种方式依赖shebang行来确认解释器。

第二种是直接交给bash运行:

bash hello.sh

这种方式不需要执行权限,也不依赖shebang,你明确指出用bash解释执行这个脚本。脚本的shebang行会被忽略。这种方式很适合在你不确定脚本是否有执行权限时快速验证。

第三种是source方式:

source hello.sh

或者它的简写形式. hello.sh。和前两种方式最大的区别在于:前两种是"开启一个子进程执行脚本",脚本里设置的变量在脚本结束后就消失了,不影响当前Shell;而source是在当前Shell进程里直接执行脚本内容,脚本里定义的变量和函数在脚本结束后依然存在。这个特性会在后续讲配置文件加载的时候反复用到。

5.4 给脚本加点变量和系统信息

第一个脚本跑通之后,顺手加深一点,把变量用上:

cat > sys_info.sh << 'EOF' #!/bin/bash user=$(whoami) host=$(hostname) os=$(cat /etc/openEuler-release 2>/dev/null || cat /etc/os-release | head -n 1) echo "用户: $user" echo "主机名: $host" echo "系统: $os" echo "当前目录: $PWD" EOF chmod +x sys_info.sh ./sys_info.sh

这个脚本里,$(...)的结果被赋给变量,后面的$user、$host则把变量值展开输出来。$PWD是Shell内置的环境变量,保存着当前工作目录。如果你的系统里没有/etc/openEuler-release这个文件,第二行的||逻辑会让脚本尝试读取/etc/os-release的第一行,这是非常实用的兼容写法,也是做脚本时会经常遇到的"不同系统文件路径不一致"问题的典型处理思路。

执行成功后,你应该能看到用户、主机名、系统版本、当前目录这四行信息。这意味着你的openEuler系统已经能够运行多行脚本、处理变量、调用系统命令,基础环境验证通过。

6. 新手装系统阶段最容易翻车的几个地方

6.1 把/boot预算留足,别学我抠那1GB

我第一次装Linux时,为了"节省空间",给/boot只分了200MB,当时觉得引导文件加起来不过几十MB,绰绰有余。结果系统更新到第三个内核版本时就提示磁盘空间不足,新内核装不上,旧内核又因为各种原因没清理,陷入非常尴尬的局面。

/boot分区建议给1GB。理由很简单:内核版本会不断增加,加上引导加载器文件、系统错误的恢复镜像等,空间需求比你想象的大。1GB看起来占比很小,但它能让你在未来很长一段时间里不用为内核更新纠结。

6.2 分完区之后,根目录空间不够用

自动分区另一个常见问题是:安装器默认给/home分很大一块,/只留了几十GB。你平时在/home下存个人文件没问题,但Shell学习中大量软件包默认都安装在/里,如果根目录空间不足,dnf install时就会看到磁盘满的报错,而且这种问题往往在你最需要安装某个工具时突然跳出来。

手动分区时我习惯把/给足,/home反而不用太大。学习阶段本来就不会在/home里存什么大文件,真正的用户数据等以后需要了再扩也不迟。如果当初选了LVM,后面扩/也只是一个命令的事情。

6.3 软件包选多了,内存白送

安装时的"软件选择"界面,很多人看到有图形桌面选项就想选上,觉得"有备无患"。实际上图形桌面会带来一大堆图形相关的服务、库文件和守护进程,内存占用轻松多出一两个GB。对Shell学习完全没有帮助,反而让系统变重、启动变慢、出错面变大。

我就见过有人装完系统,发现虚拟机里的内存用掉大半,一查是一个不需要的图形相关服务在运行。搞Shell编程,不需要图形界面,这个观念要早点立起来。能命令行解决的问题,就坚决不装图形。

6.4 装完先做快照再开始折腾

这是我想对所有新手强调的一个操作习惯:系统装好、基础环境配好之后,立刻在虚拟机软件里打一个快照,这叫"干净基线快照"。

快照的意义在于,你以后学习时做的所有尝试,无论脚本里写了什么歪门邪道的命令,不管系统被搞到什么状态,只要一还原快照,就能回到你刚装好系统时那个干净、可用的状态。没有快照的人,每次系统崩了只能重装,重装一次几十个步骤,心态很容易崩。有快照的人,恢复只需点一下鼠标,学习的心理负担会小很多。

6.5 网络配置改了不生效的通用排查顺序

装完系统配网络时,最打击人的场景是:把IP地址、网关、DNS都填好了,但就是上不了网。我建议你养成按顺序排查的习惯,不要乱试。

顺序是这样的:先看网卡状态和IP是否已经配置到位,用ip addr检查;再看回环接口是否正常,用ping 127.0.0.1;接着ping网关,确认局域网链路;然后ping一个公网IP,确认外网路由;如果公网IP通而域名不通,问题基本锁定在DNS上,检查resolv配置或者nmcli里的DNS设置;最后检查防火墙是否拦截了出口流量。

每一步之间不要跳。很多人一上来就怀疑DNS,结果查半天发现是网卡根本没起来。按这个链路走,通常五分钟内能定位问题。

把系统装好、网络调通、SSH连上、基础脚本跑起来,你的openEuler这台"实验台"就算正式开张了。这一篇里我特意在安装阶段放了不少环境配置和安全策略的说明,是因为这些细节虽然不能让你立刻写出漂亮的脚本,但它们是后面所有实战内容的底盘。底盘不稳,上面盖什么都晃。

我个人在多次重建环境之后的最大体会是:安装系统这件事,操作本身不难,难的是每一步都知道自己在做什么、为什么这么做。你可以不记住每个菜单的准确名称,但最好能理解分区的目的、网络的工作方式、安全模块存在的原因。带着这些认知去进入下一期的Shell语法学习,你会比那种只会照着教程敲命令的人走得远得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询