1. 程式人生 > >7.Linux系統的Bash

7.Linux系統的Bash

目錄

本地變數

環境變數

位置變數

1.瞭解Shell 

1.1.什麼是Shell?

翻譯成中文shell就是外殼的意思,那他有什麼用?我們知道管理整個計算機硬體的其實是作業系統的核心 (kernel),這個核心是需要被保護的,同時作業系統給會給出一個介面然你來控制這個作業系統的某些程序,而這個溝通的媒介就是Shell,在Linux系統中可能會內嵌很多種Shell,他們的目的都是和作業系統進行通訊,常用的是Bash,這個Shell中的一種。

1.2.shell的工作流程

我們知道不管我們執行什麼命令,到最後都是由硬體來執行這個任務的,那他的運作流程是什麼呢?加入我們需要播放音樂的話,當我們下達指令,計算機需要去做什麼?

1. 硬體:當然就是需要你的硬體有『音效卡晶片』這個配備,去驅動你的喇叭;
2. 核心管理:作業系統的核心可以支援這個晶片組,當然還需要提供晶片的驅勱程式;
3. 應用程式:需要使用者 (就是你) 輸入發生聲音的指令!

1.3.如何使用shell呢?

shell是一個看不到,摸不著的東西,當使用KDE桌面時,可以開啟一個終端,這個終端是一個軟體,它可以幫我們連線到shell,但是注意,這個終端並不是shell,它只起一個連線的作用

1.4.Linux系統中存在哪些Shell((以 CentOS 5.x 為例)?

可以通過檢視檔案:/etc/shells 檢視當前系統Shell的種類,預設使用的是bash

  /bin/sh (已經被 /bin/bash 所取代)
 /bin/bash (就是 Linux 預設的 shell)
  /bin/ksh (Kornshell 由 AT&T Bell lab. 發展出來的,兼容於 bash)
  /bin/tcsh (整合 C Shell ,提供更多的功能)
  /bin/csh (已經被 /bin/tcsh 所取代)
  /bin/zsh (基於 ksh 發展出來的,功能更強大的 shell)

如果你想切換到某個shell直接在命令列上輸入shell的名字就行,例如:切換到ksh

1.6.為什麼使用shell?

1.shell使用的是命令列,處理速度快。

2.遠端管理如果使用命令的話,傳輸資料就小,控制流暢。

3.shell支援大量的快捷鍵,提高使用者的效率。

1.7.shell命令和系統命令

shell是系統在安裝的時候自動安裝上去的,查詢一個命令在哪的話,使用wihch  命令,比如 which ls

找一下 cd 這個命令的位置,命令:which cd,在PATH環境變數下,找不到cd這個命令,那為什麼我們可以執行cd這個命令進行目錄進行跳轉呢?

舉個例子,使用window系統來演示,我們現在直接的cmd命令列直接輸入:qq這個命令,提示說找不到這個命令,當我們進入到qq安裝路徑下的檔案時,然後再次執行這個命令時,系統就打開了一個qq的登陸介面。所以說這個命令是我在安裝qq之後生成的,如果不安裝這個軟體的話也不會有這個命令,所以我們系統原本沒有cd這個命令,但是安裝了shell之後,cd是shell內建的命令,不是系統的命令。

如何檢視cd命令是否屬於shell內嵌的命令?

使用命令:type cd

2.Shell的變數功能

2.1什麼是變數?

就是讓某一個特定字串代表不固定的內容就是了,比如:a=5,左邊是一個可以變化的字元,右邊是一個固定的數字。

使用變數的好處就是可以讓系統的運作流程變得簡單。

2.2.如何使用變數

本地變數

  • 本地變數的特點時,只會在當前的Shell起作用不會,影響帶其他的子shell

定義一個本地變數的方法:變數名=值   

注意:變數名可以由字母、陣列、下劃線組成,不可以使用數字開頭,等號兩邊不要有空格。

例子1:

定義一個本地變數,a=20  。 注意:列印的時候不加 $ 字元,會吧a當作普通字元來使用,打印出來的就是a這個字元。

取消一個變數的設定:unset  變數名

取消變數a的設定:

 例子2:

本地變數的設定只會在當前shell起作用,不會影響到其他的子shell,現在在一個shell中建立一個變數b然後開啟另一個shell看一下這個本地變數是否還存在?

環境變數

  • 環境髮量可以幫我們實現很多種功能~包括家目錄的變換、提示字元的顯示啊、執行檔案搜尋的路徑等等。
  • 環境變數的特點是它會影響到所有的子shell

如何定義一個環境變數?

方法:export  變數名=值

注意:如果已經設定了一個本地變數a,那麼使用export  a ,可以把這個本地變數變成一個環境變數。

例子:

環境變數可以影響到所有的子shell,在父shell中新建一個變數c,給其複製20,然後開啟一個子shell,然後列印這個環境變數:

 2.3如何檢視所有的變數?

使用命令:set , 就會顯示系統所有的變數,包括本地和環境變數。

  • 只檢視系統的環境變數

使用命令:env 

提示:使用export export -pset都可以檢視系統的環境變數

  • 使用export檢視環境變數

可以看到使用export檢視環境變數顯示時多了一個詞:declare

  • declare / typeset 的用法

declare 與 typeset 是一樣的功能,就是在『宣告變數的型別』。如果使用 declare 後面幵沒有接任何引數,那麼 bash 就會主動的將所有的變數名稱與內容通通列出來,就好像使用 set 一樣。

命令:declare

語法:declare [-aixr] variable

選項及其含義 

選項 含義
-a 將後面名為variable的變數定義成陣列(array)的型別。
-i 將後面名為variable的變數定義成整數數字(integter)型別
-x 用法與export一樣,將後面的variable變成環境變數。
-r 將變數設定為readonly型別,該變數的內容將不可被更改,也不可取消(unset)該變數
+x 可以將環境變數轉變為位置變數

位置變數

  • 當我們在寫指令碼的時候這個位置變數很重要

例:1:

寫一個指令碼檔案,命令為test.sh,使用vim開啟,編輯指令碼檔案

執行指令碼然後給這個程式8的引數:

例子2:

直接使用set設定位置變數的值,使用命令,set  1 2 3 4 5 6 7 8,然後列印位置變數的值看一下:

試著設的長一點,使用命令:set 1 2 3 4 5 6 7 8 9 a b c d e,當列印第11個位置變數的時候好像出錯了

注意:如果使用命令:echo $11,會首先顯示$1的內容然後再次顯示$1的內容,同時打印出兩個11了,咋看起來是11.所以當位置變數的數字大於兩位數的時候,加一個大括號,比如:echo ${11} 

那麼 :$0 代表什麼意思呢?$#呢?$*呢?

解釋:$0 代表的是整個程式的名字,$# 代表的是未知變數的個數,$* 表示所有的位置變數

例子3:

修改test.sh這個指令碼程式,測試 $0,$#,$*的功能

編輯後儲存,執行指令碼程式:

3.系統的環境變數

  • HOME

代表使用者的家目錄。可以用cd 命令去到我們的家目錄下,使用cd命令不加任何的引數既可以回到家目錄。不同的使用者擁有唯一的家目錄,其實就是取用這個變數的值。

  • SHELL

記錄當前系統所用的shell

  • HISTSIZE

這個與歷史命令有關, 我們曾經下達過的指令令可以被系統記錄下來,而記錄的『筆數』則是由這個值來決定。

  • MAIL

當我們使用 mail 這個指令在收信時,系統會去讀取的郵件信箱檔案 (mailbox)。

  • PATH

執行檔案搜尋的路徑~目錄與目錄中間以冒號(:)分割, 由於檔案的搜尋是依序由 PATH 的變數內得目錄來查詢,所以,目錄的順序也是重要。

  •  LANG

語系資料,很多訊息會用到它, 丼例杢說,當我們在啟動某些 perl 癿程式語言檔案時,他會主動的去分析語系資料檔案, 如果發現有他無法解析的編碼語系,可能會產生錯誤!一般來說,我們中文編碼通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,這兩個編碼偏偏不容易被解譯出來,所以,有癿時候,可能需要修訂一下語系資料。

  •  RANDOM

就是『隨機數』的變數!目前大多數的 distributions 都會有隨機數生成器,那就是 /dev/random 這個檔案。 我們可以透過這個隨機數檔案相關的變數 ($RANDOM) 來隨機取得隨機數值。在 BASH 的環境下,這個 RANDOM 變數得內容,介於 0~32767 之間,所以,你叧要 echo $RANDOM 時,系統就會主動的隨機取出一個介於 0~32767 的數值。萬一我想要使用 0~9 之間癿數值呢,利用 declare 宣告數值型別。

  • PS1:(提示字元的設定)

這個就是顯示我們命令提示符,當我們執行一個命令之後,在#號前面都有一些提示資訊,比如你當你當前所在路徑等等,這些東西通過PS1變數你可以自行設定的。

設定符號的意義:

符號 含義
\d 顯示星期、月、日的日期格式,如Mon  Jun  6
\H 完整的主機名,如:www.yuan.com
\h 僅僅取主機名在第一個小數點之前的名字,如:www
\t 顯示時間24小時格式:HH:MM:SS
\T 顯示時間12消失格式:HH:MM:SS
\A 顯示時間24消失格式:HH:MM
\@ 顯示時間12消失格式:am/pm 樣式
\u 目前使用者賬號,如:yuangege,或root
\v bash版本資訊
\w 完整的工作目錄,由根目錄開始,家目錄以~取代
\W 利用basename函式獲取工作目錄名稱,僅列出最後一個目錄名
\# 當前下達的是第幾個指令
\$ 提示字元,如果是root時,提示符為#,否則就是$

例子:看一下當前我們提示符的設定:

可以看到顯示的樣式和設定的是一模一樣的。

我們也可以去更改一下環境變數PS1的值,我們讓他顯示在最前面顯示一個時間,顯示完整主機名,然後顯示完整的工作目錄。

使用命令:PS1="[\t @\[email protected]\H \w]\$"

  • PS2

當我們寫程式的時候一行不夠寫,只需要輸入一個反斜槓,自動就會跳入到下一行繼續這個命令,而在繼續命令之前還有一個提示符,這個提示符即使PS2設定的,看一看預設的提示符是什麼?

同樣我們也可以去修改這個提示符,把這個提示符改成:————》

使用命令:PS2="——》"

4.變數的鍵盤讀取、陣列與宣告: read, array, declare

4.1.read

作用:用來讀取鍵盤的變數。

語法:

read [-pt] variable

選項

選項 含義
-p 後面可以接提示符
-t 後面接等待的描述,不會一直等待使用者輸入

如果read後面什麼都不跟,直接加上變數的名字,底下就會有一個空白行讓你輸入,按回車就等於是給這個變數賦值了。

當系統遇到read,程式就不會往下走了,等待使用者輸入,才往下執行。

例子:

使用命令:read   aa ,然後輸入一段陣列,回車

如果輸入命令,什麼都不跟的話是賦值給哪個變數,那就是預設的變數:REPLY

比如:輸入read   然後輸入88888,回車,再列印REPLY的值

例子2: 

read 用作指令碼的輸入:

新建一個:test.sh的指令碼,然後使用vim編輯器編輯

方式一:

方式二:

方式三:

執行這個指令碼:

4.2.陣列 (array) 變數型別

陣列和變數的意思是一樣的,只不過陣列可以連續儲存多條資料,然後把這些資料有規律的儲存在數組裡面,當你獲取一組網路資料時,可以根據你的需要獲取或者分析你想要的部分。

陣列的設定定方式是:array=(a b c d)

例子:

定義陣列的方式一:

使用命令:array=(a b c d)

解釋:定義一個數組,陣列的名字是array,陣列的成員有四個,第一個是a,第二個是b,第三個是c,第四個是d,想要獲取陣列第一個的值使用命令:echo ${array[0]}

一次性列印陣列的所有元素,使用命令:echo ${array[*]} 或 echo ${array[@]}

檢視陣列的個數以及下標,使用命令:echo ${!array[*]} ,檢視陣列的元素個數,使用命令echo ${#array[*]}

4.3.declare / typeset

declare 和 typeset 是一樣的功能,就是在『宣告變數的型別』

命令:declare

語法:

 declare [-aixr] variable

選項:

選項 含義
-a 將後面名為variable的變數定義成陣列(array)型別
-i 將後面名為variable的變數定義成為整數數字(integer)型別
-x 用法和export一樣,將後面的variable變成環境變數
-r 將變數設定為readonly型別,該變數的內容不可被更改,也不能unset
+x 把環境變數取消

例子:

定義個環境變數a。

注意事項:

單引號和雙引號的使用:

反引號的使用

5.變數內容的刪除、取代與替換

5.1.變數和內容的刪除

例子:

先建立一個變數path,然後複製環境變數PATH裡面的內容來做實驗:

那麼現在path的內容是:

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin 

定義一個變數:r,它的值等於:path # * /sbin,即命令:r =$ {path # * /sbin}

解釋:如果只有一個#號,代表從最近的一個關鍵字,刪除到頭刪除path裡面所有的usr/sbin 前面的東西,然後複製給 r 這個變數。那麼是如下這種結果。

結果:

共有三個關鍵詞:/sbin

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

從最近的那個開始刪除,結果如下:

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

如果使用命令:r = {path ## * /sbin}

解釋:如果有兩個##的話,代表從最遠關鍵字的一個開始刪除,刪除到開頭刪除/sbin前面的東西,然後賦值給r變數

結果:

共有三個關鍵詞:/sbin

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

從最遠的那個開始刪除,結果如下:

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

使用#號鍵從頭開始刪除,那麼有沒有從尾開始刪除的呢?

答案肯定是有,使用的符號是:%

例子:

接著上面的例子,使用命令:r =$ {path% /sbin*}

解釋:注意*在後面,代表的是從/sbin開始,*代表後面是什麼都無所謂,只有一個%符號,代表從尾網頭找,找到最近一個關鍵字然後從尾刪除到最近的一個關鍵詞,結果如下:

結果:

共有三個關鍵詞:/sbin

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

從最近的那個開始刪除,結果如下:

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

那麼從尾刪除到最前的一個關鍵字使用的是:兩個%%

使用命令:r =$ {path%% /sbin*}

結果:

共有三個關鍵詞:/sbin

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

從最近的那個開始刪除,結果如下:

/opt/xtensa-lx106-elf/bin:/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

5.2.變數內容的替換

我們可以發現,當我們列印一個變數的值時,當這個變數不存在時,它顯示的是空值,當這個變數存在,且設定一個變數為空值時,列印結果都是一樣的,這樣就沒有辦法去判定這個變數是否存在了。

例子1:

那如何判斷一個值是否存在或者是被定義?

方式一:只能判定一個變數是否存在

使用命令:r = ${a-"unexitstant"}

解釋:如果說a這個變數存在或者定義過,那麼r的值就等於a的值,如果a這個變數不存在那麼r的值就是雙引號的內容即為:unexitstant。

方式二:判斷一個變數是否存在,如果不存在和空值都是一個結果

使用命令:r = ${a-"unexitstant"}

解釋:如果說a這個變數存在或者定義過,那麼r的值就等於a的值,如果a的為空值的話也會賦值unexitstant給r,如果a這個變數不存在那麼r的值就是雙引號的內容即為:unexitstant。

方式三:

使用命令:r = ${a:="unexitstant"}

解釋:如果a這個值存在的話把a的值賦值給r,如果a這個值不存在或者是空值的話,把unexitstant 值給a這個變數。

方式四:判斷一個變數是否被定義或是否為空值

使用命令:r = ${a:?"unexitstant"}

解釋:如果變數a不存在或者是一個空值,就會有一個警告

方式五:判斷一個變數是否存在或者非空值

使用命令:r = ${a:+"exitstant"}

解釋:如果變數a存在的話,就把exitstant 賦值給變數r,如果沒有被定義或者是空值的話,打印出來的r也是空的。

6.命令的別名設定

命令別名設定: alias, unalias

解釋:命令的別名顧名思義就是,就像是小名一樣,比如有一個人名字叫王二,他的小名叫狗蛋,不熟悉王二的人就會叫他的真名,熟悉的人(給它取別名的人啦)也可以叫他狗蛋,這樣叫的結果都是一樣的,王二知道這都是在叫他。

別名設定方法:

alias  別名 = "命令" 

解釋:此時這個別名就和這個命令是等效的了

例子:

如果需要看系統的網絡卡配置的話,我們需要輸入命令:ifconfig  ,如果你想簡便一點你也可以給它取一個別名bb,

使用命令:alias bb = "ifconfig"

檢視系統的所有別名,使用命令:alias

取消別名,使用命令:unalias 別名

7.Bash Shell 的操作環境

7.1.路徑與指令搜尋順序

在第6節的時候,知道有alias命令別名的東西,一個命令可以有很多種別名,他們執行的順序是什麼,例如ls可能有很多條別名,那到底系統執行這些命令順序的依據是什麼?

例子:

比如現在執行命令:echo aaaaaaaaa,系統打印出aaaaaaa,然後自動有一個換行符,那麼可以使用別名當我們呼叫echo的時候取消這個換行符,命令:alias  echo = "echo -n",然後再列印輸出echo aaaaaaaaaaaaaa,發現沒有換行了。那意味著執行了別名這條命令了,為什麼這個順序比echo優先執行?

那麼當我們使用ls這個命令的時候,是使用 :/bin下面的ls呢,還是alias別名的ls,還是通過系統路徑PATH下搜尋的ls,還是bash內建的ls呢?

檢視命令的執行順序使用命令:type -a 命令

檢視echo的命令執行順序,使用命令:type -a  echo

 7.2.bash 系統登陸提示資訊: /etc/issue, /etc/motd

                     issue各程式碼的意義
\d 本地埠的日期
\l 顯示第幾個終端介面
\m 顯示硬體等級
\n 顯示主機的網路名稱
\o 顯示域名
\r 顯示作業系統版本(相當於uname -r)
\t 顯示本地端時間
\s 作業系統名稱
v 作業系統版本

 注意:登陸後的資訊各程式碼意義和登陸前的引數是一樣的。

例子:

切換到Ubuntu的tty3的控制檯(快捷鍵:Ctrl+Alt+F3),然後可以看到如下的提示資訊:

登陸之後也有提示資訊:

如何修改這些提示資訊?

修改登入之前的提示資訊,修改:/etc/issue 的內容,使用命令檢視:vim /etc/issue

可以看到預設只有一行,從程式碼的意義可以看出,顯示出主機網路名稱和所在終端的位置

我們也可以修改一下他的登陸資訊:

修改如下:

然後退出,重新登陸看到如下的介面:

提示:登陸後的資訊只需要編輯:/etc/motd 修改即可。

7.3.bash的環境配置檔案

當我們一登入linux系統,還沒有定義變數時,就有一堆系統變數可以用,當你登出了系統之後,這些變數就會消失,這是為什麼呢?

這是因為系統有一些環境配置檔案的存在。

  • login 與 non-login shell

1.當我們沒有登陸系統之前(還麼有輸入正確的使用者名稱密碼之前),我們使用shell稱為:login shell ,當我們已經使用賬戶密碼登陸之後使用的shell,稱為:non-login shell,此時無論開啟幾個終端都是不需要輸入使用者密碼的。

2.介紹login 與 non-login shell 原因,這個因為在這兩個shell下讀取的配置檔案是不一樣的

7.3.1.login shell

一般來說login shell 只會讀取兩個配置檔案:

1./etc/profile:這是系統整體的設定,不建議修改

2.~/.bash_profile 或者 ~/.bash_login 或 ~/.profile:屬於使用者個人設定,你要改自己的資料,就寫入這裡!

7.4.終端機的環境設定: stty, set

  • stty

我們系統本身擁有很多的快捷鍵,比如退格鍵駕駛刪除資料,Ctrl+c就是終止一個命令的執行等等,這些都是在哪裡設定的呢

使用命令: stty -a ,檢視系統的一些按鍵的設定,可以看到有很多的快捷鍵

提示:如果出現 ^ 表示 [Ctrl] 那個按鍵的意思。舉例子, intr = ^C 表示使用 [Ctrl] + c 的快捷鍵。

幾個重要引數的含義:

  eof : End of file 的意思,代表『結束輸入』。
  erase : 向後刪除字元,
  intr : 送出一個 interrupt (中斷) 的訊號給目前正在 run 的程式;
  kill : 刪除在目前指令列上的所有文字;
  quit : 送出一個 quit的訊號給目前正在 run 的程式;
  start : 在某個程式停止後,重新啟動他的 output
  stop : 停止目前螢幕的輸出;
  susp : 送出一個 terminal stop 癿訊號給正在 run 的程式

  • set

 set 可以幫我們設定整個指令輸出/輸入的環境,例如記錄歷史命令、顯示錯誤內容等等。

命令:set

語法:

set [選項]

選項:

選項 含義
-u 啟用後,當所使用的變數未設定時,輸出錯誤資訊。預設不啟用
-v 啟用後,資訊被輸出前,先顯示資訊的原始內容。預設不啟用
-x 啟用後,在指令被執行前,顯示指令內容(且前面帶++符號)。預設不啟用,指令碼排錯常用
-h 與歷史明明有關。預設啟用
-H 與歷史命令有關。預設啟用
-m 與工作管理有關。預設啟用
-b 與括號 [ ] 的作用有關 。預設啟用
-c 啟用後,若使用  > 等,若檔案存在時,該檔案不會被覆蓋。預設不啟用

例子:

但我們使用一個變數的時候,如果他沒有定義預設系統不會提示我們這個變數有沒有被定義,如果我們需要提示,值需要設定一個-u這個引數。使用命令:set -u

提示:關閉這個功能使用命令:set +u.

7.5.萬用字元與特殊符號

萬用字元符號和含義:

符號 含義
* 代表【0到無窮多個】任意字元
代表【一定有一個】任意一個字元
[ ]

代表【一定有一個在括號內】的字元(非任意字元),例如[abcd]代表一定有一個字元要是,a,b,c,d中的任意一個。

[ - ] 代表【在編碼順序內的所有字元】,例如 [0-9]代表0到9之間的所有數字。
[ ^ ] 代表【反選選擇】,例如[^abc]代表一定有一個字元,除了a,b,c這三個

例如:

現在我需要你找出一個檔案。

要求:第一個字元必須是字元:[a-z],第二個必須是數字:[0-9],第三個無所謂:?,第四個字元不能是數字:[^0-9],後面是什麼都無所謂,檔名的字尾是.mp4。

在計算機怎麼表達呢?這是就需要使用萬用字元,注意,一箇中括號匹配一個字元。

現在建立幾個檔案測試一下:

使用命令: touch bd5465s.mp4 h9e6je8.mp4 v22hsdflk.mp4 addfc5465.mp4

從上圖看很明顯只有一個是匹配的,那就是:v22hsdflk.mp4 ,第一個是字元,第二個數字,第三個無所謂,第四個必須是非數字,然後後面多長都無所謂,字尾是:.mp4的。

使用命令查詢一下:ls [a-z][0-9]?[^0-9]*.mp4

7.6.資料流重導向

什麼是資料流重導向?

如果我們執行一個指令,一般都是預設從鍵盤輸入,然後執行結果從螢幕顯示出來,不管執行結果正確與否都會進行輸入,這是什麼原理呢?

指令的執行情況大致如上圖所示。

引入資料重導向:

  • standard output 不 standard error output

standard output和 standard error output分別是執行結果正確返回的資訊,和執行結果返回的資訊,不管資訊正確與否,我們都需要把它的資訊輸出在桌面上。

舉例子來說:我們的系統有 /etc/hosts目錄, 但卻無/etc/yuan, 此時若下達『 cat /etc/hosts /etc/yuan 』這個指令,cat 會進行:

1.標準輸出:因為存在、/etc/hosts這個檔案,將該檔案正確的輸入到螢幕上。

2.錯誤標準輸出:因為不存在、/etc/yuan這個檔案,在螢幕上顯示錯誤的資訊。

我們試著執行一下:

不管是否正確執行都是統統輸出到螢幕上,如果資料多的話,就會亂糟糟的不知從何看起,那有沒有方法將他們的正確執行結果和錯誤的執行結果分開呢?

 當然可以啊!那就是資料流重導向的功能!資料流重導向可以將 standard output(簡稱 stdout) 與 standard error output (簡稱 stderr) 分別傳送到其他的檔案或裝置去,而分別傳送所用的特殊字元則如下所示:

1. 標準輸入 (stdin)        :程式碼為 0 ,使用 <    或   <<
2. 標準輸出 (stdout)      :程式碼為 1 ,使用 >    或   >>   ,只能重定向正確的結果
3. 標準錯誤輸出(stderr):程式碼為 2 ,使用 2>   或  2>>  ,只能重定向錯誤的結果

注意:使用  &> ,不管是正確的結果還是錯誤的都可以重導向到檔案裡。

例子:

現在想要檢視日曆,使用命令:cal,如果直接敲命名回車的話,那就是直接輸出在螢幕上,如果我想讓他資料流重導向到一個檔案裡面去怎麼做呢?

使用命令:cal  > 檔案名

注意:如果 這個檔案不存在的話會自動的新建一個檔案的,如果這個檔案是存在的,會先清空這個檔案的東西,然後再把資料放進去。

現在file1裡面已經有檔案了,如果此時再次敲一個命令:date > file1,那無疑就會覆蓋掉原來的東西,但如果你想保留著裡面的東西,然後在這基礎之上,新增date的資料呢?

使用命令:date  >> file1

解釋:兩個大於號 >> 把date重定向輸出到file1,且保留file1原本的資料內容:

那麼錯誤的資訊能通標準輸出資料重定向匯入到file1這個檔案裡面去嗎?發現錯誤的資訊並不能匯入,直接就輸出到螢幕上了

如果你想重定向錯誤的資料,那就得使用錯誤重定向符,使用:2> 或 2>>  

使用命令:aaaaa  2>  file1

特殊用法:

使用命令:cal 2> file1  1>&2

解釋:cal命令是正確的,原本使用2>是不可以匯入的,但是後面多了一個,1>&2 ,就可以實現匯入了,意思是,正確的結果向錯誤一樣的匯入。

那就有命令讓錯誤的資訊像正確那樣匯入咯。

使用命令:aaaa  > file1  2>&1

解釋:aaaa命令是不存在的,使用正確的導向符,理論不可以輸入到file1上,使用,2>&1 ,把錯誤的資訊像正確的一樣匯入。

輸入重定向:standard input : < 與 <<

以最簡單的說法, 那就是『將原本需要由鍵盤輸入的資料,改由檔案內容來取代』的意思。
 

例子1:利用cat指令建立一個檔案簡單流程

解釋:由於在cat 加上了一個輸出重定向符 > 之後,file3會主動被建立,輸入的內容就是鍵盤上輸入的資料,如果這樣的話我們能不能使用文字來代替我們鍵盤的輸入呢,當然任然是新建,而文字是從外部檔案輸入的。

例子2:

使用cat新建一個檔案,然後檔案的內容來自於:/etc/hosts檔案,其實這跟複製很像,就是把裡面的內容複製來,然後重新命名一樣了。

使用命令:cat > file4 </etc/hosts

驗證一下:

例子3:

使用命令:cat  > file2 <<55aa

解釋:<< 這個連續兩個小於的符號了。 他代表癿是『結束的輸入字元』的意思,意思就是,現在上面那條命令回車後,會顯示輸入字元,而這個輸入時輸入到檔案file2的,按回車就跳到下一行編輯,你的一行內的字元是:55aa,然後按回車,否則永遠不會退出這個檔案的編輯。

7.7.命令執行的判斷依據:  ;  和 && 和  ||

  • 一次性執行多條語句,使用分號隔開:

  • $? (指令回傳值) 與 && 或 ||

$?:就像一個容器一樣,傳回執行指令是否正確的結果,它只會記錄上一次命令執行的結果,如果上一次執行的結果是正確的話此值就是:0,如果上一次執行結果是錯的話就是:非0

例子:

執行命令:cal,肯定是正確的結果,返回0,再次執行:aaa,錯誤,返回0:。

  •  && 或 ||

這兩個符號也可以和多條命令結合一起執行,用&& 或者 || 符號分開,但是他們的含義不一樣。如下表所示:

註釋:cmd1代表一條指令,cmd2代表另一條指令

指令 說明

相關推薦

7.Linux系統Bash

目錄 本地變數 環境變數 位置變數 1.瞭解Shell  1.1.什麼是Shell? 翻譯成中文shell就是外殼的意思,那他有什麼用?我們知道管理整個計算機硬體的其實是作業系

02.Linux系統Bash初識

bash初識1.Linux系統終端概述 服務器終端切換: Ctrl + Alt + F1 … F6虛擬機終端切換: Ctrl +Shift +Alt +F1 … F6虛擬終端由mingetty程序生成 //物理機執行為本地終端 [root@linux ~]# tty /dev/tty1 //通過網絡使用模擬

centos 7 linux系統預設ftp安裝配置和部署(詳細講解)

轉載自:https://www.cnblogs.com/mujingyu/p/7677273.html 小生接觸 Linux 系統時間不長,想解決linux系統ftp安裝及部署問題,折騰了大半天,終於弄出來了,將各路 高手的配置方法綜合了一下,如有不對之處,歡迎各位看客指正,感謝! 一、

centos 7 linux系統安裝 mysql5.7.17(glibc版)

gre start mys 一次 執行命令 活躍 ket man 內存不足 本文原出處地址 https://www.cnblogs.com/mujingyu/p/7689116.html 一、安裝前的檢查   1.1 檢查 linux 系統版本     [ro

Linux】centos 7 linux系統預設ftp安裝配置和部署(詳細講解)

小生接觸 Linux 系統時間不長,想解決linux系統ftp安裝及部署問題,折騰了大半天,終於弄出來了,將各路 高手的配置方法綜合了一下,如有不對之處,歡迎各位看客指正,感謝! 一、宣告:   本文采用作業系統版本: Centos 7 Linux系統     版本源:C

ContOS 6.7:Linux系統MySql自動升級

1:刪除Linux中可能殘留的mysql [[email protected] ~]# rpm -e --nodeps mysql 2:安裝mysql [[email protected] ~]# yum install -y mysql-

Linux入門基礎 #7 Linux系統常用命令

Linux入門基礎 #7 Linux系統常用命令 日期時間 命令date用以檢視、設定當前系統時間 date -u 檢視格林威治時間(UTC) da

Linux系統Bash的常用功能(9)

瞭解了基本的Linux檔案檔案系統的概念後,我們將更深入的瞭解一下Linux的其他方面的內容,那就是我們所使用的使用者介面,也就是大家常聽到的 『Shell』 ,『這個shell並不是黑客反彈的shell』,而是一種Linux的命令介面,在 Linux 的世界中,預設使用的是 GNU 開發出來的 shell

Linux系統下安裝Mysql5.7.18教程收集分享

最後一行 sdn 作者 tails lin 分享 使用 心態 html 本人最近服務器新手入門,需要搭建一個在linux虛擬機上的服務器 第一天再裝虛擬機,選的linux系統CentOS,一切順利。 第二天,要給虛擬機裝Mysql,但是需要用到命令行進行安裝/操作等,我是一

Day 7 Linux系統監控、硬盤分區等

char 實時 系統監控 份額 chan 標準 lock mkfs.ext4 登錄 Linux之系統監控、硬盤分區等 系統監控 系統監視和進程控制工具—top和free 1) 掌握top命令的功能:top命令是Linux下常用的性能分析工具,能夠實時顯示

[CentOS 7系列]linux系統文件類型

linux 文件夾 而且 ls命令是linux下最常用的命令。ls命令就是list的縮寫。通過ls 命令不僅可以查看linux文件夾包含的文件,而且可以查看文件權限(包括目錄、文件夾、文件權限)查看目錄信息等等。1.命令格式: ls [選項] [目錄名]2.命令功能: 列出目標目錄中所

Linux系統基礎》隨堂筆記5 7.24

父進程 style spa 腳本 ctrl+ 進程信息 任務計劃 查看內容 job 操作步 1.磁盤分區 2.創建物理卷 ——列出物理卷 —— 顯示物理卷屬性 創建卷組 ——列出卷 組—— 顯示卷組屬性 創建邏輯卷 ——列出邏輯卷 —— 顯示邏輯卷屬性 3.格式化(創建

linux系統啟動流程(CentOS5/6/7為例)

centos 系統一個操作系統要完整啟動起來需要哪些步驟呢?今天以CentOS為例探索一下linux的啟動流程;一、Linux系統的組成--kernel+rootfs(根文件系統)kernel: 內核,進行進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能等等rootfs: 根文件系統1.內核設計流派

Linux運維系列一 CentOS 7桌面系統加入到Samba4 AD域環境中

samba4 ads microsoft 解析器 集成 文章 groups 程序 用戶和用戶組 這篇文章講述了如何使用 Authconfig-gtk 工具將 CentOS 7 桌面系統加入到 Samba4 AD 域環境中,並使用域帳號登錄到 CentOS 系統。 要求 1、

Linux系統7個運行級別

Linux系統有7個運行級別Linux系統有7個運行級別(runlevel)運行級別0:系統停機狀態,系統默認運行級別不能設為0,否則不能正常啟動運行級別1:單用戶工作狀態,root權限,用於系統維護,禁止遠程登陸運行級別2:多用戶狀態(沒有NFS)運行級別3:完全的多用戶狀態(有NFS),登陸後進入控制臺命

linux系統安裝mysql5.7.21版本數據庫

MYSQL安裝1、下載數據庫版本 mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz 2、解壓 tar -zxvf mysql-5.7.21-linux-glibc2.12-x86_64.tar.gzmv mysql-5.7.21-linux-glibc2.12-x86_64

Linux王子教你安裝CentOS 7.4系統

安裝Cent OS 7.4系統第1章 安裝CentOS 7.41.1安裝方法選擇和相應的準備工作:1)下載Cent OS 7.4光盤鏡像文件到官方鏡像站點下載:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708

Linux系統centos-7在vmware14下的安裝

tps proc lvm卷 根據 失效 nload 操作系統 -o 出現 1.下載安裝VMware虛擬軟件 VMware是一款虛擬機軟件,首先這個是一款軟件,可以與在windows環境下運行,你可以在這個軟件上虛擬一個操作系統,這個操作系統跟真正的操作系統操作上基本沒有區別

Linux系統安裝MySQL5.7,授權遠程登陸

word file 空間 useradd ncurses boost 二進制 lac abc 開始安裝前先關閉防火墻:systemctl stop firewalld.serviceSetenforce 0首先安裝所需要的配置環境:yum -y install ncurse

Linux系統CentOS 7配置Spring Boot運行環境

創建 entos linux () 如果 博客 配置服務 oracle 自啟 從阿裏雲新買的一臺Linux服務器,用來部署SpringBoot應用,由於之前一直使用Debian版本,環境配置有所不同,也較為繁瑣,本文主要介紹CentOS下配置SpringBoot環境的過程