1. 程式人生 > 實用技巧 >LInux回顧與Shell程式設計

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的新手,祝他有所收穫。。。。。哈哈