日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

鸟哥的linux私房菜学习笔记7

發(fā)布時(shí)間:2023/12/18 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸟哥的linux私房菜学习笔记7 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P370

  • 情境模擬題一:透過 grep 搜尋特殊字串,并配合數(shù)據(jù)流重導(dǎo)向來處理大量的文件搜尋問題。

    • 目標(biāo):正確的使用正規(guī)表示法;
    • 前提:需要了解數(shù)據(jù)流重導(dǎo)向,以及透過子命令 $(command) 來處理檔名的搜尋;

    我們簡單的以搜尋星號 (*) 來處理底下的任務(wù):

  • 利用正規(guī)表示法找出系統(tǒng)中含有某些特殊關(guān)鍵字的文件,舉例來說,找出在 /etc 底下含有星號 (*) 的文件與內(nèi)容:

    解決的方法必須要搭配萬用字節(jié),但是星號本身就是正規(guī)表示法的字符,因此需要如此進(jìn)行:
    [root@www ~]# grep '\*' /etc/*
    你必須要注意的是,在單引號內(nèi)的星號是正規(guī)表示法的字符,但我們要找的是星號,因此需要加上跳脫字符 (\)。但是在 /etc/* 的那個(gè) * 則是 bash 的萬用字節(jié)! 代表的是文件的檔名喔!不過由上述的這個(gè)結(jié)果中,我們僅能找到 /etc 底下第一層子目錄的數(shù)據(jù),無法找到次目錄的數(shù)據(jù), 如果想要連同完整的 /etc 次目錄數(shù)據(jù),就得要這樣做:
    [root@www ~]# grep '\*' $(find /etc -type f)

  • 但如果文件數(shù)量太多呢?如同上述的案例,如果要找的是全系統(tǒng) (/) 呢?你可以這樣做:
    [root@www ~]# grep '\*' $(find / -type f) -bash: /bin/grep: Argument list too long
    真要命!由於命令列的內(nèi)容長度是有限制的,因此當(dāng)搜尋的對象是整個(gè)系統(tǒng)時(shí),上述的命令會發(fā)生錯(cuò)誤。那該如何是好? 此時(shí)我們可以透過管線命令以及 xargs 來處理。舉例來說,讓 grep 每次僅能處理 10 個(gè)檔名,此時(shí)你可以這樣想:

  • 先用 find 去找出文件;
  • 用 xargs 將這些文件每次丟 10 個(gè)給 grep 來作為參數(shù)處理;
  • grep 實(shí)際開始搜尋文件內(nèi)容。

  • 所以整個(gè)作法就會變成這樣:
    [root@www ~]# find / -type f | xargs -n 10 grep '\*'

  • 從輸出的結(jié)果來看,數(shù)據(jù)量實(shí)在非常龐大!那如果我只是想要知道檔名而已呢?你可以透過 grep 的功能來找到如下的參數(shù)!
    [root@www ~]# find / -type f | xargs -n 10 grep -l '\*'

  • 情境模擬題二:使用管線命令配合正規(guī)表示法創(chuàng)建新命令與新變量。我想要創(chuàng)建一個(gè)新的命令名為 myip , 這個(gè)命令能夠?qū)⑽蚁到y(tǒng)的 IP 捉出來顯示。而我想要有個(gè)新變量,變量名為 MYIP ,這個(gè)變量可以記錄我的 IP 。

    處理的方式很簡單,我們可以這樣試看看:

  • 首先,我們依據(jù)本章內(nèi)的 ifconfig, sed 與 awk 來取得我們的 IP ,命令為:
    [root@www ~]# ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*inet addr://g'| cut -d ' ' -f1
  • 再來,我們可以將此命令利用 alias 指定為 myip 喔!如下所示:
    [root@www ~]# alias myip="ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*inet addr://g'| cut -d ' ' -f1 "
  • 最終,我們可以透過變量配置來處理 MYIP 喔!
    [root@www ~]# MYIP=$( myip )
  • 如果每次登陸都要生效,可以將 alias 與 MYIP 的配置那兩行,寫入你的 ~/.bashrc 即可!



script 的運(yùn)行方式差異 (source, sh script, ./script)

利用直接運(yùn)行的方式來運(yùn)行 script


這個(gè)腳本可以讓使用者自行配置兩個(gè)變量,分別是 firstname 與 lastname,想一想,如果你直接運(yùn)行該命令時(shí),該命令幫你配置的 firstname 會不會生效?看一下底下的運(yùn)行結(jié)果:

[root@www scripts]# echo $firstname $lastname<==確認(rèn)了,這兩個(gè)變量并不存在喔! [root@www scripts]# sh sh02.sh Please input your first name: VBird <==這個(gè)名字是鳥哥自己輸入的 Please input your last name: Tsai Your full name is: VBird Tsai <==看吧!在 script 運(yùn)行中,這兩個(gè)變量有生效 [root@www scripts]# echo $firstname $lastname<==事實(shí)上,這兩個(gè)變量在父程序的 bash 中還是不存在的!

上面的結(jié)果你應(yīng)該會覺得很奇怪,怎么我已經(jīng)利用 sh02.sh 配置好的變量竟然在 bash 環(huán)境底下無效!怎么回事呢? 如果將程序相關(guān)性繪制成圖的話,我們以下圖來說明。當(dāng)你使用直接運(yùn)行的方法來處理時(shí),系統(tǒng)會給予一支新的 bash 讓我們來運(yùn)行 sh02.sh 里面的命令,因此你的 firstname, lastname 等變量其實(shí)是在下圖中的子程序 bash 內(nèi)運(yùn)行的。 當(dāng) sh02.sh 運(yùn)行完畢后,子程序 bash 內(nèi)的所有數(shù)據(jù)便被移除,因此上表的練習(xí)中,在父程序底下 echo $firstname 時(shí), 就看不到任何東西了!這樣可以理解嗎?


圖 2.2.1、sh02.sh 在子程序中運(yùn)行


  • 利用 source 來運(yùn)行腳本:在父程序中運(yùn)行

如果你使用 source 來運(yùn)行命令那就不一樣了!同樣的腳本我們來運(yùn)行看看:

[root@www scripts]# source sh02.sh Please input your first name: VBird Please input your last name: TsaiYour full name is: VBird Tsai [root@www scripts]# echo $firstname $lastname VBird Tsai <==嘿嘿!有數(shù)據(jù)產(chǎn)生喔!

竟然生效了!沒錯(cuò)啊!因?yàn)?source 對 script 的運(yùn)行方式可以使用底下的圖示來說明! sh02.sh 會在父程序中運(yùn)行的,因此各項(xiàng)動作都會在原本的 bash 內(nèi)生效!這也是為啥你不注銷系統(tǒng)而要讓某些寫入 ~/.bashrc 的配置生效時(shí),需要使用『 source ~/.bashrc 』而不能使用『 bash ~/.bashrc 』是一樣的啊!


圖 2.2.2、sh02.sh 在父程序中運(yùn)行


利用 test 命令的測試功能

當(dāng)我要檢測系統(tǒng)上面某些文件或者是相關(guān)的屬性時(shí),利用 test 這個(gè)命令來工作真是好用得不得了, 舉例來說,我要檢查 /dmtsai 是否存在時(shí),使用:

[root@www ~]# test -e /dmtsai

運(yùn)行結(jié)果并不會顯示任何信息,但最后我們可以透過 $? 或 && 及 || 來展現(xiàn)整個(gè)結(jié)果呢! 例如我們在將上面的例子改寫成這樣:

[root@www ~]# test -e /dmtsai && echo "exist" || echo "Not exist" Not exist <==結(jié)果顯示不存在啊!


利用判斷符號 [ ]

如果我想要知道 $HOME 這個(gè)變量是否為空的,可以這樣做:

[root@www ~]# [ -z "$HOME" ] ; echo $?

使用中括號必須要特別注意,因?yàn)橹欣ㄌ栍迷诤芏嗟胤?#xff0c;包括萬用字節(jié)與正規(guī)表示法等等,所以如果要在 bash 的語法當(dāng)中使用中括號作為 shell 的判斷式時(shí),必須要注意中括號的兩端需要有空白字節(jié)來分隔喔! 假設(shè)我空白鍵使用『□』符號來表示,那么,在這些地方你都需要有空白鍵:

[ "$HOME" == "$MAIL" ] [□"$HOME"□==□"$MAIL"□]↑ ↑ ↑ ↑
Tips:
你會發(fā)現(xiàn)鳥哥在上面的判斷式當(dāng)中使用了兩個(gè)等號『 == 』。其實(shí)在 bash 當(dāng)中使用一個(gè)等號與兩個(gè)等號的結(jié)果是一樣的! 不過在一般慣用程序的寫法中,一個(gè)等號代表『變量的配置』,兩個(gè)等號則是代表『邏輯判斷 (是否之意)』。 由於我們在中括號內(nèi)重點(diǎn)在於『判斷』而非『配置變量』,因此鳥哥建議您還是使用兩個(gè)等號較佳!

上面的例子在說明,兩個(gè)字串 $HOME 與 $MAIL 是否相同的意思,相當(dāng)於 test $HOME = $MAIL 的意思啦! 而如果沒有空白分隔,例如 [$HOME==$MAIL] 時(shí),我們的 bash 就會顯示錯(cuò)誤信息了!這可要很注意啊! 所以說,你最好要注意:

  • 在中括號 [] 內(nèi)的每個(gè)組件都需要有空白鍵來分隔;
  • 在中括號內(nèi)的變量,最好都以雙引號括號起來;
  • 在中括號內(nèi)的常數(shù),最好都以單或雙引號括號起來。

為什么要這么麻煩啊?直接舉例來說,假如我配置了 name="VBird Tsai" ,然后這樣判定:

[root@www ~]# name="VBird Tsai" [root@www ~]# [ $name == "VBird" ] bash: [: too many arguments

見鬼了!怎么會發(fā)生錯(cuò)誤啊?bash 還跟我說錯(cuò)誤是由於『太多參數(shù) (arguments)』所致! 為什么呢?因?yàn)?$name 如果沒有使用雙引號刮起來,那么上面的判定式會變成:

[ VBird Tsai == "VBird" ]



Shell script 的默認(rèn)變量($0, $1...)

我們知道命令可以帶有選項(xiàng)與參數(shù),例如 ls -la 可以察看包含隱藏檔的所有屬性與權(quán)限。那么 shell script 能不能在腳本檔名后面帶有參數(shù)呢?很有趣喔!舉例來說,如果你想要重新啟動系統(tǒng)登錄檔的功能,可以這樣做:

[root@www ~]# file /etc/init.d/syslog /etc/init.d/syslog: Bourne-Again shell script text executable # 使用 file 來查詢后,系統(tǒng)告知這個(gè)文件是個(gè) bash 的可運(yùn)行 script 喔! [root@www ~]# /etc/init.d/syslog restart

restart 是重新啟動的意思,上面的命令可以『重新啟動 /etc/init.d/syslog 這支程序』的意思! 唔!那么如果你在 /etc/init.d/syslog 后面加上 stop 呢?沒錯(cuò)!就可以直接關(guān)閉該服務(wù)了!這么神奇啊? 沒錯(cuò)啊!如果你要依據(jù)程序的運(yùn)行給予一些變量去進(jìn)行不同的任務(wù)時(shí),本章一開始是使用 read 的功能!但 read 功能的問題是你得要手動由鍵盤輸入一些判斷式。如果透過命令后面接參數(shù), 那么一個(gè)命令就能夠處理完畢而不需要手動再次輸入一些變量行為!這樣下達(dá)命令會比較簡單方便啦!

script 是怎么達(dá)成這個(gè)功能的呢?其實(shí) script 針對參數(shù)已經(jīng)有配置好一些變量名稱了!對應(yīng)如下:

/path/to/scriptname opt1 opt2 opt3 opt4 $0 $1 $2 $3 $4

這樣夠清楚了吧?運(yùn)行的腳本檔名為 $0 這個(gè)變量,第一個(gè)接的參數(shù)就是 $1 啊~ 所以,只要我們在 script 里面善用 $1 的話,就可以很簡單的立即下達(dá)某些命令功能了!除了這些數(shù)字的變量之外, 我們還有一些較為特殊的變量可以在 script 內(nèi)使用來呼叫這些參數(shù)喔!

  • $# :代表后接的參數(shù)『個(gè)數(shù)』,以上表為例這里顯示為『 4 』;
  • $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每個(gè)變量是獨(dú)立的(用雙引號括起來);
  • $* :代表『 "$1c$2c$3c$4" 』,其中 c 為分隔字節(jié),默認(rèn)為空白鍵, 所以本例中代表『 "$1 $2 $3 $4" 』之意。

那個(gè) $@ 與 $* 基本上還是有所不同啦!不過,一般使用情況下可以直接記憶 $@ 即可! 好了,來做個(gè)例子吧~假設(shè)我要運(yùn)行一個(gè)可以攜帶參數(shù)的 script ,運(yùn)行該腳本后螢?zāi)粫@示如下的數(shù)據(jù):

  • 程序的檔名為何?
  • 共有幾個(gè)參數(shù)?
  • 若參數(shù)的個(gè)數(shù)小於 2 則告知使用者參數(shù)數(shù)量太少
  • 全部的參數(shù)內(nèi)容為何?
  • 第一個(gè)參數(shù)為何?
  • 第二個(gè)參數(shù)為何
[root@www scripts]# vi sh07.sh #!/bin/bash # Program: # Program shows the script name, parameters... # History: # 2009/02/17 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATHecho "The script name is ==> $0" echo "Total parameter number is ==> $#" [ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." \&& exit 0 echo "Your whole parameter is ==> '$@'" echo "The 1st parameter ==> $1" echo "The 2nd parameter ==> $2"

運(yùn)行結(jié)果如下:

[root@www scripts]# sh sh07.sh theone haha quot The script name is ==> sh07.sh <==檔名 Total parameter number is ==> 3 <==果然有三個(gè)參數(shù) Your whole parameter is ==> 'theone haha quot' <==參數(shù)的內(nèi)容全部 The 1st parameter ==> theone <==第一個(gè)參數(shù) The 2nd parameter ==> haha <==第二個(gè)參數(shù)



  • shift:造成參數(shù)變量號碼偏移

除此之外,腳本后面所接的變量是否能夠進(jìn)行偏移 (shift) 呢?什么是偏移啊?我們直接以底下的范例來說明好了, 用范例說明比較好解釋!我們將 sh07.sh 的內(nèi)容稍作變化一下,用來顯示每次偏移后參數(shù)的變化情況:

[root@www scripts]# vi sh08.sh #!/bin/bash # Program: # Program shows the effect of shift function. # History: # 2009/02/17 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATHecho "Total parameter number is ==> $#" echo "Your whole parameter is ==> '$@'" shift # 進(jìn)行第一次『一個(gè)變量的 shift 』 echo "Total parameter number is ==> $#" echo "Your whole parameter is ==> '$@'" shift 3 # 進(jìn)行第二次『三個(gè)變量的 shift 』 echo "Total parameter number is ==> $#" echo "Your whole parameter is ==> '$@'"

這玩意的運(yùn)行成果如下:

[root@www scripts]# sh sh08.sh one two three four five six <==給予六個(gè)參數(shù) Total parameter number is ==> 6 <==最原始的參數(shù)變量情況 Your whole parameter is ==> 'one two three four five six' Total parameter number is ==> 5 <==第一次偏移,看底下發(fā)現(xiàn)第一個(gè) one 不見了 Your whole parameter is ==> 'two three four five six' Total parameter number is ==> 2 <==第二次偏移掉三個(gè),two three four 不見了 Your whole parameter is ==> 'five six'



  • 單層、簡單條件判斷式

如果你只有一個(gè)判斷式要進(jìn)行,那么我們可以簡單的這樣看:

if [ 條件判斷式 ]; then當(dāng)條件判斷式成立時(shí),可以進(jìn)行的命令工作內(nèi)容; fi <==將 if 反過來寫,就成為 fi 啦!結(jié)束 if 之意!

date_d=$(echo $date2 |grep '[0-9]\{8\}')?? # 看看是否有八個(gè)數(shù)字
if [ "$date_d" == "" ]; then
echo "You input the wrong date format...."
exit 1
fi


找出2-5個(gè)o的連續(xù)字符串,因?yàn)閧與}的符號在shell是有特殊意義,因此,必須要用轉(zhuǎn)義字符\來讓它失去特殊意義

grep -n 'o\{2\}' regular_express.txt


利用 case ..... esac 判斷

case $變量名稱 in <==關(guān)鍵字為 case ,還有變量前有錢字號"第一個(gè)變量內(nèi)容") <==每個(gè)變量內(nèi)容建議用雙引號括起來,關(guān)鍵字則為小括號 )程序段;; <==每個(gè)類別結(jié)尾使用兩個(gè)連續(xù)的分號來處理!"第二個(gè)變量內(nèi)容")程序段;;*) <==最后一個(gè)變量內(nèi)容都會用 * 來代表所有其他值不包含第一個(gè)變量內(nèi)容與第二個(gè)變量內(nèi)容的其他程序運(yùn)行段exit 1;; esac <==最終的 case 結(jié)尾!『反過來寫』思考一下!

利用 function 功能

什么是『函數(shù) (function)』功能啊?簡單的說,其實(shí), 函數(shù)可以在 shell script 當(dāng)中做出一個(gè)類似自訂運(yùn)行命令的東西,最大的功能是, 可以簡化我們很多的程序碼~舉例來說,上面的 sh12.sh 當(dāng)中,每個(gè)輸入結(jié)果 one, two, three 其實(shí)輸出的內(nèi)容都一樣啊~那么我就可以使用 function 來簡化了! function 的語法是這樣的:

function fname() {程序段 }

function 也是擁有內(nèi)建變量的~他的內(nèi)建變量與 shell script 很類似, 函數(shù)名稱代表示 $0 ,而后續(xù)接的變量也是以 $1, $2... 來取代的~ 這里很容易搞錯(cuò)喔~因?yàn)椤?function fname() { 程序段 } 』內(nèi)的 $0, $1... 等等與 shell script 的 $0 是不同的。以上面 sh12-2.sh 來說,假如我下達(dá):『 sh sh12-2.sh one 』 這表示在 shell script 內(nèi)的 $1 為 "one" 這個(gè)字串。但是在 printit() 內(nèi)的 $1 則與這個(gè) one 無關(guān)。 我們將上面的例子再次的改寫一下,讓你更清楚!

[root@www scripts]# vi sh12-3.sh #!/bin/bash # Program: # Use function to repeat information. # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATHfunction printit(){echo "Your choice is $1" # 這個(gè) $1 必須要參考底下命令的下達(dá) }echo "This program will print your selection !" case $1 in"one")printit 1 # 請注意, printit 命令后面還有接參數(shù)!;;"two")printit 2;;"three")printit 3;;*)echo "Usage $0 {one|two|three}";; esac

在上面的例子當(dāng)中,如果你輸入『 sh sh12-3.sh one 』就會出現(xiàn)『 Your choice is 1 』的字樣~ 為什么是 1 呢?因?yàn)樵诔绦蚨温洚?dāng)中,我們是寫了『 printit 1 』那個(gè) 1 就會成為 function 當(dāng)中的 $1 喔~


while do done, until do done (不定回圈)

一般來說,不定回圈最常見的就是底下這兩種狀態(tài)了:

while [ condition ] <==中括號內(nèi)的狀態(tài)就是判斷式 do <==do 是回圈的開始!程序段落 done <==done 是回圈的結(jié)束

while 的中文是『當(dāng)....時(shí)』,所以,這種方式說的是『當(dāng) condition 條件成立時(shí),就進(jìn)行回圈,直到 condition 的條件不成立才停止』的意思。還有另外一種不定回圈的方式:

until [ condition ] do程序段落 done

for...do...done (固定回圈)

相對於 while, until 的回圈方式是必須要『符合某個(gè)條件』的狀態(tài), for 這種語法,則是『 已經(jīng)知道要進(jìn)行幾次回圈』的狀態(tài)!他的語法是:

for var in con1 con2 con3 ... do程序段 done



轉(zhuǎn)載于:https://www.cnblogs.com/jonathanyue/p/9301297.html

總結(jié)

以上是生活随笔為你收集整理的鸟哥的linux私房菜学习笔记7的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。