爲什麼學習shell:不同固定distribution中的shell都是一樣的;遠程管理中,命令行界面比較快;管理系統很方便
我們常用的一類shell爲Bourne Again SHell (bash).
支持的shell記錄在/etc/shells文件中
登陸取得的shell記錄在/etc/passwd文件中,不同的用戶所取得的shell是不一樣的。root一般爲bash。
history命令,可以查詢曾經執行過的命令
~/.bash_history中記錄了前一次登陸以前所執行過的命令,至於這一次登陸所執行的命令都被暫存在臨時內存中,當你成功註銷系統後,該命令纔會記錄到.bash_history中。但無法記錄時間
[tab]接在一串命令的第一個字後面,則爲命令補全;
[tab]接在一串命令的第二個字後面,則爲文件不全;
命名別名設置功能(alias):在命令行中輸入alias,既可以知道當前的命名別名有哪些,也可以直接執行命令來設置命名別名,例如alias lm='ls -al'
取消命令別名:unalias lm
通配符:例如ls -l /usr/bin/X* 該目錄下查找以X開頭的文件
如果命令行太長,可以利用反斜槓\來進行換行,其實是一個轉義[\enter],中間沒有空格。
echo,變量的顯示,需在變量前加上$符號,echo $variable,如echo $PATH或echo ${PATH}也可以
設置變量的內容:變量名=內容 即可
等號兩邊若有空格,需要用雙引號或單引號括起來,雙引號保留了原本的特性,單引號裏面爲一般字符(純文本)
變量名開頭不能爲數字
爲變量增加內容:如PATH="$PATH":/home/bin
若該變量需要在其他子進程執行,則需要以export來使變量稱爲環境變量; export PATH
通常大寫字符爲系統默認變量,自行設置變量可以使用小寫字符
取消變量:unset 變量名稱,如unset myname
#bash進入子進程。這裏的子進程是在目前這個shell的情況下,去打開另一個新的shell,新的shell就是子進程。一般的狀態下,父進程的自定義變量是無法再子進程內使用的,但通過export將變量編程環境變量後,就能夠在子進程下使用了。
反單引號(`)之內的命令將會被先執行,而其執行出來的結果將作爲外部的輸入信息。
env 查看環境變量。它是environment的縮寫
- HOME 用戶的主文件夾cd ~
- SHELL 使用的shell是哪個程序,默認/bin/bash
- HISTSIZE 記錄歷史命令的條數設置
- MAIL 在收信時系統會去讀取郵箱文件
- PATH 執行文件查找的路徑,目錄順序也很重要
- LANG 語系數據。一般中文編碼爲zh_CN.UTF-8
- RANDOM "隨機數"的變量。隨機數生成器即/dev/random文件,可以挺過這個隨機數文件相關的變量($RANDOM)來隨機取得隨機數值。BASH下,它的範圍是0~32767。如果要去0~9之間的數值,利用declare:declare -i number=$RAMDOM*10/32768 ; echo $number
set 查看所有變量(包括環境變量與自定義變量)
$ 本身也是個變量,表示本shell的PID,echo $$。
? 也是一個特殊的變量,它是上一個執行的命令所回傳的值。上一個命令成功執行,回傳爲0,則echo $?會顯示0.否則顯示相應的錯誤代碼
當你登陸linux並取得一個bash之後,這個bash就是一個獨立的進程。接下來你在這個bash下面所執行的任何命令都是由這個bash所衍生出來的,那些被執行的命令就被稱爲子進程。
環境變量與自定義變量的區別在於是否會被子進程所繼續使用。
子進程僅會繼承父進程的環境變量,子進程不會繼承父進程的自定義變量。
“export 變量名稱” 設置環境變量
若沒有接變量名稱,則會把所有的環境變量顯示出來
locale -a 顯示linux支持的語系
locale 不加參數,顯示當前的語系信息
語系文件放置在/usr/lib/locale/這個目錄中。整體系統默認的語系定義在/etc/sysconfig/i18n文件中
變量鍵盤讀取、數組與聲明:read, array, declare
read [-pt] variable,由鍵盤讀取變量的內容
-p:後面接提示符
-t:後面接等待的秒數,不會一直等待用戶
ulimit命令:可以限制用戶的某些系統資源,包括打開的文件數量、可以使用的CPU時間、可以使用的內存總量等。
變量內容的刪除、替代與轉換,暫時略過
路徑或命令查找順序:先alias,再builtin(bash內置的),再由$PATH找到路徑
bash的登錄與歡迎信息:/etc/issue, /etc/motd
bash環境配置文件,終端機的環境設置stty,set,暫時略過
通配符
* 代表0個到無窮多個任意字符
? 代表一定有一個任意字符
還有[], [-], [^]三個
特殊符號
# 批註符號,常用在script中,相當於註釋
\ 轉義符號
| 管道pipe,分割兩個管道命令的界定
; 連續命令執行分隔符
~ 用戶的主文件夾
$ 使用變量前導符,即變量之前需要加的變量替代值
& 作業控制job control,將命令變成背景下工作
>, >> 數據流重定向,輸出導向,分別是替換與累加
<, << 數據流重定向,輸入導向
‘’ 單引號,不具有變量置換功能
“” 雙引號,具有變量置換功能
`` 兩個`中間爲可以先執行的命令,也可以使用$()
() 在中間位子shell的起始於結束
{} 在中間爲命令塊的組合
數據流重定向
- 標準輸入stdin,代碼爲0,使用<或<< , <<代表結束輸入的意思,當輸入爲<<後面的內容時,就是結束了輸入
- 標準輸出stdout,代碼爲1,使用>或>>,>>爲累加,>會覆蓋原先的內容
- 標準錯誤輸出stderr,代碼爲2,使用2>或2>>
/dev/null垃圾桶黑洞設備,它可以吃掉任何導向這個設備的信息
將命令的數據全部寫入名爲list的文件中:
錯誤:find /home -name .bashrc > list 2>list 不同文件的時候這樣用,相同文件下,兩條數據可能會交叉寫入該文件內,造成次序混亂
正確:find /home -name .bashrc > list 2>&1
正確;find /home -name .bashrc &> list
$?命令迴轉碼
cmd1 && cmd2 若cmd1執行完畢且正確執行($?=0),則開始執行cmd2
若cmd1執行完畢且爲錯誤($?≠0),則cmd2不執行
cmd1 || cmd2 若cmd1執行完畢且正確執行($?=0),則cmd2不執行
若cmd1執行完畢且爲錯誤($?≠0),則開始執行cmd2
判斷式:command1 && command2 || command3,一般這樣放置,且從左至右來判斷,command2和command3會防止肯定可以執行成功的命令
管道命令
界定符號:“|”。
管道命令僅能處理經由前面一個命令傳來的正確信息,也就是standard output的信息,對於standard error並沒有直接處理的能力。
在每一個管道後面接的第一個數據必定是“命令”。而這個命令必須要能夠接受standard input的數據才行。
選取命令
cut, grep
cut是在一行信息中取出某部分我們想要的,grep是分析一行的信息,若當中有我們所需要的信息,就將該行拿出來。
grep [-acinv] [--color=auto] '查找字符串' filename
-a 將binary文件以test文件的方式查找數據
-c 計算找到'查找字符串'的次數
-i 忽略大小寫的不同
-n 順便輸出行號
-v 反向選擇,即顯示出沒有'查找字符串'內容的那一行
--color=auto 可以將找到的關鍵字部分加上顏色顯示
排序命令:sort, wc, uniq
雙向重定向:tee
字符轉換命令:tr, col, join, paste, expand
參數代換:xargs
減號 - 的用途