linux shell從入門到精通(二)——變量操作

1.什么是變量

??變量在許多程序設計語言中都有定義,與變量相伴地有使用范圍地定義。Linux Shell也不例外。變量,本質上就是一個鍵值對。例如:

str=“hello”

??就是將字符串值“hello”賦予鍵str。在str地使用范圍內,我們都可以用str來引用“hello”值,這個操作叫做變量替換。

2.Linux Shell中的變量

??Shell變量的名稱以一個字母或下劃線符號開始,后面可以接任意長度的字母、數字或下劃線。和許多其它程序設計語言不同的是,Shell變量名稱字符并沒有長度限制。Linux Shell并不對變量區分類型。一切值都是字符串,并且和變量名一樣,值并沒有字符長度限制。神奇的是,bash也允許比較操作和整數操作,其中關鍵因素是,變量中的字符串值是否為數字。
例1

#! /bin/sh
long_str="Linux_Shell_programming"
echo $long_str

??例2

#! /bin/sh
add_1=100
add_2=200
echo $((add_1+add_2))

??由例1例2的輸出“Linux_Shell_programming”和“300”可見,雖然Linux Shell中的變量都是字符串類型的,但是同樣可以執行比較操作和整數操作,,只要變量字符串值是數字。
變量賦值的方式為:變量名稱=值,其中“=”兩邊不要有任何空格。當你想使用變量名稱來獲得值時,在名稱前加上$。例如:$long_str。
當變量裸體出現的時候(沒有$前綴的時候),變量可能存在如下幾種情況:

  1. 變量被聲明或被復制
  2. 變量被unset
  3. 變量被export

??被一對雙引號(“”)括起來的變量替換是不會被阻止的。所以雙引號被稱為部分引用,有時又被稱為“弱引用”。但是如果使用單引號的話(‘’),那么變量替換就會被禁止了,變量名只會被解釋成字面的意思,不會發生變量替換。所以單引號被稱為“全引用”,有時候也被稱為“強引用”,例如:

#! /bin/sh
var=123
echo '$var' 
echo "$var"

??在這個例子中,單引號中的$var沒有替換成變量值123,也就是說,變量替換被禁止了;而雙引號中的$var發生了變量替換。
在Shell的世界里,變量值可以是空值(“NULL” 值),就是不包含任何字符。這種情況很常見,并且也是合理的。但是在算術操作中,這個未初始化的變量常常看起來是0。但是這是一個未文檔化(并且可能是不可移植)的行為。

#! /bin/sh
echo "$uninit" ## 沒有輸出let "uninit += 5"
echo "$uninit" ##輸出為5

3.全局變量和局部變量

??顧名思義,局部變量的可見范圍是代碼塊或函數中,這一點與大部分編程語言是相同的。但是,局部變量必須明確以local生命,否則即使在代碼塊中,它也是全局可見的。
環境變量是全局變量的一種,全局變量在全局范圍內可見,在聲明全局變量時,不需要加任何修飾詞。
下面看一下這個例子:

#! /bin/sh
num=123func1()
{
num=321
echo $num
}func2()
{
local num=456
echo $num
}echo $num
func1
echo $num
func2
echo $num

??這個程序的輸出結果為:

123 ##初始值
321 ##func1內被改變
321 ##func1內的賦值影響到函數體外
456 ##func2內聲明局部變量
321 ##函數體外的num未改變
  • 我們設置了一個變量num,初始值賦值為123
  • 調用func1,func1中的賦值命令num=321將num=123覆蓋。注意,此處雖然位于函數體內,但是還是能夠修改全局變量,此處的num變量就是全局環境中的num
  • 調用func2,func2中定義了局部變量num,并且賦值456,在func2內部,num變量的值為456,此時為局部的;當func2返回后,回到全局作用區,此時num的值并未改變,為321

4.用echo輸出變量

??echo命令的任務就是輸出一行文本,多用于提示用戶或產生數據,我們將在echo的manpage中顯示更多選項。

語法:
echo [OPTION] … [STRING] …
描述:
允許在標準輸出上顯示STRING
主要選項:
-n 不輸出行尾的換行符
行為模式:
echo將各個參數打印到標準輸出,參數間以一個空格隔開,在輸出結束后,換行,它會解釋每個字符串里的轉義序列,轉義序列可以用來表示特殊字符,以及控制其行為模式
警告:
echo命令的-n選項并不被所有Linux版本支持,POSIX標準中并未包含此選項

??轉義字符可以表示程序中難以看得見或者難以食醋胡的特殊字符,當echo遇到轉義序列時,就會打印相應的字符,echo支持的轉義字符如下表:

序列描述
\a報警符,ACSII的BEL字符
\b退格符
\c禁止尾隨,這個字符后面的所有字符
\f換頁符
\n換行符
\r回車符
\t水平制表符
\v垂直制表符
\反斜線

5.環境變量的相關操作

??在通常情況下,每個進程都有自己的“環境”,這個環境是由一組變量組成的,這些變量中存有進程可能需要引用的信息。在這種情況下,Shell與一般的進程沒什么區別。
每次當一個Shell啟動時,它都將創建適合于自己環境變量的Shell變量,更新或者添加一個新的環境變量的話,這個Shell都會立刻更新它自己的環境(換句話說,更改或添加的變量會立即生效),并且所有后繼生成的Shell子進程(即這個Shell所執行的命令)都會繼承這個環境
如果一個腳本要設置一個環境變量,那么需要將這些變量“export”出來,也就是需要同之到腳本本地的環境,這是export命令的功能。
一個腳本只能夠export變量到這個腳本所產生的子進程,也就說只能夠對這個腳本所產生的命令和進程起作用。如果腳本是從命令行中調用的,那么這個腳本所export的變量是不能影響命令行環境的。也就是說,子進程不能夠export變量來影響產生自己的父進程的環境的。但是,當使用source命令執行腳本時,因為沒有子進程的產生,此時腳本中的export命令將會影響父進程的環境。

語法:
export [-fnp][變量名稱=變量設置值]
描述:
export命令用于設置或顯示環境變量
主要選項:
-f 代表[變量名稱]中的函數名稱
-n 刪除指定的變量,變量實際上并未刪除,只是不會輸出到后續指令的執行環境中
-p 列出所有的Shell賦予程序的環境變量
行為模式:
export命令修改當前Shell進程的環境變量,若將export命令置于腳本中被調用執行,則export命令對父Shell進程的環境變量沒有影響
警告:
Shell中執行程序時,Shell會提供一組環境變量。export可新增,修改或刪除環境變量,供后續執行的程序使用。export的效力僅及于該此登錄操作

??export命令用于設置當前進程的環境變量,但是有效期僅維持到當前進程消亡位置。下次重新登陸到命令行shell時,以前對Shell的export設置都無法恢復。如果想要把對環境變量的設置永久保存,則可以將export命令置于Shell登錄時執行的啟動文件中
啟動文件包含別名和環境變量,正是這些別名和環境變量才使得Shell可以作為一個用戶Shell來運行,當系統初始化之后,這些別名和變量也可被其他的Shell腳本調用。

啟動文件/登出文件描述
/etc/profile系統范圍的默認值,大部分用來設置環境(所有的sh衍生出的Shell適用)
/etc/bashrc特定于bash的,系統范圍的函數與別名
$HOME/.bash_profile用戶定義的,環境默認設置,在每個用戶的home目錄下都可找到(本地副本保存在/etc/profile)
$HOME/.bashrc用戶定義的bash初始化文件,可以在每個用戶的home目錄下找到(本地副本保存在/etc/profile)。只有交互式的Shell和用戶腳本才會讀取這個文件。
$HOME/.bash_logout登出文件,用戶定義的指令文件,在每個用戶的home目錄下找到。在登出(bash)Shell的時候,這個文件中的命令就會得到執行

??注意,此處 $HOME為環境變量, $HOME變量的值是登錄者的用戶目錄,$HOME目錄下存放有許多用戶個人相關的文件和數據,還有對用戶定制的配置文件。這些配置文件往往以“.”開頭。

6.環境變量的env命令

??export命令設置適用于當前Shell的環境變量值,修改后維持不變,直到當前Shell消亡。env命令則可以臨時改變環境變量值
“-i”選項使Shell在執行echo.s時,清空所有由父Shell繼承來的環境變量,僅僅設置命令中指定的PATH變量(將“./”也添加到命令搜尋路徑里)。這樣,在執行echo.sh時,就不需要給出完全路徑(./echo.sh),直接給出命令文件名,系統就知道在哪里找該命令了。

語法:
env [OPTION] … [-] [NAME=VALUE] … [COMMAND [ARG]…]
描述:
在重建的環境中運行程序,設置環境中的每個NAME為VALUE,并且允許COMMAND。
主要選項:
-i,–ignore-environment
不帶環境變量啟動
-u,-unset=NAME
從環境變量中刪除一個變量
行為模式:
未提供COMMAND時,顯示環境中所有變量的名稱和值。提供COMMAND時,根據參數重建環境變量后,在新的環境中允許COMMAND

??Env函數和set函數不同,Envv函數顯示的時環境變量,而set函數則顯示所有的本地變量,包括利用用戶的環境變量。例如,當用戶在命令行中設置var=123時,set函數將顯示var變量,而env函數則不顯示(var此時是本地變量,不是環境變量)。如果使用export var=123命令,則set命令和env命令都可以顯示var變量。

7.環境變量的unset命令

??unset命令從當前shell刪除函數或變量,刪除變量時,使用“-v”選項,刪除函數時,使用“-f”選項。

語法:
unset [-v] variable…
unset -f function…
描述:
從當前Shell刪除變量或函數
主要選項:
-f
刪除指定的函數
-v
刪除指定的變量。在沒有提供任何選項的情況下,默認此選項
行為模式:如果沒有提供任何選項,則默認unset為刪除變量(-v選項)。如果使用-f選項,則被視為刪除函數操作,參數為函數名稱。

8.Shell中一些常用的環境變量

??Linux是一個多用戶的操作系統,每個用戶登錄系統后,都會有一個專用的運行環境。通常用戶默認的環境都是相同的,這個默認環境實際上就是一組環境變量的定義。用戶可以對自己的運行環境進行定制,其方法就是修改相應的系統環境變量。

變量名描述
HOME用戶的專屬目錄,在linux中用“~”擴展
PATH外部命令的搜索路徑
HISTSIZE保存歷史命令記錄的條數
LOGNAME當前用戶的登錄名
LOGNAME當前用戶的登錄名
HOSTNAME是指主機的名稱,許多應用程序如果要用到主機名的話,通常是從這個環境變量中來取得
SHELL當前用戶使用的shell類型
LANG/LANGUAGE語言相關的環境變量,使用多種語言的用戶可以修改此環境變量
MAIL當前用戶的郵件存放目錄
PS1/PS2PS1是基本提示符,對于root用戶是"#“,對于普通用戶是是”$“。PS2是專屬提示符,默認是”>"。可以通過修改此環境變量來修改當前的命令符

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916408.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Linux入門] 初學者入門:Linux DNS 域名解析服務詳解

目錄 一、域名服務基礎:從 “名字” 到 “地址” 的轉換 1??什么是域名? 2??什么是 DNS? 3??DNS 用 TCP 還是 UDP? 二、DNS 服務器:各司其職的 “導航站” 1??根域名服務器 2??頂級域名服務器 3??權…

iview表單驗證一直提示為空的幾個原因?

1.Form上的rules是否配置正確; 2.Form-item的prop是否配置正確; 3.規則的名稱和input的v-model是否對應; 4.驗證的字段是否響應,新增字段使用this. $set. © 著作權歸作者所有,轉載或內容合作請聯系作者 平臺聲明&#xff1…

SpringBoot3(若依框架)集成Mybatis-Plus和單元測試功能,以及問題解決

一、Mybatis-Plus集成 新增依賴到父級pom.xml,原先的mybatis依賴可以不動需要注意 mybatis-plus與mybatis版本之間的沖突,不要輕易改動依賴,不然分頁也容易出現問題分類頂級pom.xml下面,如果沒有引入還是出現報錯,在co…

刪除遠程分支上非本分支的提交記錄

要刪除遠程分支上非本分支的提交記錄(即主分支的提交歷史),需要使用 Git 的重寫歷史功能。以下是完整解決方案: 解決方案步驟: 創建干凈的新分支(基于主分支最新提交) # 切換到主分支并更新 git…

Flask input 和datalist結合

<input list"categories" name"category" id"category" class"form-control" placeholder"任務分類" required> 這段代碼是一個 HTML 輸入控件&#xff0c;結合了 <input> 和 <datalist>&#xff0c;用來…

嵌入式分享#27:原來GT911有兩個I2C地址(全志T527)

最近在調試全志T527的觸摸功能時&#xff0c;發現GT911觸摸芯片的I2C地址有時是0x5d&#xff0c;有時又識別成0x14&#xff0c;不知道大家有沒有遇到過類似這個情況。雖然最后使用0x5d地址調通了觸摸功能&#xff0c;但是一直還是很困惑&#xff0c;為什么會出現0x14和0x5d兩個…

Linux運維新人自用筆記(Rsync遠程傳輸備份,服務端、郵箱和客戶端配置、腳本)

內容全為個人理解和自查資料梳理&#xff0c;歡迎各位大神指點&#xff01;每天學習較為零散。day24一、Rsync傳輸文件#安裝rsync#-a遞歸同步&#xff08;包含子目錄&#xff09;保留文件權限、所有者、組、時間戳等元數據 #??-z傳輸時壓縮數據 #??-v顯示詳細同步過程 #??…

以 “有機” 重構增長:云集從電商平臺到健康生活社區的躍遷

當電商行業陷入流量爭奪的紅海&#xff0c;同質化運營模式難以突破增長瓶頸時&#xff0c;云集以從精選電商到有機生活平臺的戰略轉型&#xff0c;開辟出差異化發展路徑。其轉型并非憑經驗決斷的孤例&#xff0c;而是建立在對市場趨勢的精準研判、用戶需求的深度解碼&#xff0…

【2025最新版】midjourney小白零基礎入門到精通教程!人工智能繪圖+AI繪圖+AI畫圖,一鍵出圖教程 (持續更新)

前言 現在市面上相關的AI繪畫工具非常多&#xff0c;有6pen.art、Stable Diffusion、DALL.E、Midjourney等。 而MJ就目前而言&#xff0c;它是一款強大的人工智能工具&#xff0c;旨在幫助設計師和創意人員完成各種設計任務。 非常適合我們圖像工作者&#xff0c;從 UI 設計到…

2025年滲透測試面試題總結-2025年HW(護網面試) 70(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年HW(護網面試) 70 一、自我介紹 二、同源策略 & 三大漏洞對比解析 1. 同源策略&#xff08;SOP&…

加權卡爾曼濾波

加權卡爾曼濾波融合&#xff0c;它通過給不同傳感器或估計結果分配不同的權重&#xff0c;來提高狀態估計的精度和可靠性。一、卡爾曼濾波1.狀態方程2.觀測方程其中&#xff1a;基本方程①狀態一步預測②狀態估計③濾波增益④一步預測均方差⑤估計均方誤差二、加權卡爾曼濾波對…

【世紀龍科技】新能源汽車維護與故障診斷-汽車專業數字課程資源

在職業院校汽車專業教學中&#xff0c;理論與實踐脫節、設備投入不足、學生實操能力薄弱等問題長期存在。如何讓學生在有限的教學資源下掌握新能源汽車核心技術&#xff1f;如何讓教師更高效地開展理實一體化教學&#xff1f;《新能源汽車維護與故障診斷》數字課程資源&#xf…

Windows Server系統安裝JDK,一直卡在“應用程序正在為首次使用作準備,請稍候”

一、背景 第二次遇到這個問題了&#xff0c;但是居然沒想起來之前遇到過&#xff0c;又問元寶給的答案不對&#xff0c;還沒想起來之前收藏過解決方案&#xff0c;這里特別記錄一下。 二、問題描述 操作系統是Windows Sever2019&#xff0c;安裝JDK時卡住一直過不去&#xff0…

機器學習入門:線性回歸詳解與實戰

線性回歸&#xff08;Linear Regression&#xff09;是機器學習中最基礎也最常用的算法之一&#xff0c;無論是初學者入門還是實際業務場景&#xff0c;都能看到它的身影。本文將從概念、原理到代碼實現&#xff0c;帶你全方位了解線性回歸。一、什么是線性回歸&#xff1f;簡單…

第3篇:軟鏈接 mklink /D 教程:輕量緩存目錄遷移利器

我們通過諸多實踐后將三種鏈接方案分別獨立成篇&#xff0c;可以讓不同需求場景的讀者精準獲取所需內容。下面是回顧我們文章系列策劃的三篇博客標題、定位和詳細大綱&#xff0c;每篇都圍繞一個核心方案展開&#xff0c;具備教學性、實用性和實操性&#xff1a; &#x1f4d8;…

力扣 hot100 Day52

124. 二叉樹中的最大路徑和 二叉樹中的 路徑 被定義為一條節點序列&#xff0c;序列中每對相鄰節點之間都存在一條邊。同一個節點在一條路徑序列中 至多出現一次 。該路徑 至少包含一個 節點&#xff0c;且不一定經過根節點。 路徑和 是路徑中各節點值的總和。 給你一個二叉…

數據存儲:OLAP vs OLTP

下面系統性地進行介紹,包括OLAP數據庫的基本概念、特點、常見產品,以及它們在實際工作中的典型應用場景,最后對比與關系型數據庫(OLTP)的區別。 一、OLAP數據庫是什么? OLAP(Online Analytical Processing,聯機分析處理)數據庫,主要用于大數據量、多維度、復雜查詢與…

云原生網絡策略自動化在微服務架構 API 安全防護與流量管理中的應用

云原生網絡策略自動化在微服務架構中的核心價值隨著微服務架構在金融、電商等領域的廣泛應用&#xff0c;API安全防護與流量管理已成為企業數字化轉型的關鍵挑戰。Gartner 2023年報告顯示&#xff0c;83%的分布式系統因網絡策略缺失導致安全事件&#xff0c;而傳統靜態策略配置…

無需云服務器的內網穿透方案 -- cloudflare tunnel

內網穿透 原文地址 https://docs.caolib.dpdns.org/network/cloudflare tunnel.html Cloudflare Tunnel 內網穿透工具 1.簡介 1.1 介紹 官方介紹&#xff1a;Cloudflare Tunnel 為您提供了一種安全的方式&#xff0c;無需公開路由的 IP 地址即可將資源連接到 Cloudflare。使用…

目前市面上arm64-v8a、armeabi-v7a設備的市占率有多少?為什么x86架構的手機越來越少?

deepseek回答&#xff1a; 當前全球范圍內&#xff0c;arm64-v8a 架構在安卓設備中的市占率已超過 64%&#xff0c;遠超其他架構版本。具體分布如下&#xff1a; &#x1f4ca; 各架構市場份額對比 架構類型市占率定位與趨勢arm64-v8a≥64%主流 64 位架構&#xff0c;性能最…