1. 程式人生 > 其它 >Linux命令入門教程

Linux命令入門教程

Linux入門教程

ls 命令

  • ls -l 顯示當前目錄下的資料夾及檔案的詳細資訊(drwxr-xr-x d開頭的是資料夾,-rwxr-xr-x -開頭的是檔案)

    zhangsan@zhangsan-virtual-machine:~$ ls -l
    total 36
    drwxr-xr-x 2 zhangsan zhangsan 4096 8月  19 22:51 Desktop
    drwxr-xr-x 2 zhangsan zhangsan 4096 8月  19 22:51 Documents
    drwxr-xr-x 2 zhangsan zhangsan 4096 8月  19 22:51 Downloads
    drwxr-xr-x 2 zhangsan zhangsan 4096 8月  19 22:51 Music
    drwxr-xr-x 2 zhangsan zhangsan 4096 8月  19 22:51 Pictures
    drwxr-xr-x 2 zhangsan zhangsan 4096 8月  19 22:51 Public
    drwxr-xr-x 3 zhangsan zhangsan 4096 8月  19 22:53 snap
    drwxr-xr-x 2 zhangsan zhangsan 4096 8月  19 22:51 Templates
    drwxr-xr-x 2 zhangsan zhangsan 4096 8月  19 22:51 Videos
    

    4096 是檔案或資料夾的大小;8月 19 22:51 檔案或資料夾的建立時間。

  • ls 顯示當前目錄下的資料夾名及檔名(若存在),不顯示其它資訊。

clear 命令

  • clear 清空當前終端視窗的內容

cd 命令

  • cd .. 往前退一個目錄路徑(進入上層檔案目錄)

操作資料夾命令

  • mkdir tutorial/ 在當前目錄下建立資料夾 tutorial,/可有可無。

  • rmdir tutorial/ 刪除當前目錄下的 tutorial 檔案,/可有可無。

  • pwd 檢視當前檔案路徑。例如:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ pwd
    /home/zhangsan/Desktop
    

操作檔案命令

  • cp sydney.txt file2.txt 複製 sydney.txt 檔案,副本重新命名為 file2.txt

  • cat sydney.txt 檢視檔案 sydney.txt 的內容

  • diff file1.txt file2.txt 對比兩個檔案內容的差異

    file1.txt 內容:

    aa
    bb
    cc
    
    aa
    dd
    cc
    
    aa
    ee
    ff
    

    file2.txt 內容:

    aa
    
    cc
    
    aa
    bb
    cc
    
    aa
    cc
    gg
    

    命令執行結果:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ diff file1.txt file2.txt
    2c2
    < bb
    ---
    >
    6c6
    < dd
    ---
    > bb
    10,11c10,11
    < ee
    < ff
    ---
    > cc
    > gg
    

    有差異的行是2、6、10、11

  • head file1.txt -n 5 檢視檔案 file1.txt 前5行的內容;

    tail file1.txt -n 5 檢視檔案 file1.txt 最後5行的內容。

  • wc file1.txt 檢視檔案 file1.txt 單詞數(wc是word count的縮寫。我們以題號9的file1檔案內容為例)

    zhangsan@zhangsan-virtual-machine:~/Desktop$ wc file1.txt
    11  9 29 file1.txt
    

    11 9 29 表示 file1.txt 一共有11行,9個單詞,29個字元。

  • wc -l file1.txt 只統計file1.txt有多少行

    zhangsan@zhangsan-virtual-machine:~/Desktop$ wc -l file1.txt
    11 file1.txt
    
  • wc -c file1.txt 只統計file1.txt的大小(有多少個字元)

    zhangsan@zhangsan-virtual-machine:~/Desktop$ wc -c file1.txt
    29 file1.txt
    
  • rm file1.txt 刪除檔案file1.txt

  • mv file1.txt helloword.txt 將檔案file1.txt重新命名為helloword.txt;

    mv file1.txt Tutorial/ 將檔案file1.txt移動到Tutorial資料夾下(/可加可不加)。

檢視系統時間命令

  • date 檢視系統時間

    zhangsan@zhangsan-virtual-machine:~$ date
    2020年 09月 17日 星期四 11:57:42 CST
    
  • cal 列印本月日曆

    zhangsan@zhangsan-virtual-machine:~$ cal
          九月 2020
    日 一 二 三 四 五 六
           1  2  3  4  5
     6  7  8  9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30
    
    
  • cal 2020 列印2020年全年日曆

  • cal 1 2020 列印2020年1月份日曆

less more 命令

  • less Main.java 當Main.java檔案的內容在終端不能全部顯示時,可以使用less命令,配合鍵盤上下左右方向鍵即可。推出按鍵盤字母q即可。
  • more Main.java 類似less,可以自己測試。

chmod 命令

zhangsan@zhangsan-virtual-machine:~/Desktop$ ls -l
total 12
-rw-r--r-- 1 zhangsan zhangsan   27 9月  17 10:51 file2.txt
-rw-r--r-- 1 zhangsan zhangsan  886 9月  15 16:56 Main.java
drwxrwxr-x 2 zhangsan zhangsan 4096 9月  17 12:10 Tutorial

我們看到當前使用者zhangsan有讀Main.java檔案的許可權。

型別 user(作者) group(小組) other(其他)
-表示檔案;d表示資料夾 rwx rwx rwx
  • chmod u-r Main.java 去掉當前使用者讀Main.java檔案內容的許可權(若有)

    zhangsan@zhangsan-virtual-machine:~/Desktop$ ls -l
    total 12
    -rw-r--r-- 1 zhangsan zhangsan   27 9月  17 10:51 file2.txt
    -rw-r--r-- 1 zhangsan zhangsan  886 9月  15 16:56 Main.java
    drwxrwxr-x 2 zhangsan zhangsan 4096 9月  17 12:10 Tutorial
    zhangsan@zhangsan-virtual-machine:~/Desktop$ chmod u-r Main.java
    zhangsan@zhangsan-virtual-machine:~/Desktop$ ls -l
    total 12
    -rw-r--r-- 1 zhangsan zhangsan   27 9月  17 10:51 file2.txt
    --w-r--r-- 1 zhangsan zhangsan  886 9月  15 16:56 Main.java
    drwxrwxr-x 2 zhangsan zhangsan 4096 9月  17 12:10 Tutorial
    zhangsan@zhangsan-virtual-machine:~/Desktop$ cat Main.java
    cat: Main.java: Permission denied
    

    執行完修改許可權命令後,使用者再次嘗試讀取Main.java檔案內容,系統提示沒有許可權。

  • chmod u+r Main.java 可以把讀許可權加回來。

  • chmod go-r Main.java 除了zhangsan使用者(作者)外,其他人都沒有讀Main.java檔案的許可權。

  • 當然也可用二進位制數修改u、g、o的許可權。比如:chmod 444 Main.java 等價於把檔案Main.java的許可權修改為:r--r--r--

grep 命令

  • grep new Main.java 檢視Main.java檔案是否包含new這個字串。如下:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ grep void Main.java
        public static void main(String[] args) throws IOException {
    zhangsan@zhangsan-virtual-machine:~/Desktop$ grep new Main.java
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            File f = new File("/Users/zhangsan/Desktop/aa");
        private static int[] a = new int[N];
        private static int[] b = new int[N];
        private static int[][] f = new int[N][N];
    

    注:new字串會標紅高亮顯示。

  • grep ^H sydney.txt 找出所有以H開頭的字串。

  • grep ^Ho sydney.txt 找出所有以Ho開頭的字串。還有很多,可以檢視正則表示式。

  • grep ^Ho sydney.txt | wc 找出所有以Ho開頭的字串並統計。這裡是搭配的 wc ,你也可以使用其它命令,記得用 | 分割即可。

編寫指令碼

一些Linux命令或者其它一些命令,我們把它們寫到一起,打包成一個檔案,這個檔案就是Linux指令碼檔案。Linux指令碼檔案以.sh字尾結尾。

  • > < 大於小於號是Linux的重定向符號

  • 例項演示:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ ls
    file2.txt  Main.java  Tutorial
    zhangsan@zhangsan-virtual-machine:~/Desktop$ ls > 1.txt
    zhangsan@zhangsan-virtual-machine:~/Desktop$ ls
    1.txt  file2.txt  Main.java  Tutorial
    zhangsan@zhangsan-virtual-machine:~/Desktop$ cat 1.txt
    1.txt
    file2.txt
    Main.java
    Tutorial
    
  • 建立指令碼檔案 vim test.sh,寫入以下內容:

    ls
    cal
    date
    

    執行指令碼命令 sh test.sh

    zhangsan@zhangsan-virtual-machine:~/Desktop$ ls
    test.sh  Tutorial
    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    test.sh  Tutorial
          九月 2020
    日 一 二 三 四 五 六
           1  2  3  4  5
     6  7  8  9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30
    
    2020年 09月 17日 星期四 13:02:50 CST
    
  • 列印變數和字串。test.sh指令碼檔案中我們寫入以下內容:

    a=10
    echo $a
    
    echo "hello world"    $a
    

    注意a=10等於號前後不能有空格;空行不輸出,"hello world"$a之間若有超過一個空格,只輸出一個空格。字串"hello world"的雙引號可以省略不寫,不過為了易讀建議加雙引號。

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    10
    hello world 10
    
  • 計算。test.sh指令碼檔案中我們寫入以下內容:

    a=10
    b=3
    c=`expr $a + $b`
    echo $c
    d=`expr $a \* $b`
    echo $d
    

    注意Linux指令碼語言中*號的含義與正則表示式保持一致,若要實現乘法,需要加轉義字元\。另外想要輸出()也需要轉義,即\(\)。再次強調,賦值運算子=左右兩邊一定不能寫空格;+等運算子左右兩邊一定要寫空格。

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    13
    30
    
  • 控制語句。

    等於 不等於 大於 大於等於 小於 小於等於
    -eq -ne -gt -ge -lt -le
    equal not equal greater than greater equal less than less equal

    test.sh指令碼檔案中我們寫入以下內容(輸出a和b中較大的那個):

    a=10
    b=3
    if [ $a -gt $b ]
    then
    	echo $a
    else
    	echo $b
    fi
    

    注意[ $a -gt $b ]之間一定要有空格。執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    10
    
  • for 迴圈。test.sh指令碼檔案中我們寫入以下內容:

    #輸出數字1~10
    for x in 1 2 3 4 5 6 7 8 9 10
    do
    	echo $x
    done
    

    注意Linux指令碼語言中#號後邊的內容是註釋。

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
  • while 迴圈。test.sh指令碼檔案中我們寫入以下內容:

    #輸出數字1~10
    x=1
    while [ $x -le 10 ]
    do
    	echo $x
    	x=`expr $x + 1`
    done
    

    注意Linux指令碼語言中#號後邊的內容是註釋。

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
  • 前面我們介紹了定義變數。現在我們再來介紹怎麼定義字串。test.sh指令碼檔案中我們寫入以下內容:

    a="hello"
    b="world"
    
    #兩個單詞獨立成行
    echo $a
    echo $b
    
    #兩個單詞顯示在一行
    echo $a $b
    

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    hello
    world
    hello world
    
  • 與使用者進行互動。test.sh指令碼檔案中我們寫入以下內容:

    echo "Please enter a:"
    read a
    
    echo "Please enter b:"
    read b
    
    c=`expr $a + $b`
    echo $a + $b = $c
    

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    Please enter a:
    3
    Please enter b:
    5
    3 + 5 = 8
    
  • shell指令碼語言中,比較兩個字串=!=。test.sh指令碼檔案中我們寫入以下內容:

    password="hello123"
    
    echo "Please enter a password:"
    read userPassword
    
    if [ $password = $userPassword ]
    then
    	echo "密碼正確"
    else
    	echo "密碼錯誤"
    fi
    

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    Please enter a password:
    nicai
    密碼錯誤
    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    Please enter a password:
    hello123
    密碼正確
    
  • 字串拼接和判空。-z 字串空返回真,否則返回假;-n字串非空返回真,否則返回假。test.sh指令碼檔案中我們寫入以下內容:

    str1="hello"
    str2="world"
    str3=""
    
    echo "$str1 $str2"	#字串拼接
    
    if [ -z $str3 ]
    then
    	echo "str3 是空的"
    else
    	echo "str3 不是空的"
    fi
    

    z是zero的縮寫;n是not zero的縮寫。執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    hello world
    str3 是空的
    
  • 陣列。test.sh指令碼檔案中我們寫入以下內容:

    arr=(7 8 9 10)
    echo ${arr[1]}	#列印陣列的單個元素
    

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh
    test.sh: 1: Syntax error: "(" unexpected
    

    報錯。sh是最傳統的指令碼語言處理程式,1979年有過一次升級,如果你的指令碼程式碼中有使用陣列,使用bash來執行指令碼。

    zhangsan@zhangsan-virtual-machine:~/Desktop$ bash test.sh
    8
    

    那如何遍歷陣列元素呢?修改上邊的test.sh指令碼檔案為:

    arr=(7 8 9 10)
    
    for i in ${arr[@]}
    do
    	echo $i
    done
    

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ bash test.sh
    7
    8
    9
    10
    

    進一步我們來求陣列和。修改上邊的test.sh指令碼檔案為:

    arr=(7 8 9 10)
    
    sum=0
    for i in ${arr[@]}
    do
    	sum=`expr $sum + $i`
    done
    
    echo $sum
    

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ bash test.sh
    34
    

    進一步我們求最大值。修改上邊的test.sh指令碼檔案為:

    arr=(7 8 9 10)
    
    max=${arr[0]}
    for i in ${arr[@]}
    do
    	if [ $i -gt $max ]
    	then
    		max=$i
    	fi
    done
    
    echo $max
    

    執行上邊的指令碼:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ bash test.sh
    10
    
  • Linux指令碼語句也拆分直接在終端執行。例如:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ a=10
    zhangsan@zhangsan-virtual-machine:~/Desktop$ echo $a
    10
    

Linux中的全域性變數

  • USER 記錄當前登陸系統的使用者的使用者名稱。

    zhangsan@zhangsan-virtual-machine:~/Desktop$ echo $USER
    zhangsan
    
  • HOME 當前使用者的主目錄。

    zhangsan@zhangsan-virtual-machine:~/Desktop$ echo $HOME
    /home/zhangsan
    zhangsan@zhangsan-virtual-machine:~/Desktop$ echo ~ #等價寫法
    /home/zhangsan
    

    進入使用者的主目錄。方法如下:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ cd $HOME
    zhangsan@zhangsan-virtual-machine:~$
    zhangsan@zhangsan-virtual-machine:~/Desktop$ cd ~ #等價寫法
    zhangsan@zhangsan-virtual-machine:~$
    

Linux中的環境變數PATH

zhangsan@zhangsan-virtual-machine:~/Desktop$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

例如我們在Desktop資料夾(/home/zhangsan/Desktop)下建立C檔案example.c,寫入以下內容:

#include <stdio.h>

int main() {
	printf("Hello World\n");
	return 0;
}

gcc編譯執行:

zhangsan@zhangsan-virtual-machine:~/Desktop$ gcc example.c -o example
zhangsan@zhangsan-virtual-machine:~/Desktop$ ls
example  example.c  Tutorial
zhangsan@zhangsan-virtual-machine:~/Desktop$ ./example
Hello World

若我們換到其它路徑下,再執行編譯好的example程式:

zhangsan@zhangsan-virtual-machine:~/Desktop$ cd .. #返回到上級目錄
zhangsan@zhangsan-virtual-machine:~/Desktop$ example
bash: example: command not found

因為當前路徑是/home/zhangsan

zhangsan@zhangsan-virtual-machine:~$ pwd
/home/zhangsan

不是example所在目錄/home/zhangsan/Desktop。那麼如果我想在當前路徑不是/home/zhangsan/Desktop路徑情況下的任意路徑都能執行example。我們只需要將example所在的路徑/home/zhangsan/Desktop放到PATH這個變數裡面

zhangsan@zhangsan-virtual-machine:~/Desktop$ PATH=$PATH:/home/zhangsan/Desktop #PATH尾部追加":/home/zhangsan/Desktop"
zhangsan@zhangsan-virtual-machine:~/Desktop$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/zhangsan/Desktop
zhangsan@zhangsan-virtual-machine:~/Desktop$ cd .. #返回到上級目錄
zhangsan@zhangsan-virtual-machine:~$ example
Hello World

多個路徑用冒號:分割(windows用分號;)。意思是這些路徑下的檔案在任意路徑下都能執行。注意給PATH賦值不要寫成PATH=/home/zhangsan/Desktop,這樣會覆蓋PATH中原有的內容,而是要在尾部追加即可。

Linux環境變數總結

壓縮和解壓

  • zip CProgram.zip *將當前資料夾壓縮(首先進入要壓縮的資料夾)。例如,我們這裡要壓縮Tutorial資料夾:

    zhangsan@zhangsan-virtual-machine:~/Desktop$ ls
    example  example.c  Tutorial
    zhangsan@zhangsan-virtual-machine:~/Desktop$ cd Tutorial/
    zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ ls
    file1.txt #Tutorial資料夾下只有一個檔案,沒有資料夾
    zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ zip CProgram.zip *
      adding: file1.txt (deflated 17%)
    zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ ls
    CProgram.zip  file1.txt
    

    另外一種Linux裡的壓縮格式是tar,有些地方也叫tar.gz。使用tar壓縮命令為(功能同上):

    zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ ls
    file1.txt
    zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ tar -zcvf CProgram.tar.gz ./
    ./
    ./file1.txt
    ./CProgram.tar.gz
    tar: .: file changed as we read it
    zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ ls
    CProgram.tar.gz  file1.txt
    
    • -z : Compress archive using gzip program(使用gzip壓縮演算法進行壓縮);
    • -c : Create archive(建立目標。解壓時替換c為x即可);
    • -v : Verbose i.e display progress while creating archive(顯示壓縮過程);
    • -f : Archive File name(重新命名壓縮檔案,即可以給壓縮檔案起一個名字)。
  • zip CProgram.zip -r Tutorial/* 將當前資料夾Tutorial及其子資料夾壓縮為CProgram.zip。

  • unzip CProgram.zip 解壓CProgram.zip;

    tar -zxvf CProgram.tar.gz 解壓CProgram.tar.gz(-x : Extract files)。

  • wget https://xxx/download/file.tar.gz 從網址下載file.tar.gz壓縮檔案;

    wget https://xxx/download/file.tar.gz -O file2.tar.gz 從網址下載file.tar.gz壓縮檔案並重命名為file2.tar.gz。大寫字母O。