科普 | Shell中傻傻分不清楚的TOP3
近來小姐姐又犯憨憨錯(cuò)誤,問組內(nèi)小伙伴export命令不會(huì)持久化環(huán)境變量嗎?反正我是問出口了。。然后小伙伴就甩給了我一個(gè)《The Linux Command Line》PDF鏈接。感謝老大不殺之恩~
Shell是命令解釋器,它會(huì)接受用戶輸入的各種命令,并傳遞給操作系統(tǒng)執(zhí)行。它的作用類似于Windows系統(tǒng)的命令行。在UNIX或Linux系統(tǒng)中,Shell即是用戶交互的界面,也是控制系統(tǒng)的腳本語言。當(dāng)然現(xiàn)在用戶也可以選擇圖形化界面做一些和操作系統(tǒng)的交互。層次示意圖如下:
對(duì)于初學(xué)者來說,可能搞不清楚Shell怎么會(huì)有那么多分類,Shell的語法怎么那么隨便...
小姐姐結(jié)合自己初學(xué)Shell傻傻分不清的問題點(diǎn),主要從Shell的種類,變量的分類,條件測(cè)試的表達(dá)三個(gè)部分來介紹。
Shell的種類
shell程序有sh,bash,zsh等分類,我從網(wǎng)上找到一張圖可以看出shell程序的發(fā)展史。
對(duì)于這些Shell程序,其語法或多或少有一些差異,不過我們通常使用的都是bash。
Shell程序信息
在Linux系統(tǒng)我們可以通過一些命令查看或修改當(dāng)前Shell程序信息。
一般發(fā)行版的Linux系統(tǒng)中,默認(rèn)的shell程序就是bash。我們?cè)趯憇hell腳本時(shí),通常也會(huì)在腳本文件頭部指定bash作為腳本解釋器。
這里多說一句,zsh有時(shí)也作為猿媛們的默認(rèn)shell。zsh語法大多是和bash匹配的,也不會(huì)影響shell腳本的執(zhí)行(因?yàn)槟_本頭部指定bash就還是bash:),也不會(huì)影響像小姐姐這樣的渣渣使用。用它是因?yàn)樗猩衿娴拈_源框架 Oh My God.. 哦不,是?Oh My Zsh?!!!
后面的內(nèi)容我們還是以Linux系統(tǒng)中的bash為例來介紹:)
變量的分類
Shell是一門動(dòng)態(tài)類型語言和弱類型語言,我們可以把變量理解為KV對(duì),key是變量名,value是變量值。變量大體可以分為環(huán)境變量,系統(tǒng)變量,用戶定義的變量三類。
環(huán)境變量
比如我們經(jīng)常配置的JAVA_HOME就屬于環(huán)境變量,這些變量是所有Shell程序運(yùn)行時(shí)都可以使用的變量。關(guān)于環(huán)境變量的操作命令舉例如下:
使用export命令定義的環(huán)境變量只在當(dāng)前運(yùn)行的shell進(jìn)程中有效,結(jié)束進(jìn)程就沒了。所以我們要將配置變量定義在令小姐姐懵逼的一系列配置文件中,持久化下來。
說起配置文件,又不得不先提下shell程序和用戶的Interactive和Login模式:)
-
Interactive & Non-Interactive
Interactive通常是指讀入寫出數(shù)據(jù)都是從用戶的terminal,也就是我們平時(shí)用命令行打開終端就是Interactive模式,而執(zhí)行一個(gè)shell腳本就是Non-interactive模式。怎么檢驗(yàn)當(dāng)前shell運(yùn)行的模式是不是Interactive呢?小姐姐從GNU網(wǎng)站拷貝了一段腳本:
case "$-" in *i*) echo This shell is interactive ;; *) echo This shell is not interactive ;; esac結(jié)果如上所述。
-
Login & Non-Login
Login模式指的是用戶成功登錄后開啟的shell進(jìn)程,這時(shí)候會(huì)讀取/etc/passwd下用戶所屬的shell去執(zhí)行。
Non-login模式指的是非登錄用戶狀態(tài)下開啟的shell進(jìn)程,我們可以通過echo $0區(qū)分。
扯這么多是因?yàn)榕渲梦募募虞d順序和shell進(jìn)程是否運(yùn)行在Interactive和Login模式有關(guān)系:D
-
配置文件加載順序
這是阿姨從網(wǎng)上粘的圖。bash支持的配置文件有/etc/profile,~/.bashrc等。
當(dāng)調(diào)用一個(gè)Interactive&Login模式的shell進(jìn)程時(shí),配置文件的加載順序?yàn)?#xff1a;
/etc/profile?—>( ~/.bash_profile, ~/.bash_login, ~/.profile)其中之一?—>~/.bash_loginout(退出shell時(shí)調(diào)用)
當(dāng)調(diào)用一個(gè)Interactive&non-Login模式的shell進(jìn)程時(shí),配置文件的加載順序?yàn)?#xff1a;
/etc/bash.bashrc?—>~/.bashrc
當(dāng)調(diào)用一個(gè)non-nteractive模式的shell進(jìn)程時(shí),通常是執(zhí)行腳本時(shí),此時(shí)配置項(xiàng)是從環(huán)境變量中讀取和執(zhí)行的,也就是env命令輸出的配置項(xiàng)。
另外,在開啟一個(gè)shell進(jìn)程中,有一些參數(shù)的值也會(huì)影響到配置文件的加載。如--rcfile,--norc等。這些參數(shù)的含義值可以使用man bash進(jìn)一步了解。只要保持默認(rèn)值,其實(shí)就是我們上面介紹的配置文件加載順序。
還有,在發(fā)行版的Linux系統(tǒng)中,Interactive&Login模式下的~/.bash_profile, ~/.bash_login, ~/.profile并不一定是三選一,看一下這三個(gè)腳本的內(nèi)容會(huì)發(fā)現(xiàn)他們會(huì)繼續(xù)調(diào)用下一個(gè)它想調(diào)用的配置文件,這樣就可以避免配置項(xiàng)可能需要在不同的配置文件多次配置的弊端了。如centos7.2 中 ~/.bash_profile文件中實(shí)際調(diào)用了 ~/.bashrc文件。
按照模式和參數(shù)設(shè)置啟動(dòng)的shell程序的配置文件加載流程圖如下:
好了,到目前我們總算把環(huán)境變量中配置文件的加載順序理清了。下面列舉一些常用的Shell環(huán)境變量吧。
系統(tǒng)變量
Shell中系統(tǒng)變量主要在對(duì)參數(shù)判斷和命令返回值判斷時(shí)使用,包括腳本和函數(shù)的參數(shù)和返回值判斷。沒啥可說的,主要難記且腳本中經(jīng)常出現(xiàn):
用戶自定義的變量
是指我們?cè)谑褂妹罨蚰_本時(shí)定義的變量,因?yàn)閟hell是弱類型語言且語法XX,這里主要談?wù)劤鯇W(xué)時(shí)的幾個(gè)坑爹點(diǎn):
-
“=” 左右兩邊不能有空格
你懂我說的意思了吧。。
-
引用
所謂引用,指的是將字符串用引用符號(hào)包括起來,以防止其中的特殊符號(hào)被Shell解釋為其他涵義。
常用的引用符號(hào)如下:
-
$
前面我們其實(shí)一直在用“$變量名來表示某個(gè)變量名的值,這其實(shí)也正是$的作用。
-
Shell中變量名的大小寫是敏感的
好了就這么多吧。
條件測(cè)試的表達(dá)
Shell腳本中除了變量,還經(jīng)常出現(xiàn)的語法就是條件測(cè)試的判斷。不會(huì)寫腳本的開發(fā)小姐姐不是好運(yùn)維,我們來一起侃侃吧。
基本語法
在Shell程序中,當(dāng)指定的條件為真時(shí),整個(gè)條件測(cè)試的返回值為 0;反之,如果指定的條件為假時(shí),整個(gè)條件測(cè)試的返回值為 非0。
條件測(cè)試表達(dá)式的書寫有test expression?和?[ expression ]兩種形式,注意后者的空格一定不能省!!
腳本中經(jīng)常出現(xiàn)的有字符串測(cè)試、數(shù)字測(cè)試、文件測(cè)試、邏輯操作符測(cè)試。我們一起看下:)
字符串測(cè)試
注意:這里運(yùn)算符 左右兩邊又一定要有空格了(下同),這樣shell才能將之當(dāng)成命令執(zhí)行。
數(shù)字測(cè)試
文件測(cè)試
邏輯操作符測(cè)試
收藏 在看 轉(zhuǎn)發(fā)?起來,小姐姐就算你條件測(cè)試過關(guān)了>_<
?
參考資料:
[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/
總結(jié)
以上是生活随笔為你收集整理的科普 | Shell中傻傻分不清楚的TOP3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通俗讲解分布式锁,看完不懂算作者输
- 下一篇: 我是如何用 Redis 做实时订阅推送的