Shell中傻傻分不清楚的TOP3

Shell中傻傻分不清楚的TOP3
發佈文章
html

近來小姐姐又犯憨憨錯誤,問組內小夥伴export命令不會持久化環境變量嗎?反正我是問出口了。。而後小夥伴就甩給了我一個《The Linux Command Line》PDF連接。感謝老大不殺之恩~node

Shell是命令解釋器,它會接受用戶輸入的各類命令,並傳遞給操做系統執行。它的做用相似於Windows系統的命令行。在UNIX或Linux系統中,Shell便是用戶交互的界面,也是控制系統的腳本語言。固然如今用戶也能夠選擇圖形化界面作一些和操做系統的交互。層次示意圖以下:
linux

對於初學者來講,可能搞不清楚Shell怎麼會有那麼多分類,Shell的語法怎麼那麼隨便...shell

小姐姐結合本身初學Shell傻傻分不清的問題點,主要從Shell的種類,變量的分類,條件測試的表達三個部分來介紹。express

Shell的種類

shell程序有shbash,zsh等分類,我從網上找到一張圖能夠看出shell程序的發展史。

對於這些Shell程序,其語法或多或少有一些差別,不過咱們一般使用的都是bash。centos

  • Shell程序信息

在Linux系統咱們能夠經過一些命令查看或修改當前Shell程序信息。
bash

通常發行版的Linux系統中,默認的shell程序就是bash。咱們在寫shell腳本時,一般也會在腳本文件頭部指定bash做爲腳本解釋器。
session

這裏多說一句,zsh有時也做爲猿媛們的默認shell。zsh語法大可能是和bash匹配的,也不會影響shell腳本的執行(由於腳本頭部指定bash就仍是bash:),也不會影響像小姐姐這樣的渣渣使用。用它是由於它有神奇的開源框架 Oh My God.. 哦不,是 Oh My Zsh !!!app

後面的內容咱們仍是以Linux系統中的bash爲例來介紹:)框架

變量的分類

Shell是一門動態類型語言和弱類型語言,咱們能夠把變量理解爲KV對,key是變量名,value是變量值。變量大致能夠分爲環境變量系統變量用戶定義的變量三類。

  • 環境變量

好比咱們常常配置的JAVA_HOME就屬於環境變量,這些變量是全部Shell程序運行時均可以使用的變量。關於環境變量的操做命令舉例以下:

使用export命令定義的環境變量只在當前運行的shell進程中有效,結束進程就沒了。因此咱們要將配置變量定義在令小姐姐懵逼的一系列配置文件中,持久化下來。

提及配置文件,又不得不先提下shell程序和用戶的Interactive和Login模式:)

  • Interactive & Non-Interactive`

Interactive一般是指讀入寫出數據都是從用戶的terminal,也就是咱們平時用命令行打開終端就是Interactive模式,而執行一個shell腳本就是Non-interactive模式。怎麼檢驗當前shell運行的模式是否是Interactive呢?小姐姐從GNU網站拷貝了一段裝X腳本:

case "$-" in
*i*)	echo This shell is interactive ;;
*)	echo This shell is not interactive ;;
esac

結果如上所述。

  • Login & Non-Login`

Login模式指的是用戶成功登陸後開啓的shell進程,這時候會讀取/etc/passwd下用戶所屬的shell去執行。

Non-login模式指的是非登陸用戶狀態下開啓的shell進程,咱們能夠經過echo $0區分。

扯這麼可能是由於配置文件的加載順序和shell進程是否運行在Interactive和Login模式有關係:D


這是阿姨從網上粘的圖。bash支持的配置文件有/etc/profile,~/.bashrc等。

當調用一個Interactive&Login模式的shell進程時,配置文件的加載順序爲:

/etc/profile —>( ~/.bash_profile, ~/.bash_login, ~/.profile)其中之一 —>~/.bash_loginout(退出shell時調用)

當調用一個Interactive&non-Login模式的shell進程時,配置文件的加載順序爲:

/etc/bash.bashrc —> ~/.bashrc
當調用一個non-nteractive模式的shell進程時,一般是執行腳本時,此時配置項是從環境變量中讀取和執行的,也就是env命令輸出的配置項。

另外,在開啓一個shell進程中,有一些參數的值也會影響到配置文件的加載。如--rcfile ,--norc等。這些參數的含義值可使用 man bash進一步瞭解。只要保持默認值,其實就是咱們上面介紹的配置文件加載順序。

還有,在發行版的Linux系統中,Interactive&Login模式下的~/.bash_profile,
~/.bash_login, ~/.profile並不必定是三選一,看一下這三個腳本的內容會發現他們會繼續調用下一個它想調用的配置文件,這樣就能夠避免配置項可能須要在不一樣的配置文件屢次配置的弊端了。如centos7.2 中 ~/.bash_profile文件中實際調用了 ~/.bashrc文件。

按照模式和參數設置啓動的shell程序的配置文件加載流程圖以下:

好了,到目前咱們總算把環境變量中配置文件的加載順序理清了。下面列舉一些經常使用的Shell環境變量吧。

  • 系統變量
    Shell中系統變量主要在對參數判斷和命令返回值判斷時使用,包括腳本和函數的參數和返回值判斷。沒啥可說的,主要難記且腳本中常常出現:

  • 用戶自定義的變量
    是指咱們在使用命令或腳本時定義的變量,由於shell是弱類型語言且語法XX,這裏主要談談初學時的幾個坑爹點:

  • 「=」 左右兩邊不能有空格

    你懂我說的意思了吧。。

  • 引用
    所謂引用,指的是將字符串用引用符號包括起來,以防止其中的特殊符號被Shell解釋爲其餘涵義。

經常使用的引用符號以下:

  • $

前面咱們其實一直在用 「 $變量名 」 來表示某個 變量名的值,這其實也正是 $ 的做用。

  • shell中變量名的大小寫是敏感的

好了就這麼多吧。

條件測試的表達

shell腳本中除了變量,還常常出現的語法就是條件測試的判斷。不會寫腳本的開發小姐姐不是好運維,咱們來一塊兒侃侃吧。

  • 基本語法

在Shell程序中,當指定的條件爲真時,整個條件測試的返回值爲 0;反之,若是指定的條件爲假時,整個條件測試的返回值爲 非0。

條件測試表達式的書寫有test expression[ expression ]兩種形式,注意後者的空格必定不能省!!

腳本中常常出現的有字符串測試、整數測試、文件測試、邏輯操做符測試。咱們一塊兒看下:)

  • 字符串測試

注意:這裏運算符 左右兩邊又必定要有空格了(下同),這樣shell才能將之當成命令執行。

  • 整數測試

  • 文件測試

邏輯操做符測試

收藏在看轉發起來,小姐姐就算你條件測試過關了>_<

感謝大佬這麼優秀還關注我~

參考資料:
[1].《Shell從入門到精通》
[2].https://www.edureka.co/blog/types-of-shells-in-linux/
[3].http://www.penguintutor.com/linux/basic-shell-reference
[4].https://apple.stackexchange.com/questions/361870/what-are-the-practical-differences-between-bash-and-zsh
[5].https://sunlightmedia.org/bash-vs-zsh/
[6].https://unix.stackexchange.com/questions/439042/debian-read-order-of-bash-session-configuration-files-inconsistent
[7].https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
[8].http://howtolamp.com/articles/difference-between-login-and-non-login-shell/
[9].https://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/

Shell中傻傻分不清楚的TOP3
同步滾動:

近來小姐姐又犯憨憨錯誤,問組內小夥伴export命令不會持久化環境變量嗎?反正我是問出口了。。而後小夥伴就甩給了我一個《The Linux Command Line》PDF連接。感謝老大不殺之恩~

Shell是命令解釋器,它會接受用戶輸入的各類命令,並傳遞給操做系統執行。它的做用相似於Windows系統的命令行。在UNIX或Linux系統中,Shell便是用戶交互的界面,也是控制系統的腳本語言。固然如今用戶也能夠選擇圖形化界面作一些和操做系統的交互。層次示意圖以下:

對於初學者來講,可能搞不清楚Shell怎麼會有那麼多分類,Shell的語法怎麼那麼隨便...

小姐姐結合本身初學Shell傻傻分不清的問題點,主要從Shell的種類,變量的分類,條件測試的表達三個部分來介紹。

Shell的種類
shell程序有sh,bash,zsh等分類,我從網上找到一張圖能夠看出shell程序的發展史。

對於這些Shell程序,其語法或多或少有一些差別,不過咱們一般使用的都是bash。
Shell程序信息
在Linux系統咱們能夠經過一些命令查看或修改當前Shell程序信息。

通常發行版的Linux系統中,默認的shell程序就是bash。咱們在寫shell腳本時,一般也會在腳本文件頭部指定bash做爲腳本解釋器。

這裏多說一句,zsh有時也做爲猿媛們的默認shell。zsh語法大可能是和bash匹配的,也不會影響shell腳本的執行(由於腳本頭部指定bash就仍是bash:),也不會影響像小姐姐這樣的渣渣使用。用它是由於它有神奇的開源框架 Oh My God.. 哦不,是 Oh My Zsh !!!

後面的內容咱們仍是以Linux系統中的bash爲例來介紹:)

變量的分類
Shell是一門動態類型語言和弱類型語言,咱們能夠把變量理解爲KV對,key是變量名,value是變量值。變量大致能夠分爲環境變量,系統變量,用戶定義的變量三類。

環境變量
好比咱們常常配置的JAVA_HOME就屬於環境變量,這些變量是全部Shell程序運行時均可以使用的變量。關於環境變量的操做命令舉例以下:

使用export命令定義的環境變量只在當前運行的shell進程中有效,結束進程就沒了。因此咱們要將配置變量定義在令小姐姐懵逼的一系列配置文件中,持久化下來。

提及配置文件,又不得不先提下shell程序和用戶的Interactive和Login模式:)

Interactive & Non-Interactive`
Interactive一般是指讀入寫出數據都是從用戶的terminal,也就是咱們平時用命令行打開終端就是Interactive模式,而執行一個shell腳本就是Non-interactive模式。怎麼檢驗當前shell運行的模式是否是Interactive呢?小姐姐從GNU網站拷貝了一段裝X腳本:

case "$-" in
i) echo This shell is interactive ;;
*) echo This shell is not interactive ;;
esac
結果如上所述。

Login & Non-Login`
Login模式指的是用戶成功登陸後開啓的shell進程,這時候會讀取/etc/passwd下用戶所屬的shell去執行。

Non-login模式指的是非登陸用戶狀態下開啓的shell進程,咱們能夠經過echo $0區分。

扯這麼可能是由於配置文件的加載順序和shell進程是否運行在Interactive和Login模式有關係:D

這是阿姨從網上粘的圖。bash支持的配置文件有/etc/profile,~/.bashrc等。

當調用一個Interactive&Login模式的shell進程時,配置文件的加載順序爲:

/etc/profile —>( ~/.bash_profile, ~/.bash_login, ~/.profile)其中之一 —>~/.bash_loginout(退出shell時調用)

當調用一個Interactive&non-Login模式的shell進程時,配置文件的加載順序爲:

/etc/bash.bashrc —>~/.bashrc
當調用一個non-nteractive模式的shell進程時,一般是執行腳本時,此時配置項是從環境變量中讀取和執行的,也就是env命令輸出的配置項。

另外,在開啓一個shell進程中,有一些參數的值也會影響到配置文件的加載。如--rcfile ,--norc等。這些參數的含義值可使用man bash進一步瞭解。只要保持默認值,其實就是咱們上面介紹的配置文件加載順序。

還有,在發行版的Linux系統中,Interactive&Login模式下的~/.bash_profile,
~/.bash_login, ~/.profile並不必定是三選一,看一下這三個腳本的內容會發現他們會繼續調用下一個它想調用的配置文件,這樣就能夠避免配置項可能須要在不一樣的配置文件屢次配置的弊端了。如centos7.2 中 ~/.bash_profile文件中實際調用了 ~/.bashrc文件。

按照模式和參數設置啓動的shell程序的配置文件加載流程圖以下:

好了,到目前咱們總算把環境變量中配置文件的加載順序理清了。下面列舉一些經常使用的Shell環境變量吧。

系統變量
Shell中系統變量主要在對參數判斷和命令返回值判斷時使用,包括腳本和函數的參數和返回值判斷。沒啥可說的,主要難記且腳本中常常出現:

用戶自定義的變量
是指咱們在使用命令或腳本時定義的變量,由於shell是弱類型語言且語法XX,這裏主要談談初學時的幾個坑爹點:

「=」 左右兩邊不能有空格

你懂我說的意思了吧。。

引用
所謂引用,指的是將字符串用引用符號包括起來,以防止其中的特殊符號被Shell解釋爲其餘涵義。

經常使用的引用符號以下:

$
前面咱們其實一直在用 「 變量名 」 來表示某個 變量名的值,這其實也正是 的做用。

shell中變量名的大小寫是敏感的
好了就這麼多吧。

條件測試的表達
shell腳本中除了變量,還常常出現的語法就是條件測試的判斷。不會寫腳本的開發小姐姐不是好運維,咱們來一塊兒侃侃吧。

基本語法
在Shell程序中,當指定的條件爲真時,整個條件測試的返回值爲 0;反之,若是指定的條件爲假時,整個條件測試的返回值爲 非0。

條件測試表達式的書寫有test expression 和 [ expression ]兩種形式,注意後者的空格必定不能省!!

腳本中常常出現的有字符串測試、整數測試、文件測試、邏輯操做符測試。咱們一塊兒看下:)

字符串測試

注意:這裏運算符 左右兩邊又必定要有空格了(下同),這樣shell才能將之當成命令執行。

整數測試

文件測試

邏輯操做符測試

收藏在看轉發起來,小姐姐就算你條件測試過關了>_<

感謝大佬這麼優秀還關注我~

參考資料:
[1].《Shell從入門到精通》
[2].https://www.edureka.co/blog/types-of-shells-in-linux/
[3].http://www.penguintutor.com/linux/basic-shell-reference
[4].https://apple.stackexchange.com/questions/361870/what-are-the-practical-differences-between-bash-and-zsh
[5].https://sunlightmedia.org/bash-vs-zsh/
[6].https://unix.stackexchange.com/questions/439042/debian-read-order-of-bash-session-configuration-files-inconsistent
[7].https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
[8].http://howtolamp.com/articles/difference-between-login-and-non-login-shell/
[9].https://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/

相關文章
相關標籤/搜索