Shell編程-02-Shell變數

来源:https://www.cnblogs.com/surpassme/archive/2018/11/07/9926088.html
-Advertisement-
Play Games

什麼是Shell變數     在初等數學數學方程式中,我們會經常碰到類似於這樣的方程式: y=x+1 ,等號左右兩邊的 x 和 y 稱之為未知數。在編程裡面它們他們則代表變數名與變數值。     通過該示例,我們可以得出一個結論:簡單來說, 變數是編程中最基本 ...


什麼是Shell變數

    在初等數學數學方程式中,我們會經常碰到類似於這樣的方程式:y=x+1 ,等號左右兩邊的xy稱之為未知數。在編程裡面它們他們則代表變數名與變數值。
4-1 變數含義_c2i.jpg

    通過該示例,我們可以得出一個結論:簡單來說,變數是編程中最基本的存儲單位,它會暫時存儲用戶放進去的數據,而存儲的數據位於記憶體空間中,通過正確調用記憶體空間中變數名字即可以取出與之對應的數據。在Shell中定義變數和取值如下所示:

4-2 變數示例.jpg

變數註意事項

1、定義變數的方法,先定義變數名,緊跟賦值操作符=,最後是變數對應的值,中間不能存在空格,否則會出現報錯,這一點是跟其他語言比較大的區別,如下所示:

4-3 變數賦值.jpg

2、列印變數值,需要在變數名前加$${},如下所示:

   echo $y
   echo ${y}

3、變數名只能為字母、數字或下劃線且只能以字母或下劃線開頭(這一點跟大多數語言一樣,至於為什麼請問度娘)

4、變數名需要遵循一定的規範,並且要一見名便知其意。

常見的命令規範有三種:

  • 匈牙利命名法
    該命令方法是在每個變數名前添加表示數據類型的字元
  • 駝峰命名法
    混合使用大小寫字母來對變數進行命名。而且是首字母小寫,後續單詞第一個字母大寫,如userName
  • 帕斯卡命名法
    與駝峰法很很像,每個單詞第一個字母均大寫,如UserName

5、環境變數需要全部採用大寫形式書寫

6、在其他強類開語言中(如Java/C#)對數據類型都有其嚴格的定義,如整型int、字元char、字元串string、小數float/double/decimal等等。而在Shell中,預設是不區分變數類型的。如果需要顯式定義變數類型,則可以使用declare定義。

7、如果要在crond做定時任務時需要在Shell腳本中使用環境變數需要先在執行腳本中重新定義

變數類型

    變數可分為兩類:環境變數(全局變數)普通變數(局部變數),而環境變數又可以分為bash內置環境變數用戶自定義環境變數。詳細可參考下圖所示:

4-4 變數類型_c2i.jpg

環境變數(全局變數):可以在創建它們的Shell和其任意子Shell進程中使用
普通變數(局部變數):僅能在創建它們的Shell函數和腳本中使用

內置環境變數

    環境變數一般是指使用export內置命令導出的變數,用於定義Shell的運行環境、保證Shell命令的正確執行。Shell通過環境變數來確定登錄用戶名、命令路徑、終端類型、登錄目錄等,所有的環境變數都是系統全局變數,可用於所有子進程中。
    環境變數可以在命令行中設置和創建,但在用戶退出命令行時這些變數值就會丟失。如果希望永久保存環境變數,可以在用戶目錄下的.bashrc.bash_profile文件中或全局變數配置/etc/profile文件中定義。在將環境變數放入上述文件後,每次用戶登錄時這些變數都將被初始化。

  • 1、按照系統規範,所有環境變數的名字必須採用大寫形式
  • 2、在將環境變數應用於用戶進程程式之前,都應該用export命令導出定義。如export JAVA_HOME
  • 3、有部分環境變數,如HOME、PATH、SHELL、UID、USER等,的用戶登錄之前就已經被/bin/login程式設置好了。通常環境變數被定義並保存在用戶目錄下的.bash_profile或/etc/profile中。
  • 4、在查看設置的變數時,有3個命令可顯示變數的值:set、env、declare
set:輸出所有的變數,包括全局變數和局部變數
env:只顯示全局變數
declare:輸出所有的變數、函數、整數和已經導出的變數
set -o:顯示bash Shell的所有參數配置信息

env查看系統環境變數:

4-5 系統環境變數env.jpg

declare查看所有變數、函數、整數等

4-6 系統環境變數declare_c2i.jpg

set輸出所有變數

4-7 系統環境變數set_c2i.jpg

set -o輸出bash參數配置

4-8 系統環境變數set-o.jpg

自定義環境變數

設置環境變數

    如果想要設置環境變數,就要在給變數賦值前之後或在設置變數時使用export命令,除export命令,使用declare -x命令也可以實現同樣的功能。示例如下:

export JAVA_HOME=/usr/local/java
或
JAVA_HOME=/usr/local/java;export JAVA_HOME
或
declare -x JAVA_HOME=/usr/local/java

以上為設置自定義環境變數的3種方法,而在此處不要在變數名前添加$

  • 自定義環境變數示例

4-9 自定義環境變數_c2i.jpg

  接下來我們來看看讓環境變數永久生效的常用設置文件

  • 1、用戶的環境變數配置

4-10 用戶環境變數配置_c2i.jpg

對於用戶環境變數的設置,比較常見的是用戶目錄下的.bashrc和.bash_profile。推薦在~/.bash_profile中進行設置。

  • 2、全局變數配置
    常見的全局環境變數的配置文件有/etc/profile/etc/bashrc/etc/profile.d

若要登錄後初始化或顯示載入內容,則把腳本文件放在/etc/profile.d下即可,無須添加執行許可權。

示例一:設置登錄提示

4-12 登錄提示示例_c2i.jpg

以上任意一種方法均可,上面是兩種方法合併處理進行演示。實際操作只需要在一個文件中操作即可。

示例二:在Linux中設置Java環境變數

export JAVA_HOME=/usr/local/java/jdk1.7.0_09
export JRE_HOME=/usr/local/java/jdk1.7.0_09/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
顯示環境變數
  • 通過echo和printf顯示環境變數

  首先我們來顯示一些常見的變數

4-13 顯示常見系統變數.jpg

從上面可以看出顯示環境變數可以使用 echoprintf 。其中printf是一種比較複雜的格式化列印工具。如果感興趣可以查看相應的資料。

  • 通過env、set和declare顯示預設的環境變數

  可查看前面所講內容

取消環境變數

    如果定義了環境變數,不想使用,是否可以消除環境變數定義了?在這裡我們可以使用 unset 命令。

[root@localhost ~]# echo $USER
root
[root@localhost ~]# unset USER # 清除變數,註意變數前面沒有 $
[root@localhost ~]# echo $USER
                               # 輸出為空白
普通變數
定義本地變數

    本地變數僅在用戶當前Shell中有效,如果在Shell中啟動另一個進程或退出,則變數無法進行傳遞。

  • 變數的定義及賦值如下所示:

var=value # 定義變數併進行賦值,此時沒有引號
var='value' # 定義變數併進行賦值,此時有單引號
var="value" # 定義變數併進行賦值,此時有雙引號
var=`value` # 定義變數併進行賦值,此時有反引號

以上變數賦值的區別如下所示:

  • 無引號:一般常用於連續的字元串、數字、路徑等進行賦值。但如果變數中含有空格,則會導致賦值不完整,無法輸出完整的變數值
  • 單引號:所見即所得,即輸出時會將單引號中的所有內容原樣輸出,不做任何轉義和解釋,因此稱之為強引用
  • 雙引號:輸出引號中間的全部內容,如果引號中含有變數、特殊轉義字元、命令(需要使用反引號)等會先把變數、轉義字元、命令進行解析再輸出內容,因此稱之為弱引用
  • 反引號:常用於引用命令,即反引號中的內容會被當作命令進行解析輸出,相當於$()

以上四種賦值方法,數值內容進行賦值可以不加引號,其他若沒有特殊要求的情況,建議進行賦值均採用雙引號

定義本地變數輸出
方法一 關係 方法二
$a 等效於 ${a}
`pwd` 等效於 $(pwd)

以上兩種輸出變數值建議採取第二種方法,原因如下所示:

  • 如以用戶名+rc文件夾,定義變數$usernamerc,如這樣寫會導致變數為usernamerc,如果寫為${username}rc,則可以很明顯的看出變數為username
  • ``,反引號容易與單引號引起混淆
定義本地變數示例
[root@localhost Test]# a=718
[root@localhost Test]# b='718'
[root@localhost Test]# c="718"
[root@localhost Test]# d=`date +%F`
[root@localhost Test]# echo $a
718
[root@localhost Test]# echo $b
718
[root@localhost Test]# echo $c
718
[root@localhost Test]# echo ${c}
718
[root@localhost Test]# echo $d
2018-11-02
[root@localhost Test]# echo $(date +%F)
2018-11-02
[root@localhost Test]# a=823-$a
[root@localhost Test]# b='823-$a'
[root@localhost Test]# c="823-$a"
[root@localhost Test]# echo $a
823-718
[root@localhost Test]# echo $b
823-$a
[root@localhost Test]# echo $c
823-823-718
[root@localhost Test]# echo ${c}
823-823-718
[root@localhost Test]# path=`pwd`
[root@localhost Test]# echo $path
/root/Test

環境變數初始化及其對應文件的生效順序

    在登錄Linux系統後,會預設啟動一個Shell,此時Shell會在各個配置文件中查找並使用對應的環境變數設置。而Shell所使用的環境變數取決於Shell的運行方式,通常分為以下三種:

  • 通過系統用戶登錄後預設運行的Shell
  • 非登錄互動式運行的Shell
  • 執行腳本運行的非互動式Shell

    當用戶是通過登錄Linux系統,此時Shell會作為登錄Shell啟動,此時載入環境變數的順序如下所示:

4-14 環境變數初始化順序.jpg

詳細解釋如下所示:
1、用戶登錄系統後會首先載入/etc/profile全局變數文件。

/etc/profile是Linux預設的Shell主環境變數文件,系統上每個用戶登錄都會載入該文件。

2、當載入完/etc/profile文件後,會執行載入/etc/profile.d目錄中的腳本文件。

/etc/profile.d目錄中有很多腳本文件,如果需要自定義登錄即運行腳本,可以將自己的腳本放置到該目錄中。

3、前面載入完成後,開始載入~/.bash_profile(用戶環境文件),而該文件又會分別載入~/.bashrc和/etc/bashrc文件。如果這些文件存在,則執行,如沒有,則不執行。

如果用戶的Shell不是登錄啟動時(如SSH遠程連接),此時這種非登錄Shell只會載入$HOME/.bashrc,不會去查找/etc/bashrc,如果需要載入這些配置,則需要將變數設定等寫入$HOME/.bashrc或者/etc/bashrc中。而不是$HOME/.bash_profile或者/etc/profile。

本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天寫的這篇博客因為下班時間到了忘記保存了,好鬱悶,得重新寫一遍。實習所在公司使用的是CodeFirst開發模式,最近開始參與到公司的項目裡面來了,發現這個模式特別好用,建庫建表改變欄位屬性添加刪除欄位等等操作都無需自己在資料庫動手操作,只需要編寫代碼即可實現,著實是方便了許多。今天來記錄一下如何使 ...
  • 1 namespace ConsoleApp4 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Mum mum = new Mum(); 8 Dad dad = new Dad(); 9 ... ...
  • (1) 許可權工作流:www.demo.eipflow.com/Account/Login (2) 基礎許可權版:www.auth.eipflow.com/Account/Login (3) Net4.5開源版:http://www.open.eipflow.com/Account/Login 2.Ne ...
  • 1. 前言 之前介紹過 "依賴屬性" 和 "附加屬性" 的代碼段,這兩個代碼段我用了很多年,一直都幫了我很多。不過這兩個代碼段我也多年沒修改過,Resharper老是提示我生成的代碼可以修改,它這麼有誠意,這次就只好從了它,順便簡單介紹下怎麼自定義代碼段。 2. VisualStudio自帶代碼段的 ...
  • resize2fs 調整ext2\ext3\ext4文件系統的大小,它可以放大或者縮小沒有掛載的文件系統的大小。如果文件系統已經掛載,它可以擴大文件系統的大小,前提是內核支持線上調整大小。 size參數指定所請求的文件系統的新大小。如果沒有指定任何單元,那麼size參數的單位應該是文件系統的文件系統 ...
  • 這篇博客就不扯皮了,簡單粗暴地貼上自己整理的一份Docker常用命令。 ...
  • 五、物理記憶體的管理 在內核初始化完成後,記憶體管理的責任由伙伴系統(高效、高速)承擔。 1、伙伴系統的結構 系統記憶體中的每個物理記憶體頁(頁幀),都對應於一個struct page實例。每個記憶體域都關聯了一個struct zone的實例,其中保存了用於管理伙伴數據的主要數組。 sruct free_ar ...
  • cut 切割,簡單的取列命令。 -d 指定分隔符 -f 數字 取第幾列 -c n-m 取n列到m列字元。 //提取字元,不常用 例如:已知bqh.txt文件里的內容為“I am bqh myqq is 1147076062”現在需要文件中過濾出"bqh"和"1147076062"字元串,如何實現? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...