首先需要知道什麼是shell?如果將Linux內核當作一個地球的核心,那麼shell就是地殼。shell本身也是一個應用程序,爲我們提供了使用系統的接口。shell程序有很多種,目前主流發行版大多數默認使用bash,其次還有sh,tcsh,csh,fish等,其程序存儲在/etc/shells目錄下。
由於目前最常用的bash,所以就以bash爲例來說一說bash的基礎特性,偷偷說一句,其實我也是個新手,其他的shell並未接觸,不敢輕易去說,當然本文中難免有錯誤,還請各位不吝賜教,讓大家共同進步。
bash的基礎特性之:命令歷史
history命令:記錄當前用戶的使用過的命令的歷史記錄。可通過手動設置環境變量來定製 history的功能;
HISTSIZE:shell進程可保留的命令歷史的條數,默認是1000條。
HISTFILE:持久保存命令歷史的文件,其路徑在每個用戶的家目錄下面的.bash_history裏面。
HISTFILESIZE:設置~ USERNAME/.bash_history保存的命令的條數,默認是1000條。
HISTCONTROL:控制命令歷史記錄的方式,有三種方式:
1.ignordeups:忽略重複的命令
2.ignorespace:忽略以空白字符開頭的命令
3.ifnoreboth:以上兩者同時生效
其命令的用法爲:
~]# history [option] history -anrw [FILENAME] history -ps [參數][參數...]
其option主要有以下幾種:
-c 清空命令歷史記錄
-d offset(偏移量) 刪除指定命令歷史記錄
-r 從文件讀取命令歷史記錄到歷史列表中
-w 把歷史列表中的命令追加到歷史文件中
history # 查看指定的第#條歷史命令
調用命令歷史列表中的命令:
!# 再次執行第#條命令
!! 再次執行上一條命令
!STRING 再次執行最近一個以STRING開頭的命令
調用上一條命令的最後一個參數:
快捷鍵:先按ESC鍵後,在按.鍵
也可以直接輸入:!$調用上一條命令的參數
bash的基礎特性之:
命令補全:shell程序在接收到用戶執行命令的請求,分析完成之後,最左側的字符串會被當作 命令處理機制:先查找shell內嵌命令,如果沒有則根據PATH環境變量中設定的目錄,從左到右逐 個搜索目錄下的文件名,直到給定的打頭字符串能夠唯一標識某命令程序文件,則按一次tab鍵補 全;若僅不能唯一標識,則按兩次tab鍵列出命令列表;否則無反應。
路徑補全:根據給定的起始路徑,以對應的路徑下的打頭字符串來逐一匹配起始路徑下的每個 個文件,該打頭字符串能夠唯一標識,則按一次tab鍵直接補全,如果僅不能唯一標識,則給出所 有符合條件的命令列表,否則無反應。
這裏介紹兩個目錄管理類的命令:mkdir和rmdir
mkdir:創建目錄,其格式爲:
mkdir [OPTIONS] ... DIRECTORY
OPTINOS主要有以下幾種:
-p 自動按需創建目錄,如果上級目錄不存在會自動創建。
-v verbose,顯示創建的詳細過程。
-m MODE 創建目錄時直接給定權限,否則默認權限。
rmdir:刪除目錄,其格式爲:
rmdir [OPTIONS] ...DIRECTORY...
-p 刪除目錄後,如果目錄爲空,則一般刪除,直到父目錄不爲空爲止,危險慎 用。
-v verbose,顯示刪除的詳細過程。
bash基礎特性之:命令hash
前面說到命令補全機制,Linux在每次搜索命令都是需要消耗一定的時間的,雖然每次進行的時
間很短,但是積少成多,因此就有了hash表,來緩存此前 使用過的命令。
hash主要命令:
hash ;列出
hash -d COMMAND 刪除
hash -r 清空
bash基礎特性之:命令行展開
~ USERNAME:自動展開用戶家目錄,或指定的用戶的家目錄.
{}:可承載一個以逗號分隔符的路徑列表,並能夠將其展開爲多個路徑,例如/tmp/{a,b}相 當於/tmp/a /tmp/b。
這裏介紹一個查看目錄結構的命令:tree命令
tree [OPTIONS] [DIRECTORY]
-L level指要顯示的目錄的層級
bash的基礎特性之:命令的執行狀態結果
bash通過狀態返回值來輸出此結果,成功爲0,失敗爲1-255,可以通過$?命令來查看上一命令 的狀態返回值,進而確定命令的執行狀態結果。
引用命令的執行結構有兩種方式:$(COMMAND)或者`COMMAND`.
bash的基礎特性之:引用
強引用:''變量引用不能被替換
若引用:""變量引用可以被替換
命令引用:``
bash的基礎特性之:快捷鍵
Ctrl+a:跳轉至命令行的行首
Ctrl+e:跳轉至命令行的行尾
Ctrl+u:刪除行首至光標所在處之間的字符
Ctrl+k:刪除光標所在處到行尾之間的字符
Ctrl+l:清屏
bash的基礎特性之:文件名通配globbing
*:表示匹配任意長度的任意字符的,例如p*表示所有p開頭的字符
?:表示匹配單個任意字符,例如p?表示p開頭的所有兩個字符
[]:匹配指定範圍內的任意單個字符,有幾種特殊格式:
[a-z]、[A-Z]、[a-z0-9]不區分大小寫
[[:upper:]]表示所有的大寫字母
[[:lower:]]表示所有的小寫字母
[[:alpha:]]表示所有的字母
[[:digit:]]表示所有的數字
[[:almun:]]表示所有的字母和數字
[[:space:]]表示所有的空白字符
[[:punct:]]表示所有的標點符號
[^]表示匹配指定範圍外的任意字符
例如[^0-9]表示除0-9以外的任意字符
bash的基礎特性之:IO重定向及管道
可用的輸入的設備:文件(對Linux而言,一切皆文件)包括鍵盤設備,文件系統上的
常規文件,網卡等。
可用的輸出的設備:文件,包括顯示器,文件系統上的常規文件,網卡等。
程序的數據流有三種:
輸入的數據流:標準輸入(stdin),標準設備是鍵盤
輸出的數據流:標準輸出(stdout),標準設備是顯示器
錯誤輸出流:錯誤輸出(stderr),標準設備是顯示器
fd:file derscriptor,文件描述符:
標準輸入:0
標準輸出:1
錯誤輸出:2
IO重定向:
輸出重定向:>,覆蓋輸出,直接覆蓋原文件,例:cat /etc/issue > /dev/sda 此命令非 常危險,可能會幹掉硬盤,在dev設備文件下進行操作時一定要注意。
輸出重定向:>>,追加輸出,在文件的尾部新增。
這裏可以使用set命令來設置或撤銷選項的值或位置參數,set -C:禁止覆蓋輸出至已存在
的文件,此時可以使用>|強制覆蓋輸出。set +C:關閉上述特性。
錯誤輸出流重定向:2>,2>>
合併正常輸出流和錯誤輸出流有兩種方式:1、&>,&>>,2、COMMAND > /PATH/TO/SOMEFILE 2&>1或者COMMAND >> /PATH/TO/SOMEFILE 2&>1。
tr命令:
tr [options]...SET1 [SET2]
說明:把輸入的數據當中的字符,範式在SET1定義範圍類出現的,通通對位轉換
爲SET2出現的字符。
用法一:tr SET1 SET2 </PATH/FROM/COMEFILE
tr [a-z] [A-Z] < /etc/issue
用法二:tr -d < /PATH/PROM/SOMEFILE
<<:here document此處創建文檔
cat << EOF 內容 EOF
cat > /PATH/TO/SOMEFILE <<EOF 內容 EOF
管道:連接程序,實現將前一個命令的輸出直接定向後一個程序當作輸入數據流
COMMAND1 | COMMAND2 |COMMAND3
這裏有一個不得不說的命令:tee
COMMAND1 | tee /PATH/TO/SOMEFILE | COMMAND2
Linux的重要哲學思想之一:組合小程序,完成複雜的任務。
bash基礎特性之:變量
我們說程序是由指令+數據組成,這裏的指令是由程序文件提供,數據由IO設備、文件、管道、 變量等提供,我們也說程序是由算法及其算法所決定的數據結構組成。不管哪種方式,都離不開
數據,但是在程序中,數據是不可能一成不變的,這就有了變量。什麼是變量名呢?變量名就是
指向內存空間的某段起始位置。
變量賦值:name=value
變量類型:存儲格式、表示數據範圍以及能夠參與的運算
編程語言:
強類型編程:嚴格定義了數據的類型,並且要事先聲明,有的編程語言還要事先
賦值。如C,JAVA
弱類型編程:不用嚴格區分數據類型,bash
bash把所有的字符串統統視爲字符型,在進行運算時自動轉換成數值型,不
支持浮點數,除非進行外在工具。
bash中的變量無需事先聲明,相當於把聲明和賦值過程同時實現。
變量替換:把變量名出現的位置替換爲其所指向的內存空間的數據。
變量引用:${var_name} ,$var_name
變量名:只能包含數字,字母和下劃線且不能以數字開頭,變量名的命名法則:見名知意
命名機制遵循某種法則,不能使用程序的保留字符if,while,else...
bash的變量類型:
本地變量:作用域爲當前shell;
變量賦值:name=value
變量的引用:${name},$name
查看變量:set命令
撤銷變量:unset name;此處非變量引用,不用加$
環境變量:作用域爲當前shell及其子shell進程;
變量賦值:export name=value
或 declare -x name=value
變量引用:${name},$name
bash內嵌了許多環境變量,通常爲大寫字符,用於定義bash的工作環境,如
PAHT,HISTSIZE,HISTFILESIZE,HISTFILE,HISTCONTROL,SHELL,HOME,UID,PWD,
OLDPWD...
查看環境變量:export或declare -x或printenv或env
撤銷環境變量:unset name
局部變量:作用域僅爲某代碼片段(函數上下文)
特殊變量:shell內置的有特殊功用的變量。
只讀變量:1、declare -r name 或readonly name只讀變量無法重新賦值,並且
不能撤銷,存活時間爲當前shell進程生命週期,shell進程的終止
而終止。
bash特性之多命令執行:
~]# COMMAND1;COMMAND2;COMMAND3;...
邏輯運算:
運算數:真(true,yes,on,1)
假(false,no,off,0)
與:
1&&1=1
1&&0=0
0&&1=0
0&&0=0
或
1||1=1
1||0=1
0||1=1
0||0=0
非
!0=1
!1=0
短路法則:
~]# COMMAND1 && COMMAND2
COMMAND1爲"假",則COMMAND2不會執行
否則,COMMAND1爲“真”,則COMMAND2必須執行
~]# COMMAND1 || COMMAND2
COMMAND1爲“真”,則COMMAND2不執行,否則
COMMAND1爲“假”,則COMMAND2必須執行
示例:id $username || useradd $username