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