命令行
(1) $符號在命令中表示引用變量,可以export設置變量。
例如查看環境變量命令:echo $PATH
此處就是通過$引用PATH變量(這是個全局變量)
例如:
d
當我們直接敲一個命令的時候,bash就去PATH變量記載的路徑中尋找該程序。如果想運行一個自己安裝的二進制程序,則需要先加上該命令所在的路徑。
(2) man 命令
Man命令時專門解釋其他命令的命令
2. 這樣使用shell
2.1 理解目錄結構
可以通過Ctrl + Alt + F1打開終端,Ctrl + Alt + F7再回到圖形界面
2.2 翻舊帳-history命令
如果想查看很久之前輸入過的命令,可以用該命令查看。默認情況下顯示前1000條命令。也可以指定要顯示的命令條數
history N
注:history命令並不像ls命令那樣是一個獨立的命令,它是一個bash的關鍵字,也就時說history命令只在特定版本的bash上有用。
2.3 more or less——命令的分頁顯示
[more]
More是一個用來閱讀文本的命令,它有分頁的功能。他可以從文件或者獲取的數據流中先顯示一屏,等用戶按下回車鍵的時候再顯示下一屏,直到顯示完。當然也可以不等顯示完直接按q推出。例如查看當前運行的所有進程:
ps -A | more
注意:上述命令中有一個"|"符號。該符號稱為管道符,這個符號的意思就是把前一個命令的輸出內容交給後一個命令,作為後一個命令的數據輸入。上述命令就是把ps -A輸出的那一堆字符交給more命令,然後more命令在處理之後按屏幕顯示給用戶。
[less]
less和more命令實現的功能基本一致,只不過less命令比more命令要強大一些。對於more命令之前看過的東西時不能回頭再去看得,只能往下翻頁去看,知道看完之後自動退出。而less命令可以用上下箭頭來翻閱,並且看完之後是不會自動推出的,一定要按q鍵退出。
注意:著兩個命令都可以直接查看文件
less /文件路徑/文件名
2.4 通配符
linux使用"*"來代表任意個字符,"?"代表任意一個字符。
3. shell編程
3.1 把命令行打包執行
場景:
把一張SD卡插進電腦,然後運行mount命令進行掛載:
sudo mout /dev/sdb1 /mnt/
然後把裡面的所有照片拷貝進來
cp /mnt/*.jpg /home/zhanglu/Picture
之後把這些照片壓縮放在同一個目錄備份:
tar -czvf /home/zhanglu/Backup/pic.tar.gz /mnt/*.jpg
備份完了之後把卡裡的文件全部刪除:
rm /mnt/*.jpg
最後卸載這個SD卡:
sudo umount /mnt/
如上,每次在拷貝照片的時候都要輸入上述好幾條命令,比較麻煩,有沒有比較簡單的批處理方法呢?
【高級批處理——shell腳本】
要寫個shell腳本很簡單,找個編輯器把上述命令按照順序拷貝進去保就OK。於是我們寫一個這樣的文件:
sudo mout /dev/sdb1 /mnt/
cp /mnt/*.jpg /home/zhanglu/Picture
tar -czvf /home/zhanglu/Backup/pic.tar.gz /mnt/*.jpg
rm /mnt/*.jpg
sudo umount /mnt/
然後保存起來隨便取個名字:dailybackup.sh。到目前為止這個腳本還不能運行,因為我們還沒有賦予他可以運行的權限,執行下面命令賦予可運行權限:
chmod +x ./dailybackup.sh
這時候腳本就可以運行了。
注意:shell腳本不要求特定的擴展名,只要是文本文件並且擁有可執行權限就OK.但是我們一般還是以sh結尾。
【靈活的shell腳本】
腳本是完成了,但是比較蛋疼的是我每天打包備份的文件名可能不一樣,但是腳本中的寫死了。這時候就需要修改一下腳本。
sudo mout /dev/sdb1 /mnt/
cp /mnt/*.jpg /home/zhanglu/Picture
tar -czvf /home/zhanglu/Backup/pic`date %Y%m%d`.tar.gz /mnt/*.jpg
rm /mnt/*.jpg
sudo umount /mnt/
這回腳本中使用了"`"符號,"`"符號的意思是:先執行兩個"`"之間的命令,用執行後的輸出代替兩個"`"之間的內容哦能否,包括"`"本身。
注意:這裡的"`"不是單引號" ' ",而是鍵盤上和"~"位於同一個鍵的反引號。
上述腳本中的兩個反引號的作用就是以年月日的格式打印當前時間。
3.2 規范的shell腳本
(1)要有必要的注釋,shell腳本中使用"#"作為注釋的開頭
(2)指明使用的shell
有時候可以看到一個shell腳本的開頭是這樣的:
#! /bin/bash
"#!"放在一起並且還出現在腳本的第一行那就不是注釋啦!這一行的意思時運行這個腳本所需要的shell。
我們linux系統中有很多的shell,比如bash,tcsh,ksh等。這些不同的shell他們的語法以及特性大多時不一樣的。因此在運行腳本的時候需要指定用哪個shell。
當然你也可以不加這一樣代碼,這時候你就要告訴系統你用的時那個shell,例如用bash運行,需要下面的命令:
bash ./dailybackup.sh
3.3 使用函數
Shell腳本像大多數編程語言一樣,也支持函數。如果有一段代碼需要在腳本裡面反復執行多次,不必反復的寫多份,只需要將他們寫成一個函數,需要的時候直接調用就行。比如自動備份的腳本:
#!/bin/bash
#自動備份腳本
dailybackup() {
udo mout /dev/sdb1 /mnt/
cp /mnt/*.jpg /home/zhanglu/Picture
tar -czvf /home/zhanglu/Backup/pic`date %Y%m%d`.tar.gz /mnt/*.jpg
rm /mnt/*.jpg
sudo umount /mnt/
}
dailybackup #調用函數的時候不許要寫小括號
3.4 在shell腳本中使用變量
(1)用戶變量——新手拈來
Shell中的變量比較隨意簡單,不必聲明,隨用隨寫,如下:
value = 28
這就獲得了一個內容是28的變量,那麼怎麼引用這個變量呢?在引用變量的時候需要在變量名稱前面加上"$"符號,用來表示這是一個變量。例如:
#! /bin/bash
value = 28
echo value #輸出value
echo $ value #輸出28
所以在使用變量的時候前面一定要加上"$",否則就會被當作一般的字符串處理的。
不過有時候變量的引用可能會緊跟著字符串,這時候需要進行特殊處理:
#! /bin/bash
word1 = hello
word2 = world
echo word1BIGword2
這時候輸出的是 helloworld,而不是helloBIGworld。因為系統把$word1BIG當作一個變量的引用了,然而我們根本沒有這個變量,因此就會打印空白。如果想讓shell理解我們的意圖這時候我們可以加上大括號
echo word1BIG{word2}
(2)變量類型——只有字符串
在shell腳本中沒有整型,浮點型等其他的數據類型,僅僅有字符串。如果要進行數字的數學運算需要使用expr命令
num=1
num=`expr $num + 2`
(3)環境變量——在哪兒都能用
上面咱們定義的變量是用戶變量,除了自己定義的用戶變量之外還有一種變量就是系統變量。比如之前見到的PATH,和HOME變量。
所謂的環境變量有點類似C語言中的全局變量,就是在整個系統中都有效。用戶變量就是只在一個腳本中有效。在其他的腳本中無法訪問。而系統變量可以在任何地方訪問。想要定義一個全局變量也很簡單,只要在變量前面加上export:
提示:環境變量在當前會話結束後失效
(4)特殊變量——一堆符號
除了用戶變量和系統變量外還有其他一些比較特殊的變量,這些特殊變量有以下特征:
看著就比較特殊
腳本執行時自動被設定
不可修改
特殊變量主要就下面這些
$n——這裡n時一個0~9的數字。這個變量代表了執行腳本所加的第n個參數,n=0代表代表腳本本身的名稱
$*——這個變量代表執行腳本所加的所有的參數(不包括腳本名稱本身)
$#——執行腳本所加的變量個數
$$——該腳本的PID
3.5 shell中的條件判斷
(1)if和fi