鳥哥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" ]; thenecho "begin download"exit 0 elif [ "$inputval" = "n" ] || [ "$inputval" = "N" ]; thenecho "download failed"exit 0 elseecho "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" ] doread -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從會用到略懂垮了一個門檻。