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中原有的內容,而是要在尾部追加即可。
壓縮和解壓
-
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。