LInux回顧與Shell程式設計
一、Linux回顧
因為要學習Hadoop大資料,會用到Linux伺服器叢集來做,因此有必要回顧一下當年大一所學習的Linux知識
①Linux系統有7個執行級別(runlevel):
- 執行級別0:系統停機狀態,系統預設執行級別不能設為0,否則不能正常啟動
- 執行級別1:單使用者工作狀態,root許可權,用於系統維護,禁止遠端登陸
- 執行級別2:多使用者狀態(沒有NFS)
- 執行級別3:完全的多使用者狀態(有NFS),登陸後進入控制檯命令列模式
- 執行級別4:系統未使用,保留
- 執行級別5:X11控制檯,登陸後進入圖形GUI模式
- 執行級別6:系統正常關閉並重啟,預設執行級別不能設為6,否則不能正常啟動
一般來說,我會在3和5之間進行切換,一般都還是使用遠端登入的方法,不在虛擬機器裡進行操作。對於多臺虛擬機器的聯合操作還是比較喜歡使用:SevureCRT軟體
②檔案的基本操作
2.1 在Linux中我們可以使用ll或者ls –l命令來顯示一個檔案的屬性以及檔案所屬的使用者和組
在Linux中第一個字元代表這個檔案是目錄、檔案或連結檔案等等。顯然我這裡的都是檔案
- 當為[d]則是目錄
- 當為[-]則是檔案;
- 若是[l]則表示為連結文件(link file);
- 若是[b]則表示為裝置檔案裡面的可供儲存的介面裝置(可隨機存取裝置);
- 若是[c]則表示為裝置檔案裡面的串列埠裝置,例如鍵盤、滑鼠(一次性讀取裝置)
接下來的字元中,以三個為一組,且均為『rwx』 的三個引數的組合。其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。 要注意的是,這三個許可權的位置不會改變,如果沒有許可權,就會出現減號[ - ]而已。
2.2、chmod更改檔案的屬性
r:4、w:2、x:1
rwx=4+2+1=7
語法:chmod許可權數字檔案或目錄
更改後,不僅owner可以讀寫執行,group和others也都可以
2.3接下來我們就來看幾個常見的處理目錄的命令吧:
- ls: 列出目錄及檔名
- cd:切換目錄
- pwd:顯示目前的目錄
- mkdir:建立一個新的目錄
- rmdir:刪除一個空的目錄
- cp: 複製檔案或目錄
- rm: 移除檔案或目錄
- mv: 移動檔案與目錄,或修改檔案與目錄的名稱
ls已經展示過了,cd很常用,也不展示
cd ~回到根目錄就是/root
cd ..返回上一級目錄
pwd
mkdir
建立單個目錄:mkdir目錄名稱
建立多級目錄:mkdir -ptest1/test2/test3
rmdir:刪除空的目錄
rmdir 目錄名稱
rmdir -p 目錄名稱
連同上一級『空的』目錄也一起刪除
cp:複製檔案
cp 來原始檔 目標檔案下
-i:若目標檔(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用)
rm 一出文件或目錄
- -f :就是 force 的意思,忽略不存在的檔案,不會出現警告資訊;
- -i :互動模式,在刪除前會詢問使用者是否動作
- -r :遞迴刪除啊!最常用在目錄的刪除了!這是非常危險的選項!!!
mv 移動檔案與目錄,或者修改名稱
- -f :force 強制的意思,如果目標檔案已經存在,不會詢問而直接覆蓋;
- -i :若目標檔案 (destination) 已經存在時,就會詢問是否覆蓋!
- -u :若目標檔案已經存在,且 source 比較新,才會升級 (update)
將其移動到上一級目錄中:
將其改名
③Vi與Vim
刪除、複製與貼上
x, X | 在一行字當中,x 為向後刪除一個字元 (相當於 [del] 按鍵), X 為向前刪除一個字元(相當於 [backspace] 亦即是退格鍵) (常用) |
nx | n 為數字,連續向後刪除 n 個字元。舉例來說,我要連續刪除 10 個字元, 『10x』。 |
dd | 刪除遊標所在的那一整行(常用) |
ndd | n 為數字。刪除游標所在的向下 n 行,例如 20dd 則是刪除 20 行 (常用) |
d1G | 刪除游標所在到第一行的所有資料 |
dG | 刪除游標所在到最後一行的所有資料 |
d$ | 刪除遊標所在處,到該行的最後一個字元 |
d0 | 那個是數字的 0 ,刪除遊標所在處,到該行的最前面一個字元 |
yy | 複製遊標所在的那一行(常用) |
nyy | n 為數字。複製游標所在的向下 n 行,例如 20yy 則是複製 20 行(常用) |
y1G | 複製遊標所在行到第一行的所有資料 |
yG | 複製遊標所在行到最後一行的所有資料 |
y0 | 複製游標所在的那個字元到該行行首的所有資料 |
y$ | 複製游標所在的那個字元到該行行尾的所有資料 |
p, P | p 為將已複製的資料在游標下一行貼上,P 則為貼在遊標上一行! 舉例來說,我目前游標在第 20 行,且已經複製了 10 行資料。則按下 p 後, 那 10 行資料會貼在原本的 20 行之後,亦即由 21 行開始貼。但如果是按下 P 呢? 那麼原本的第 20 行會被推到變成 30 行。 (常用) |
J | 將游標所在行與下一行的資料結合成同一行 |
c | 重複刪除多個數據,例如向下刪除 10 行,[ 10cj ] |
u | 復原前一個動作。(常用) |
[Ctrl]+r | 重做上一個動作。(常用) |
搜尋替換
/word | 向光標之下尋找一個名稱為 word 的字串。例如要在檔案內搜尋 vbird 這個字串,就輸入 /vbird 即可! (常用) |
?word | 向光標之上尋找一個字串名稱為 word 的字串。 |
n | 這個 n 是英文按鍵。代表重複前一個搜尋的動作。舉例來說, 如果剛剛我們執行 /vbird 去向下搜尋 vbird 這個字串,則按下 n 後,會向下繼續搜尋下一個名稱為 vbird 的字串。如果是執行 ?vbird 的話,那麼按下 n 則會向上繼續搜尋名稱為 vbird 的字串! |
N | 這個 N 是英文按鍵。與 n 剛好相反,為『反向』進行前一個搜尋動作。 例如 /vbird 後,按下 N 則表示『向上』搜尋 vbird 。 |
使用 /word 配合 n 及 N 是非常有幫助的!可以讓你重複的找到一些你搜尋的關鍵詞! | |
:n1,n2s/word1/word2/g | n1 與 n2 為數字。在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 !舉例來說,在 100 到 200 行之間搜尋 vbird 並取代為 VBIRD 則: 『:100,200s/vbird/VBIRD/g』。(常用) |
:1,$s/word1/word2/g或:%s/word1/word2/g | 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !(常用) |
:1,$s/word1/word2/gc或:%s/word1/word2/gc | 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !且在取代前顯示提示字元給使用者確認 (confirm) 是否需要取代!(常用) |
指令行的強制退出,儲存
:w | 將編輯的資料寫入硬碟檔案中(常用) |
:w! | 若檔案屬性為『只讀』時,強制寫入該檔案。不過,到底能不能寫入, 還是跟你對該檔案的檔案許可權有關啊! |
:q | 離開 vi (常用) |
:q! | 若曾修改過檔案,又不想儲存,使用 ! 為強制離開不儲存檔案。 |
注意一下啊,那個驚歎號 (!) 在 vi 當中,常常具有『強制』的意思~ | |
:wq | 儲存後離開,若為 :wq! 則為強制儲存後離開 (常用) |
ZZ | 這是大寫的 Z 喔!如果修改過,儲存當前檔案,然後退出!效果等同於(儲存並退出) |
ZQ | 不儲存,強制退出。效果等同於:q!。 |
:w [filename] | 將編輯的資料儲存成另一個檔案(類似另存新檔) |
:r [filename] | 在編輯的資料中,讀入另一個檔案的資料。亦即將 『filename』 這個檔案內容加到遊標所在行後面 |
:n1,n2 w [filename] | 將 n1 到 n2 的內容儲存成 filename 這個檔案。 |
:! command | 暫時離開 vi 到指令行模式下執行 command 的顯示結果!例如 『:! ls /home』即可在 vi 當中察看 /home 底下以 ls 輸出的檔案資訊! |
二、shell程式設計
變數名:
- 命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。
使用變數,先定義,使用時在變數前加上$即可
unset變數名:刪除變數
字串:
可以單引號也可雙引號
單引號字串的限制:
- 單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
- 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作為字串拼接使用。
str='this is a string'
雙引號的優點:
- 雙引號裡可以有變數
- 雙引號裡可以出現轉義字元
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
輸出:
Hello, I know you are "runoob"!
拼接字串:使用雙引號和單引號都可
your_name="runoob"
# 使用雙引號拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用單引號拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
輸出:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
獲取字串長度:
string="xlf"
echo ${#string} #輸出3
提取子字串
string="hello world"
echo ${string:1:4} #輸出ello
查詢子字串:查詢i或o的位置(那個先出現就計算那個)
string="hello world"
echo `expr index "$string" io` #輸出4
陣列:
array=(value1,value2,....)
讀取陣列
value=${array[0]}
@可獲取陣列中所有元素
echo ${array[@]}
獲取陣列長度
len=${#array[@]}
註釋:#和python的一樣
多行註釋
:<<EOF
註釋內容
註釋內容
EOF
傳參:
執行
運算子:
算數運算子:
+ | 加法 | `expr $a + $b` 結果為30。 |
- | 減法 | `expr $a - $b` 結果為 -10。 |
* | 乘法 | `expr $a \* $b` 結果為 200。 |
/ | 除法 | `expr $b / $a` 結果為2。 |
% | 取餘 | `expr $b % $a` 結果為0。 |
= | 賦值 | a=$b 將把變數 b 的值賦給 a。 |
== | 相等。用於比較兩個數字,相同則返回 true。 | [ $a == $b ] 返回false。 |
!= | 不相等。用於比較兩個數字,不相同則返回 true。 | [ $a != $b ] 返回 true。 |
條件表示式要放在方括號之間,並且要有空格,例如:[$a==$b]是錯誤的,必須寫成[ $a == $b ]。
其中在做乘法運算時,必須加入反斜槓
val=`expr$a\*$b`
echo"a * b :$val"
關係運算符
-eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回false。 |
-ne | 檢測兩個數是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 檢測左邊的數是否大於右邊的,如果是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 檢測左邊的數是否小於右邊的,如果是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 | [ $a -le $b ] 返回 true。 |
布林運算子
! | 非運算,表示式為 true 則返回 false,否則返回 true。 | [ ! false ] 返回 true。 |
-o | 或運算,有一個表示式為 true 則返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回true。 |
-a | 與運算,兩個表示式都為 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回false。 |
邏輯運算子:
&& | 邏輯的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 邏輯的 OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字串運算子
= | 檢測兩個字串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 檢測兩個字串是否相等,不相等返回 true。 | [ $a != $b ] 返回true。 |
-z | 檢測字串長度是否為0,為0返回 true。 | [ -z $a ] 返回 false。 |
-n | 檢測字串長度是否不為 0,不為 0 返回 true。 | [ -n "$a" ] 返回 true。 |
$ | 檢測字串是否為空,不為空返回 true。 | [ $a ] 返回true。 |
流程控制語句:
迴圈語句:
函式:
帶引數的函式:
以上就是本次個人對Linux知識點的回顧,同時也獻給我的好友wxz,這個linux的新手,祝他有所收穫。。。。。哈哈