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。

程序

which

命令

可执行文件路径(输出) 用户是否需要 root 权限
swapon

which swapon

/sbin/swapon

kill

which kill

/bin/kill

cut

which cut

/usr/bin/cut

usermod

which usermod

/usr/sbin/usermod

cron

which cron

/usr/sbin/cron

ps

which ps

/bin/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

程序

which

命令

二进制文件路径(输出) 用户是否需要 root 权限?
swapon

which swapon

/sbin/swapon

kill

which kill

/bin/kill

cut

which cut

/usr/bin/cut

usermod

which usermod

/usr/sbin/usermod

cron

which cron

/usr/sbin/cron

ps

which ps

/bin/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 时间
命令
© 版权声明

相关文章

暂无评论

none
暂无评论...