《鳥哥的linux私房菜》讀書筆記(部分)

x86是一種微機系統硬件架構,另一種是蘋果的mac的架構

linux將所有的設備,軟件都抽象成了文件

早期的計算機硬件廠商都有自己定製的操作系統

沒有核心和驅動的概念,直接通過操作系統操作硬件

4,2,1在二進制中爲100,010,001能很好的執行位操作,也表示r,w,x(注意順序),chmod結合這這幾個數字可以很好的進行文件屬性的修改。另外一種比較具有可讀性的做法是用ugoa來表示不同的用戶角色,用rwx表示不同的權限,用+-=來表示不同的權限設置方式

目錄的權限高於目錄下文件的權限,即某用戶擁有某目錄下的w權限,將同時擁有該目錄下文件的增刪查改的權限,即使文件是root創建的

對於目錄來說,x表示是否能進去此目錄

設備文件分塊設備(硬盤)和字符設備(鍵盤鼠標)文件

一個文件的屬性跟文件的擴展名沒關係,擴展名只是爲了人類容易識別文件的屬性,linux是通過文件開始的十個屬性(rwxigo)有關

/etc是用來放配置的
/opt是用來裝軟件的
/dev都是各種設備
/proc的內容會加載到內存,也可以理解爲內存中內容的一個持久化
/home各種用戶私人的信息
/root超級用戶的信息
/bin可執行命令
/sbin超級用戶專屬可執行命令
/tmp可以理解爲垃圾桶,回收站
/usr類似軟件目錄program files
/var是用來存放系統運行過程中軟件產生的數據


在vi中,一般模式下的命令中,如果數字在前面表示向後多少行比如10yy表示從當前行往後複製10行,而後面的數字表示向前(可能是行,也可能是字符個數,一般只有0和1)。

很多命令字符都很難跟具體的含義關聯起來,或者沒有規律(經常見到的情況是將命令表放在眼前位置),這個導致不用的命令很容易忘記。但也有好記的,比如y會跟複製聯繫起來,因此可以理解爲copy中的y。

0表示移動到當前行第一個字母的處,這個很不好記,但很常用

J表示和下面的行合併,可以理解爲join

p表示粘帖到當前行下面,可以理解爲paste

一般同一個命令的小寫表示向後,大寫表示向前,p表示粘帖到後面,P表示粘帖當到前面,x表示刪除後面一個字符,X表示刪除前面一個字符,但也有反例,比如A,在最後插入

u是undo好理解,r表示redo,卻要帶上ctrl, 這個主要是爲了跟替換(replace)的r區別,這個只能死記,多用

a在字符後面插入,可以理解爲after

o插入空行,只能死記了,可以想象kong中的o

!有強制的意思,比如強制退出,強制寫入

vi每次編輯會將當前修改文件做一個後綴爲swp的文件,用來保存最新的更新狀態。

vim的標準記錄都會寫在~/.viminfo文件中

:set nu是顯示行號的簡寫形式

shell是用來向核心下達命令的,相對於核心來說,他就是一層殼

變量賦值等號兩邊不能有空格,這對java寫多了的人來說的確不習慣

export擴大了變量的外延:將局部變量變成環境變量

系統變量大寫,自定義變量小寫

轉義字符甚至可惜可惜轉義空格

字符串的累加用的是冒號,相當於字符串的join

"$name"和${name}是一回事

單引號中的特殊字符就是特殊字符,雙引號則有變量特性,這個主要針對$來說的

變量使用的兩個場景:將常用的很長的路徑用一個簡短的變量簡化;不同的場景具有不同的值,這時會用到環境變量

幾個特殊的變量:$表示當前進程id,?表示前一個命令執行的返回值

腳本的默認類型是字符串,若要聲明其他類型,需要使用declare。

數組是腳本中的一種常用類型

${var}也可以執行自責字符串操作,比如刪除,替換指定的字符,%,#是刪除,/是替換,雙數則是全局操作

對特別長的命令,請使用別名

rm刪除操作,最好加上-i給出提示

關於history的知識:!!表示執行前一個命令;!command則是搜索命令,相當於自動完成功能,等同於ctrl+r

當前目錄不是執行命令搜索的默認路徑
因此要執行當前命令,需要這樣寫:./command

~表示是當前用戶目錄,cd ~就更好理解了

bash_profile在登陸的時候讀取,bashrc在每次執行腳本的時候讀取。優先級是後者爲高,即最後讀取,一般將個人偏好設置放在bashrc中

set -x執行前顯示命令內容,在調試時比較有用

set -u使用未定義的變量會報錯,這個容易幫助我們檢查出變量名錯誤。

[!a-z]表示非小寫字母,跟正則的^[a-z]不一樣

`uname -r`和$(uname -r)具有同樣的效果,都是先被執行

命令的返回結果爲0表示執行成功,可惜作爲條件爲真的判斷,這個可惜結合||,&&邏輯判斷使用,這個邏輯判斷很有意思,若前面判斷爲假,||後面的會執行,前面爲真,&&後年會被執行。

甚至在某些情況下,結合||和&&可以實現三元操作符的功能:command1 && command2 || command3
cut在取段的時候是base 1 ,俺字符取也是一樣,針對規則內容比較有意義

sort的排序參數很讓人無語的,-f表示忽略大小寫,-k用來指定按第幾個字段排序,base同樣是1

sort和uniq兩個命令是一對好基友

即寫文件又刷屏用tee

tr=text replace

^M表示這是一個dos下的回車換行符

join將兩個文件合併,並指定合併字段,類似SQL的join操作:將兩個表做關聯
paste實現兩個文件的行與行粘帖

expand用來處理tab和空格之間的轉換

xargs用來將輸入內容按照一定的規則逐行分解成多個參數給後面接的命令使用,可以將x理解爲肢解:-),每分析一行就執行一條命令,我覺得最有用的還是接-i參數,然後在命令行中使用佔位符{}。默認命令是echo

在使用管道的時候,有時候會用到-,它一般用來指代操作輸入,輸出。

正則表達式中的範圍符號{}詞組做轉義,而[]則不必

egrep使用的是擴展正則表達式,|,+,?()符號屬於擴展正則表達式的內容

經常分不清?和+,前者可以理解爲有木有(零個和一個),後者可以理解爲有多少(一個和多個)

sed中的-r就是表示使用的是擴展正則表達式

$((運算內容)) 這個寫法不錯

test 測試內容 && true || false 這個寫法也不錯

原來test等價判斷符號[] 比如 test -z $HOME等價於[ -z "$HOME" ],一個重要的地方是判斷符號裏面的每一個元素要用空格分隔,而且變量要用雙引號括起來,shell的一些規律有時候就是感覺很奇怪

shell變量可以是字符串,路徑,文件,這個主要取決於是上下文環境,不過如果是字符串最好用引號括起

判斷符號之間用||和&&連起來表示OR AND

else if 在shell中會被簡寫爲elif,多寫兩個字母會死啊

netstat -tuln用來查看當前機器已開的端口

函數一定要放在腳本的前面

函數和腳本的第一個參數都是$1

until do done條件成立時終止

for循環要用兩個括號這個有些無語

for in相當於對一個列表進行遍歷,比如穩健夾下的所有文件

shell調試和追蹤參數-nvx, 早知道這些參數效率會提高不少
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章