Bash脚本错误修复与参数处理
table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
143、考虑以下脚本。注意它使用 elif 来检查第二个条件:#!/bin/bash fruit1 = Apples fruit2 = Oranges if [ $1 -lt $# ] then echo “This is like comparing $fruit1 and $fruit2!” elif [$1 -gt $2 ] then echo ‘$fruit1 win!’ else echo “Fruit2 win!” done 该脚本存在错误,请修复这些错误。
以下是修正后的脚本:
#!/bin/bash
fruit1=Apples
fruit2=Oranges
if [ $1 -lt $# ]; then
echo "This is like comparing $fruit1 and $fruit2!"
elif [ $1 -gt $2 ]; then
echo "$fruit1 win!"
else
echo "$fruit2 win!"
fi
主要修改点:
变量赋值时去掉等号两边的空格;
在条件判断语句中,方括号内前后要加空格;
修正引号问题,使用双引号让变量正常替换;
将结尾的
done
改为
fi
,因为在 bash 脚本中,if 语句要用
fi
结尾。
144、执行命令 $ ./guided1.sh 3 0 、$ ./guided1.sh 2 4 和 $ ./guided1.sh 0 1 时,脚本 guided1.sh 的输出分别是什么?
$ ./guided1.sh 3 0
的输出为
Apples win!
$ ./guided1.sh 2 4
的输出为
Oranges win!
$ ./guided1.sh 0 1
的输出为
This is like comparing Apples and Oranges!
145、编写一个简单的脚本,检查是否恰好传入了两个参数。如果是,则以相反的顺序打印这些参数。参考以下示例(注意:你的代码可能与此不同,但输出结果应相同):if [ $1 == $number ] then echo “True!” fi
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Error"
else
echo "$2 $1"
fi
146、在代码中,使用 == 进行比较和使用 -eq 进行比较有何不同?
使用
==
会进行字符串比较,即如果两个变量的字符完全匹配,条件为真;而
-eq
用于数值比较,用于判断两个数值是否相等。
字符串比较在测试数字时可能会导致意外结果。例如:
1+1 == 2
结果为
false
,因为是字符串比较;
若用数值比较则会按正确的数学逻辑判断。
147、编写一个简单的脚本,检查是否恰好传入了两个参数。如果是,则以相反的顺序打印这些参数。
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Error"
else
echo "$2 $1"
fi
148、用户在 shell 中输入以下内容:$ PATH=~/scripts $ ls 命令 ‘ls’ 位于 ‘/bin/ls’ ,但由于 ‘/bin’ 不在 PATH 环境变量中,该命令无法找到,显示 ‘ls: command not found’ 。用户做了什么?
问题描述
用户用目录
~/scripts
覆盖了
PATH
的内容,导致无法找到
ls
命令,因为它不在
PATH
中。
影响范围
此更改仅影响当前会话。
恢复方法
注销并重新登录即可恢复
PATH
的原始设置。
149、用户在 shell 中输入:$ PATH=~/scripts $ ls ,命令 ‘ls’ 位于 ‘/bin/ls’,但由于 ‘/bin’ 不在 PATH 环境变量中,无法找到该命令,显示 ‘ls: command not found’。什么命令可以将 PATH 的当前值与新目录 ~/scripts 合并?
PATH=$PATH:~/scripts
150、考虑以下脚本。注意它使用 elif 来检查第二个条件:#!/bin/bash fruit1 = Apples fruit2 = Oranges if [ $1 -lt $# ] then echo “This is like comparing $fruit1 and $fruit2!” elif [$1 -gt $2 ] then echo ‘$fruit1 win!’ else echo “Fruit2 win!” done。该脚本存在错误,请修正这些错误。
以下是修正后的脚本:
#!/bin/bash
fruit1=Apples
fruit2=Oranges
if [ $1 -lt $# ]; then
echo "This is like comparing $fruit1 and $fruit2!"
elif [ $1 -gt $2 ]; then
echo "$fruit1 win!"
else
echo "$fruit2 win!"
fi
错误修正说明:
变量赋值时等号两边不能有空格,如
fruit1=Apples
而不是
fruit1 = Apples
;
elif
语句中
[
后面和
]
前面需要有空格,即
[ $1 -gt $2 ]
;
输出变量时要用双引号包裹变量,如
echo "$fruit1 win!"
;
脚本结束要用
fi
而不是
done
。
151、编写一个接受一个参数的简短脚本。
#!/bin/bash
# A simple script to greet a single user.
if [ $# -eq 1 ]; then
username=$1
echo "Hello $username!"
else
echo "Please enter only one argument."
fi
echo "Number of arguments: $#."
152、阅读以下 script1.sh 的内容:#!/bin/bash
if [ $# -lt 1 ]
then
echo “This script requires at least 1 argument.”
exit 1
fi
echo $1 | grep “^[A-Z]*$” > /dev/null
if [ $? -ne 0 ]
then
echo “no cake for you!”
exit 2
fi
echo “here’s your cake!”
exit 0
以下命令的输出是什么?
◦./script1.sh
◦echo $?
◦./script1.sh cake
◦echo $?
◦./script1.sh CAKE
◦echo $?
– 命令
./script1.sh
的输出:This script requires at least 1 argument.
– 命令
echo $?
的输出:1
– 命令
./script1.sh cake
的输出:no cake for you!
– 命令
echo $?
的输出:2
– 命令
./script1.sh CAKE
的输出:here’s your cake!
– 命令
echo $?
的输出:0
153、读取文件 script2.sh 的内容:for filename in $1/*.txt; do cp $filename $filename.bak; done 请描述你所理解的此脚本的用途。
该脚本会为第一个参数所指定的子目录中所有以 .txt 结尾的文件创建备份副本。
154、创建一个脚本,该脚本可以接受用户输入的任意数量的参数,并仅打印出那些大于 10 的数字参数。
#!/bin/bash
for i in $@
do
echo $i | grep "^[0-9]*$" > /dev/null
if [ $? -eq 0 ]
then
if [ $i -gt 10 ]
then
echo -n "$i "
fi
fi
done
echo ""
155、阅读以下 script1.sh 的内容:#!/bin/bash if [ $# -lt 1 ] then echo “This script requires at least 1 argument.” exit 1 fi echo $1 | grep “^[A-Z]*$” > /dev/null if [ $? -ne 0 ] then echo “no cake for you!” exit 2 fi echo “here’s your cake!” exit 0 请问执行以下命令分别会有什么输出:./script1.sh;echo $?;./script1.sh cake;echo $?;./script1.sh CAKE;echo $?
命令:`./script1.sh`,输出:`This script requires at least 1 argument.`
命令:`echo $?`,输出:`1`
命令:`./script1.sh cake`,输出:`no cake for you!`
命令:`echo $?`,输出:`2`
命令:`./script1.sh CAKE`,输出:`here's your cake!`
命令:`echo $?`,输出:`0`
156、创建一个脚本,它可以接受用户输入的任意数量的参数,并仅打印出那些大于 10 的数字参数。
#!/bin/bash
for i in $@
do
echo $i | grep "^[0-9]*$" > /dev/null
if [ $? -eq 0 ]
then
if [ $i -gt 10 ]
then
echo -n "$i "
fi
fi
done
echo ""
157、哪个项目构成了所有 Linux 发行版的共同组件?选项有 CentOS、Red Hat、Ubuntu、Linux 内核、CoreOS
Linux 内核
158、苹果的macOS底层使用的是哪个操作系统?选项有OS X、OSX、Darwin、MacOS
Darwin
159、Linux发行版与Linux内核有何不同?A. 内核是发行版的一部分,发行版有围绕内核的应用程序,使内核变得实用;B. 内核就是Linux发行版;C. 所有使用相同内核的发行版都是一样的
A
160、以下哪个是 Linux 中的桌面环境?Mint、Elementary、Zorin、Wayland
题目选项均不准确。常见的 Linux 桌面环境有:
Gnome
KDE
Mint 是 Linux 发行版;Elementary 通常指 Elementary OS 这个发行版;Zorin 也是 Linux 发行版;Wayland 是一个显示服务器协议,并非传统意义的桌面环境。
161、操作系统的哪个组件允许访问硬件?驱动程序、shell、服务、应用程序
驱动程序
162、如果你可以访问命令行,请检索你Linux系统的当前内核版本
使用命令 uname -r ,例如输出可能为 4.15.0 – 47 – generic
163、使用搜索引擎,找出并确定可以使用的公共云提供商,例如亚马逊云服务(AWS)、谷歌云(Google Cloud)、Rackspace 等。选择其中一个,说明有哪些操作系统可供部署。
以 AWS 为例,它允许部署许多 Linux 发行版,如 Debian、Red Hat、SUSE 或 Ubuntu,以及 Windows。
164、苹果的OS X系统底层报告使用的是哪个操作系统?选项有OS X、OSX、Darwin、MacOS
Darwin
165、Linux发行版与Linux内核有何不同?
内核是发行版的一部分,发行版有围绕内核的应用程序,使内核变得有用
166、如果你可以访问命令行,检索你的 Linux 系统当前的内核版本
使用命令
$ uname -r
,例如结果可能为
4.15.0-47-generic
或
4.15.0-1019-aws
167、描述以下术语:处理器(Processor)、中央处理器(CPU)、图形处理器(GPU)
处理器类型说明
处理器(Processor)
:一个通用术语,适用于任何类型的处理器,常被错误地用作中央处理器(CPU)的同义词。
中央处理器(CPU)
:即Central Processing Unit,是为通用计算任务提供支持的处理单元。
图形处理器(GPU)
:即Graphical Processing Unit,是为支持与图形呈现相关活动而优化的处理单元。
168、如果你主要运行视频编辑应用程序(一项计算密集型活动),你认为哪些组件和特性对系统可用性影响最大:CPU核心数、CPU速度、可用系统内存、存储系统、GPU、视频显示器、以上都不是
CPU核心数、CPU速度、可用系统内存、存储系统
169、系统中第三个SATA驱动器的第3个分区,其在/dev中的设备文件名应该是什么:sd3p3、sdcp3、sdc3、以上都不是
sdc3
170、在系统上运行lsblk命令,识别以下参数:设备的类型和数量、每个设备的分区结构、每个分区的文件系统类型和挂载点
设备信息
设备类型和数量
设备名称
:mmcblk0
设备类型
:SD存储卡
分区结构
分区1
:mmcblk0p1
分区2
:mmcblk0p2
文件系统类型和挂载点
分区1
文件系统类型
:vfat
用途
:用于启动系统
挂载点
:/boot
分区2
文件系统类型
:ext4
用途
:作为主文件系统
挂载点
:/
171、在系统上运行lsblk命令,识别设备的类型和数量
有一个设备:mmcblk0,按惯例mmcblk是SD存储卡。
172、在系统上运行 lsblk 命令,识别每个设备的分区结构。若系统无法立即使用,可参考树莓派系统的 lsblk -f 列表。
有两个分区:mmcblk0p1 和 mmcblk0p2。
173、在系统上运行lsblk命令,识别每个分区的文件系统类型和挂载点
分区1
:使用
vfat
文件系统,用于启动系统,挂载点为
/boot
分区2
:使用
ext4
文件系统,作为主文件系统,挂载点为
/
174、使用 which 命令找出以下程序的位置并完成表格:程序、which 命令、可执行文件路径(输出)、用户是否需要 root 权限。程序包括 swapon、kill、cut、usermod、cron、ps。
程序 |
命令 |
可执行文件路径(输出) | 用户是否需要 root 权限 |
---|---|---|---|
swapon |
|
|
是 |
kill |
|
|
否 |
cut |
|
|
否 |
usermod |
|
|
是 |
cron |
|
|
是 |
ps |
|
|
否 |
175、以下文件在哪里可以找到?文件包括:/etc、~、.bashrc、bash.bashrc、passwd、.profile、resolv.conf、sysctl.conf
/etc
是系统配置文件目录
~
代表用户主目录
.bashrc
通常在用户主目录下,是 Bash 非登录 shell 的初始化脚本
bash.bashrc
是系统全局交互式 bash shell 的
.bashrc
文件,位于系统配置目录
passwd
是系统用户数据库文件,在
/etc
目录
.profile
是 Bash 登录 shell 的初始化脚本,在用户主目录
resolv.conf
是解析器配置文件,在
/etc
目录
sysctl.conf
是设置内核系统变量的配置文件,在
/etc
目录
176、解释在 /boot 中找到的内核文件 vmlinuz – 4.15.0 – 50 – generic 的数字元素 4、15、0、50 的含义。
4:内核版本;15:主要修订版本;0:次要修订版本;50:补丁编号
177、硬盘的设备文件根据其所使用的控制器来表示 —— 我们看到使用 SCSI(小型计算机系统接口)和 SATA(串行高级技术附件)的驱动器表示为 /dev/sd*,旧的 IDE(集成驱动电子设备)驱动器是如何表示的?现代的 NVMe(非易失性内存快速通道)驱动器又是如何表示的?
旧的 IDE 驱动器表示为
/dev/hd*
;现代的 NVMe 驱动器表示为
/dev/nvme*
。
178、查看 /proc/meminfo 文件。将该文件的内容与 free 命令的输出进行比较,并确定 /proc/meminfo 中的哪些键对应 free 输出中的以下字段:total、free、shared、buff/cache、available
total
对应
MemTotal
/
SwapTotal
free
对应
MemFree
/
SwapFree
shared
对应
Shmem
buff/cache
对应
Buffers
、
Cached
和
SReclaimable
available
对应
MemAvailable
179、旧的IDE(集成驱动电子设备)硬盘是如何表示的?
/dev/hd*
180、现代的NVMe(非易失性内存快速传输)驱动器在Linux系统中的设备名是什么?
/dev/nvme*
181、查看文件 /proc/meminfo,将该文件的内容与 free 命令的输出进行比较,确定 /proc/meminfo 中的哪些键对应 free 输出中的以下字段:total、free、shared、buff/cache、available。
以下是调整为 Markdown 格式的文本内容:
total
对应
MemTotal
/
SwapTotal
free
对应
MemFree
/
SwapFree
shared
对应
Shmem
buff/cache
对应
Buffers
、
Cached
和
SReclaimable
available
对应
MemAvailable
182、使用 which 命令找出以下程序的位置并完成表格:程序、which 命令、二进制文件路径(输出)、用户是否需要 root 权限?程序包括 swapon、kill、cut、usermod、cron、ps
程序 |
命令 |
二进制文件路径(输出) | 用户是否需要 root 权限? |
---|---|---|---|
swapon |
|
|
是 |
kill |
|
|
否 |
cut |
|
|
否 |
usermod |
|
|
是 |
cron |
|
|
是 |
ps |
|
|
否 |
183、以下文件在哪里可以找到?文件包括 /etc、~、.bashrc、bash.bashrc、passwd、.profile、resolv.conf、sysctl.conf
/etc
是系统配置文件目录
~
代表用户主目录
.bashrc
通常在用户主目录,是 Bash 非登录 shell 的初始化脚本
bash.bashrc
是系统级交互式 bash shell 的
.bashrc
文件,位于系统配置目录
passwd
是系统用户数据库文件,在
/etc
目录
.profile
是 Bash 登录 shell 的初始化脚本,在用户主目录
resolv.conf
是解析器配置文件,在
/etc
目录
sysctl.conf
是设置内核系统变量的配置文件,在
/etc
目录
184、解释在 /boot 中找到的内核文件 vmlinuz – 4.15.0 – 50 – generic 数字元素 4、15、0、50 的含义。
4:内核版本;15:主修订号;0:次修订号;50:补丁号
185、硬盘的设备文件根据其使用的控制器来表示 —— 我们看到使用 SCSI(小型计算机系统接口)和 SATA(串行高级技术附件)的驱动器用 /dev/sd* 表示,那么旧的 IDE(集成驱动器电子接口)驱动器是如何表示的呢?现代的 NVMe(非易失性内存快速传输)驱动器又是如何表示的呢?
旧的 IDE 驱动器用
/dev/hd*
表示,现代的 NVMe 驱动器用
/dev/nvme*
表示。
186、查看 /proc/meminfo 文件。将该文件的内容与 free 命令的输出进行比较,确定 /proc/meminfo 中的哪些键对应 free 输出中的以下字段:总计、空闲、共享、缓存/缓冲、可用
总计:
MemTotal / SwapTotal
空闲:
MemFree / SwapFree
共享:
Shmem
缓存/缓冲:
Buffers
、
Cached
和
SReclaimable
可用:
MemAvailable
187、现代NVMe(非易失性内存快速传输)驱动器是如何表示的?
/dev/nvme*
188、查看 /proc/meminfo 文件。将该文件的内容与 free 命令的输出进行比较,确定 /proc/meminfo 中的哪些键对应 free 输出中的以下字段:total、free、shared、buff/cache、available
total
对应
MemTotal
/
SwapTotal
free
对应
MemFree
/
SwapFree
shared
对应
Shmem
buff/cache
对应
Buffers
、
Cached
和
SReclaimable
available
对应
MemAvailable
189、哪些进程是由用户carol启动的?
PID为2318、2492、1780、2291的进程是由用户carol启动的,对应的命令分别为`bash`、`ps -uf`、`bash`、`emacs index.en.adoc -nw`
190、哪个进程最先运行?你如何判断?
systemd。因为它的进程 ID(PID)是 1。
191、完成表格,指明以下信息在 top 输出的哪个区域可以找到:内存、交换空间、进程 ID、CPU 时间、命令;区域包括摘要区域、任务区域。
信息 | 摘要区域 | 任务区域 |
---|---|---|
内存 | 是 | 是 |
交换空间 | 是 | 否 |
PID | 否 | 是 |
CPU 时间 | 否 | 是 |
命令 | 否 | 是 |