Bootstrap

鸟哥Linux私房菜笔记(三)

鸟哥Linux私房菜笔记(三)

该第三部分和第四部分主要为原书的第十一章(正则表达式与文件格式化处理),第十二章学习shell脚本,第十六章(进程管理与SElinux初探部分),第十七章(认识系统服务),第十九章(启动流程,模块管理与Loader),第二十一章(软件安装:源代码与Tarball).

第十一章正则表达式与文件格式化处理

正则表达式

正则表达式是通过一些特殊字符的排列来查找,删除,替换一行文字或者多行文字,简单来说,正则表达式就是用在字符串的处理的一项表达式。正则表达式不是一个工具程序,而是一个字符串处理的标准程序。正则表达式与通配符是完全不同的,通配符代表的是一个bash的功能。

以下是部分linux正则表达式的示例:(grep的高级用法)

在这里我新建了个txt文件,内容只有五行,然后分别让命令行grep出含有'name'的行,含有'[a-z]'(从a到z任意字母)的行,含有[ll]的行,结果如输出所示。

这就告诉我们在实际操作的时候假如不用Vim该怎么读取文件的各行并输出,可以用如下命令grep -n '' hhh.txt意思就是从hhh.txt中选出含有空白字符的各行。

此外如果要特意指定查找某某行末或者行头的字符,可以用'^'和'$'来执行。

用*和\{n\m}这样的搭配可以指定查找重复的字符。

这里用上个转义符\可以将特殊符号的特殊意义去掉,这里就是仅仅去查找文件中的单引号,结果是没有。

文件的格式化处理

用awk可以使用字段为根据,进行数据的重新整理与输出。

在文件的比对中,可以用diff或cmp进行比对,其中diff主要 用在纯文本文件方面的新旧版本的比对。

printf可以通过一些特殊化符号来将数据进行格式化输出。

第十二章学习shell脚本

shell script更像是早期的.bat文件,最简单的功能就是将许多的用户命令写在一起,使得用户可以用one touch的方法去处理复杂的操作,shell脚本可以被近似的看作是批处理文件,所以不需要编译就可以运行,这让我想起了以前安装ros2下载的鱼香ros小软件就是用了shell脚本。shell脚本可以帮助软件员更好的管理主机,是必备之品。

学习shell脚本在自动化主机管理很有用,管理主机每天的任务就有查询日志文件,跟踪流量,监控用户使用主机状态等等,我在猎聘网站上找到的和Linux相关的工作要求,关键的就是shell编程。

编写第一个shell脚本与执行

#name=hcy
#time=2025.2.2
#this program is an easy test shell script
PATH=/root/hello.sh
export PATH
echo "hello world\a\n"
exit 0

这就是一个最简单的shell脚本,执行后是打印出来hello world.执行可以用:sh hello.sh或者chmod a+x hello.sh;./hello.sh(让我想起了安装conda的时候下载的安装执行脚本,就是用这段抽象的命令给安装完毕了)运行示例如下:

简单的Shell脚本练习

示例如下,主要用到了输入信息和数学运算。

#easy shell script examples
read -p "input date" date #提升输入日期
read -p "input your name" name #提示输入名字
echo -e "\n date is ${date},your name is ${name}\n" #最后打印输出
echo -e $((13/3)) #采用特定格式进行运算
​

判断式的学习

a=500
echo '500MB will be download'
read -p "Continue? [y]or[n]" inputval
if [ "$inputval" = "y" ] || [ "$inputval" = "Y" ]; then
    echo "begin download"
    exit 0
elif [ "$inputval" = "n" ] || [ "$inputval" = "N" ]; then
    echo "download failed"
    exit 0
else
    echo "please check the spelling"
    exit 0
fi
​

在这段示例代码中模拟了平常下载软件的一个片段,保存为.sh即可执行。

read -p "input your choice " choice
case ${choice} in 
    "one")
        echo "Your choice is one "
        ;;
    "two")
        echo "Your choice is two"
        ;;
    "three") 
        echo "Your choice is three"
        ;;
    *)
        echo "Your usage ${0} {one|two|three}"
        ;;
esac
​
​

而上面这段代码展示了调用shell script中的case语法的一个格式,判断输入的选择并输出对应的值。

函数功能的使用

在shell脚本中也有函数功能,可以调用函数来执行输出方便代码编写。下面是个例子:

#!/bin/bash
function printtit () {
    echo -n "your choice is "
}
echo "this program will check your spelling"
case "${1}" in
    "one")
        printtit; echo "${1}"
        ;;
    "two")
        printtit; echo "${1}"
        ;;
    "three")
        printtit; echo "${1}"
        ;;
    *)
        echo "usage: ${0} {one|two|three}"
        ;;
esac
​

在里面定义了个函数,并在后面调用,要注意在这里执行这段脚本的命令是:bash filename.sh而非用sh filename.sh在这方面的简单解决办法是把报错和代码喂给AI(deepseek最管用)。

循环功能的使用

下面这段代码是只要用户不输入yes就不断的打印请输入

#!/bin/bash
while [ "${yn}" != "yes" -a "${yn}" != "YES" ]
do
    read -p "please input yes/YES to stop: " yn
done
echo "OK"

执行效果如下,提到这里要注意的是,shell语法对缩进和空格特别敏感,"${yn}"和[间一定要有空格。

下面是执行for循环进行一个简单的相加操作。

#!/bin/bash
read -p "input a number" nu
s=0
for (( i=1; i<=${nu} ; i=i+1 ))
do 
    s=$((${s}+${i}))
​
done
echo "the result is ${s}"

执行的结果如下所示:

总结

shell script是我到现在学过的一门很特殊的编程语言,其特点是编程格式非主流,对空格等要求极为敏感,上面的这些例子不过是一些入门的了解,shell学好才算是Linux从会用到略懂垮了一个门槛。

;