Linux新手必须掌握的命令(2)
一、輸入輸出重定向
輸入重定向是指把文件導(dǎo)入到命令中,而輸出重定向則是指把原本要輸出到屏幕的數(shù)據(jù)信息寫入到指定文件中。
在日常的學(xué)習(xí)和工作中,相較于輸入重定向,我們使用輸出重定向的頻率更高。
所以又將輸出重定向分為了標(biāo)準(zhǔn)輸出重定向和錯誤輸出重定向兩種不同的技術(shù),以及清空寫入與追加寫入兩種模式。
-
標(biāo)準(zhǔn)輸入重定向(STDIN,文件描述符為0):默認(rèn)從鍵盤輸入,也可從其他文件或命令中輸入。
- 標(biāo)準(zhǔn)輸出重定向(STDOUT,文件描述符為1):默認(rèn)輸出到屏幕。
- 錯誤輸出重定向(STDERR,文件描述符為2):默認(rèn)輸出到屏幕。
比如我們分別查看兩個文件的屬性信息,其中第二個文件是不存在的,雖然針對這兩個文件的操作都分別會在屏幕上輸出一些數(shù)據(jù)信息,但這兩個操作的差異其實(shí)很大。
先用ls查看當(dāng)前目錄,然后查看lc詳細(xì)信息,再隨便輸入一個不存在的文件名查詢。
?
在上述命令中,名為 lc 的文件是存在的,輸出信息是該命令的標(biāo)準(zhǔn)輸出信息。而名為 lclc 的第二個文件是不存在的,因此在執(zhí)行完ls命令之后顯示的報錯提示信息也是該命令的錯誤輸出信息。
那么,要想把原本輸出到屏幕上的數(shù)據(jù)轉(zhuǎn)而寫入到文件當(dāng)中,就要區(qū)別對待這兩種輸出信息。
對于輸入重定向來講,用到的符號及其作用如下表:
| 符號 | 作用 |
| 命令 < 文件 | 將文件作為命令的標(biāo)準(zhǔn)輸入 |
| 命令 << 分界符 | 從標(biāo)準(zhǔn)輸入中讀入,直到遇見分界符才停止 |
| 命令 < 文件1 > 文件2 | 將文件1作為命令的標(biāo)準(zhǔn)輸入并將標(biāo)準(zhǔn)輸出到文件2 |
對于輸出重定向來講,用到的符號及其作用如下表:
| 符號 | 作用 |
| 命令 > 文件 | 將標(biāo)準(zhǔn)輸出重定向到一個文件中(清空原有文件的數(shù)據(jù)) |
| 命令 2> 文件 | 將錯誤輸出重定向到一個文件中(清空原有文件的數(shù)據(jù)) |
| 命令 >> 文件 | 將標(biāo)準(zhǔn)輸出重定向到一個文件中(追加到原有內(nèi)容的后面) |
| 命令 2>> 文件 | 將錯誤輸出重定向到一個文件中(追加到原有內(nèi)容的后面) |
| 命令 >> 文件 2>&1或命令 &>> 文件 | 將標(biāo)準(zhǔn)輸出與錯誤輸出共同寫入到文件中(追加到原有內(nèi)容的后面) |
對于重定向中的標(biāo)準(zhǔn)輸出模式,可以省略文件描述符1不寫,而錯誤輸出模式的文件描述符2是必須要寫的。
通過標(biāo)準(zhǔn)輸出重定向?qū)?systemctl status vsftpd 命令原本要輸出到屏幕的信息寫入到文件 lc 中,然后用cat命令顯示 lc 文件中的內(nèi)容。具體命令如下:
?
如果想把命令的報錯信息寫入到文件,平時一般用不到。
但是當(dāng)用戶在執(zhí)行一個自動化的Shell腳本時,這個操作會特別有用,因?yàn)樗梢园颜麄€腳本執(zhí)行過程中的報錯信息都記錄到文件中,便于安裝后的排錯工作。
接下來我們以一個不存在的文件進(jìn)行實(shí)驗(yàn)演示:
?
因?yàn)槲覀冇玫氖? >>? 所以追加到文檔原有內(nèi)容后面了。
?
輸入重定向相對來說有些冷門,在工作中遇到的概率會小一點(diǎn)。
輸入重定向的作用是把文件直接導(dǎo)入到命令中。接下來使用輸入重定向把 lc 文件導(dǎo)入給 wc -l 命令,統(tǒng)計一下文件中的內(nèi)容行數(shù)。
?
二、管道命令符
管道命令符的作用也可以用一句話來概括“把前一個命令原本要輸出到屏幕的標(biāo)準(zhǔn)正常數(shù)據(jù)當(dāng)作是后一個命令的標(biāo)準(zhǔn)輸入”。
比如用翻頁的形式查看/etc目錄中的文件列表及屬性信息(這些內(nèi)容默認(rèn)會一股腦兒地顯示到屏幕上,根本看不清楚):
?ls?-l?/etc/?|?more
?
最上面顯示總共多少條,我們可以利用more命令的用法來瀏覽這些信息。
三、常用的轉(zhuǎn)義字符
4個最常用的轉(zhuǎn)義字符如下所示。
- 反斜杠(\):使反斜杠后面的一個變量變?yōu)閱渭兊淖址?/li>
- 單引號(''):轉(zhuǎn)義其中所有的變量為單純的字符串。
- 雙引號(""):保留其中的變量屬性,不進(jìn)行轉(zhuǎn)義處理。
- 反引號(``):把其中的命令執(zhí)行后返回結(jié)果。
我們先定義一個名為PRICE的變量并賦值為5,然后輸出以雙引號括起來的字符串與變量信息:
?
接下來,我們希望能夠輸出“Price is $5”,即價格是5美元的字符串內(nèi)容。
但碰巧美元符號與變量提取符號合并后的$$作用是顯示當(dāng)前程序的進(jìn)程ID號碼,于是命令執(zhí)行后輸出的內(nèi)容并不是我們所預(yù)期的:
?
要想讓第一個“$”作為美元符號,那么就需要使用反斜杠(\)來進(jìn)行轉(zhuǎn)義,將這個命令提取符轉(zhuǎn)義成單純的文本,去除特殊功能。
?
四、Vim文本編輯器
Vim編輯器中設(shè)置了三種模式—命令模式、末行模式和編輯模式,每種模式分別又支持多種不同的命令快捷鍵,這大大提高了工作效率。
要想高效率地操作文本,就必須先搞清這三種模式的操作區(qū)別以及模式之間的切換方法。
- 命令模式:控制光標(biāo)移動,可對文本進(jìn)行復(fù)制、粘貼、刪除和查找等工作。
- 輸入模式:正常的文本錄入。
- 末行模式:保存或退出文檔,以及設(shè)置編輯環(huán)境。
?
在每次運(yùn)行Vim編輯器時,默認(rèn)進(jìn)入命令模式,此時需要先切換到輸入模式后再進(jìn)行文檔編寫工作。
而每次在編寫完文檔后需要先返回命令模式,然后再進(jìn)入末行模式,執(zhí)行文檔的保存或退出操作。
在Vim中,無法直接從輸入模式切換到末行模式。
Vim編輯器中在命令模式中最常用的一些命令如下圖。
| 命令 | 作用 |
| dd | 刪除(剪切)光標(biāo)所在整行 |
| 5dd | 刪除(剪切)從光標(biāo)處開始的5行 |
| yy | 復(fù)制光標(biāo)所在整行 |
| 5yy | 復(fù)制從光標(biāo)處開始的5行 |
| n | 顯示搜索命令定位到的下一個字符串 |
| N | 顯示搜索命令定位到的上一個字符串 |
| u | 撤銷上一步的操作 |
| p | 將之前刪除(dd)或復(fù)制(yy)過的數(shù)據(jù)粘貼到光標(biāo)后面 |
末行模式主要用于保存或退出文件,以及設(shè)置Vim編輯器的工作環(huán)境,還可以讓用戶執(zhí)行外部的Linux命令或跳轉(zhuǎn)到所編寫文檔的特定行數(shù)。
要想切換到末行模式,在命令模式中輸入一個冒號就可以了。末行模式中可用的命令如下表。
| 命令 | 作用 |
| :w | 保存 |
| :q | 退出 |
| :q! | 強(qiáng)制退出(放棄對文檔的修改內(nèi)容) |
| :wq! | 強(qiáng)制保存退出 |
| :set nu | 顯示行號 |
| :set nonu | 不顯示行號 |
| :命令 | 執(zhí)行該命令 |
| :整數(shù) | 跳轉(zhuǎn)到該行 |
| :s/one/two | 將當(dāng)前光標(biāo)所在行的第一個one替換成two |
| :s/one/two/g | 將當(dāng)前光標(biāo)所在行的所有one替換成two |
| :%s/one/two/g | 將全文中的所有one替換成two |
| ?字符串 | 在文本中從下至上搜索該字符串 |
| /字符串 | 在文本中從上至下搜索該字符串 |
編寫腳本文檔的第1步就是給文檔取個名字,這里將其命名為practice.txt。如果存在該文檔,則是打開它。如果不存在,則是創(chuàng)建一個臨時的輸入文件。
打開practice.txt文檔后,默認(rèn)進(jìn)入的是Vim編輯器的命令模式。此時只能執(zhí)行該模式下的命令,而不能隨意輸入文本內(nèi)容,我們需要切換到輸入模式才可以編寫文檔。
五、編寫Shell腳本
可以將Shell終端解釋器當(dāng)作人與計算機(jī)硬件之間的“翻譯官”,它作為用戶與Linux系統(tǒng)內(nèi)部的通信媒介,除了能夠支持各種變量與參數(shù)外,還提供了諸如循環(huán)、分支等高級編程語言才有的控制結(jié)構(gòu)特性。
要想正確使用Shell中的這些功能特性,準(zhǔn)確下達(dá)命令尤為重要。
Shell腳本命令的工作方式有兩種:交互式和批處理。
- 交互式(Interactive):用戶每輸入一條命令就立即執(zhí)行。
- 批處理(Batch):由用戶事先編寫好一個完整的Shell腳本,Shell會一次性執(zhí)行腳本中諸多的命令。
在Shell腳本中不僅會用到很多Linux命令以及正則表達(dá)式、管道符、數(shù)據(jù)流重定向等語法規(guī)則,還需要把內(nèi)部功能模塊化后通過邏輯語句進(jìn)行處理,最終形成日常所見的Shell腳本。
查看SHELL變量可以發(fā)現(xiàn)當(dāng)前系統(tǒng)已經(jīng)默認(rèn)使用Bash作為命令行終端解釋器了:
?
使用Vim編輯器把Linux命令按照順序依次寫入到一個lc文件中,這就是一個簡單的腳本了。
例如,如果想查看當(dāng)前所在工作路徑并列出當(dāng)前目錄下所有的文件及屬性信息,實(shí)現(xiàn)這個功能的腳本應(yīng)該類似于下面這樣:
?
第一行的腳本聲明(#!)用來告訴系統(tǒng)使用哪種Shell解釋器來執(zhí)行該腳本;
第二、三行的可執(zhí)行語句就是我們平時執(zhí)行的Linux命令。
通過bash lc 來執(zhí)行(lc是剛才編輯那個文件名)
?
但是,像上面這樣的腳本程序只能執(zhí)行一些預(yù)先定義好的功能,太過死板了。
為了讓Shell腳本程序更好地靈活完成工作,必須要讓腳本程序能夠像之前執(zhí)行命令時那樣,接收輸入的參數(shù)。
接收參數(shù)的變量,變量之間可以使用空格間隔。
例如$0對應(yīng)的是當(dāng)前Shell腳本程序的名稱,$#對應(yīng)的是總共有幾個參數(shù),$*對應(yīng)的是所有位置的參數(shù)值,$?對應(yīng)的是顯示上一次命令的執(zhí)行返回值,而$1、$2、$3……則分別對應(yīng)著第N個位置的參數(shù)值。
?
例如,編輯如下文件:
?
執(zhí)行后:
?
下面再介紹判斷用戶參數(shù)
系統(tǒng)在執(zhí)行mkdir命令時會判斷用戶輸入的信息,即判斷用戶指定的文件夾名稱是否已經(jīng)存在,如果存在則提示報錯;
反之則自動創(chuàng)建。Shell腳本中的條件測試語法可以判斷表達(dá)式是否成立,若條件成立則返回數(shù)字0,否則便返回其他隨機(jī)數(shù)值。
條件測試語法的執(zhí)行格式如圖所示。切記,條件表達(dá)式兩邊均應(yīng)有一個空格。
?
按照測試對象來劃分,條件測試語句可以分為4種:
- 文件測試語句;
- 邏輯測試語句;
- 整數(shù)值比較語句;
- 字符串比較語句。
文件測試即使用指定條件來判斷文件是否存在或權(quán)限是否滿足等情況的運(yùn)算符,具體的參數(shù)如表:
| 運(yùn)算符 | 作用 |
| -d | 測試文件是否為目錄類型 |
| -e | 測試文件是否存在 |
| -f | 判斷是否為一般文件 |
| -r | 測試當(dāng)前用戶是否有權(quán)限讀取 |
| -w | 測試當(dāng)前用戶是否有權(quán)限寫入 |
| -x | 測試當(dāng)前用戶是否有權(quán)限執(zhí)行 |
下面使用文件測試語句來判斷/etc/fstab是否為一個目錄類型的文件,然后通過Shell解釋器的內(nèi)設(shè)$?變量顯示上一條命令執(zhí)行后的返回值。
如果返回值為0,則目錄存在;如果返回值為非零的值,則意味著目錄不存在:
?
再判斷/etc/fstab是否為一般文件
?
邏輯語句用于對測試結(jié)果進(jìn)行邏輯分析,根據(jù)測試結(jié)果可實(shí)現(xiàn)不同的效果。
例如在Shell終端中邏輯“與”的運(yùn)算符號是&&,它表示當(dāng)前面的命令執(zhí)行成功后才會執(zhí)行它后面的命令,因此可以用來判斷/dev/cdrom文件是否存在,若存在則輸出Exist字樣。
?
除了邏輯“與”外,還有邏輯“或”,它在Linux系統(tǒng)中的運(yùn)算符號為||,表示當(dāng)前面的命令執(zhí)行失敗后才會執(zhí)行它后面的命令,因此可以用來結(jié)合系統(tǒng)環(huán)境變量USER來判斷當(dāng)前登錄的用戶是否為非管理員身份:
切換到非管理員身份,進(jìn)行管理員驗(yàn)證:
?
第三種邏輯語句是“非”,在Linux系統(tǒng)中的運(yùn)算符號是一個嘆號(!),它表示把條件測試中的判斷結(jié)果取相反值。
也就是說,如果原本測試的結(jié)果是正確的,則將其變成錯誤的;原本測試錯誤的結(jié)果則將其變成正確的。
我們現(xiàn)在切換回到root管理員身份,再判斷當(dāng)前用戶是否為一個非管理員的用戶。
由于判斷結(jié)果因?yàn)閮纱畏穸ǘ兂烧_,因此會正常地輸出預(yù)設(shè)信息:
?
下面這個示例的執(zhí)行順序是,先判斷當(dāng)前登錄用戶的USER變量名稱是否等于root,然后用邏輯運(yùn)算符“非”進(jìn)行取反操作,效果就變成了判斷當(dāng)前登錄的用戶是否為非管理員用戶了。
最后若條件成立則會根據(jù)邏輯“與”運(yùn)算符輸出user字樣;或條件不滿足則會通過邏輯“或”運(yùn)算符輸出root字樣,而如果前面的&&不成立才會執(zhí)行后面的||符號。
?
整數(shù)比較運(yùn)算符僅是對數(shù)字的操作,不能將數(shù)字與字符串、文件等內(nèi)容一起操作,而且不能想當(dāng)然地使用日常生活中的等號、大于號、小于號等來判斷。
因?yàn)榈忍柵c賦值命令符沖突,大于號和小于號分別與輸出重定向命令符和輸入重定向命令符沖突。
因此一定要使用規(guī)范的整數(shù)比較運(yùn)算符來進(jìn)行操作。可用的整數(shù)比較運(yùn)算符如表所示。
| 運(yùn)算符 | 作用 |
| -eq | 是否等于 |
| -ne | 是否不等于 |
| -gt | 是否大于 |
| -lt | 是否小于 |
| -le | 是否等于或小于 |
| -ge | 是否大于或等于 |
接下來測試一下10是否大于10以及10是否等于10(通過輸出的返回值內(nèi)容來判斷):
?
轉(zhuǎn)載于:https://www.cnblogs.com/nefu-Lc/p/9485989.html
總結(jié)
以上是生活随笔為你收集整理的Linux新手必须掌握的命令(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA自学笔记23
- 下一篇: 《鸟哥的Linux基础》