【Shell】20天學會shell腳本命令(2)變量的詳解

一、問題

1.1、環境
電腦環境:Windows 10;
Docker版本:Server Version: 19.03.3

1.2、問題
shell腳本一直是Linux的必回只語言;就像去英語系國家工作,shell就是英語;如果不會英語,那麼工作起來就會舉步維艱;

聲明:本學習內容,來自嗶哩嗶哩網站上的公開課內容【京峯教育】的吳光科老師的視頻編寫而成;僅供學習參考;網站地址

二、解答

2.1、基本知識;
任何的語言,都有常量和變量,什麼是變量呢,未知數x就是變量,變量可以等於任何滿足條件的值,並且不同的條件下,會有不同的值;shell的變量分爲兩類:

  1. 局部變量:僅在本shell內有效;
  2. 環境變量:在本Linux系統內有效;
    這個和java一樣,java也有局部變量和環境變量;局部變量和環境變量有什麼區別,就好比一個演員,他在電影裏可以扮演某個角色,使用該角色的身份;但是在現實中,他就無法使用電影中的角色的權力;但是在現實中,他可以行使自己作爲正常公民的所有權力;如果你非要讓他本色出演,在局部變量裏聲明一個系統變量原有的值,也是可以的;

1、定義變量

A=1

變量賦值通過賦值號來連接,也就是我們常見的等於號,但是它不是等於號;打個比方,變量A就是一個杯子,現在杯子裏裝的如果是水,你不能說杯子等於水;現在杯子裏裝的是數值1,隨着編程的進行,後面A的值會發生變化;定義的格式是:

變量名=值

這裏注意變量名前面沒有任何單詞,不像java,要規定變量的類型,由此可見,shell是弱語言類型的;並且,這裏的【值】不一定指數值,也有可能是字符串或者其他內容;還有要注意的是,shell裏的變量,我們最好用大寫字母來表示,這樣我們能一眼認出哪些是我們自定義的變量;方便我們調取;

2、運行
我們新建一個vary.sh,輸入內容如下:

#!/bin/bash
#study varialbes
A=1
echo "$A"

運行後的結果爲:
在這裏插入圖片描述
3、與Java的對比
①、這裏的echo就是shell腳本里面的打印函數或者叫打印方法,後面跟打印的內容即可,類似於Java裏的System.out.println()方法;並且Java還需要有一個main方法(或者@Test標註的測試類)才能完成打印動作;顯然,shell更方便;
②、shell定義變量時,不需要規定變量的類型,但是Java是強語言類型,必須聲明變量的類型;各有利弊;
③、並且對比Java,我們可以發現,變量的引用方式也不一樣,Java是直接引用變量名a,不需要使用美元符號;但是shell需要;這裏Java搬回1分;
④、Java在引用變量時,會受到英文的雙引號的干擾,因爲變量一旦寫在英語的雙引號內,系統無法識別他是文字內容還是變量,所以Java的變量必須要切斷引號,暴露在引號外,才能打印;而shell因爲有美元符號加持,所以不用怕,系統照樣識別$A是一個變量;
⑤、shell裏的等號前後不能有空格,而Java不必擔心;這裏要非常注意;

在這裏插入圖片描述

4、系統變量
系統規定了一部分特殊的變量,內容如下:

$0:當前程序的名稱;
$n:當前系統的第n個參數,n=1,2,3,4,5,6,7,8,9
$*:當前參數的所有參數(不含程序本身)
$# 當前程序的參數個數(不包括程序本身)
$?:命令或者程序執行後的狀態,返回0表示成功;這裏跟我們常識感覺可能不一樣,因爲我們一般以0爲無,沒有的意思;通常認爲0表示失敗,這裏恰恰相反,大家注意;
$UID:當前用戶的ID;
$PWD:當前所在的目錄;(這裏的PWD不是密碼的意思,不是表示password,而是print working directory,一般英語大寫縮寫都是多個單詞的縮寫,這裏注意,容易誤解);
我們編寫打印腳本,把這幾個變量都打印一遍,腳本內容:
在這裏插入圖片描述

echo "當前程序名稱爲:$0"                                                                                               echo "當前系統第1個參數爲:$1"                                                                                          echo "當前系統第2個參數爲:$2"                                                                                          echo "當前系統的所有參數爲:$*"                                                                                         echo "當前系統的執行狀態爲:$?"                                                                                        echo "當前程序的參數個數爲:$#"                                                                                         echo "當前用戶的ID:$UID"                                                                                               echo "當前所在的目錄爲:$PWD"                                                                                                                         

執行結果截圖:
在這裏插入圖片描述

在這裏插入圖片描述

我們發現,因爲該腳本沒有輸入任何參數,所以第1,2個參數都爲空;並且,程序的執行狀態爲$?,而不是返回0或者其他數字來表示成功與否,因爲在打印過程中,腳本還沒結束,系統執行到這裏時無法判斷接下來程序是否正常運行結束,所以在自己的腳本中,系統無法判斷腳本自己是否正常結束;如果想看剛纔執行的腳本是否成功,我們可以再執行完腳本後,立馬執行

echo $?

這樣就可以看到返回值是否是0來判斷腳本是否執行成功(剛剛說的,0代表成功);
在這裏插入圖片描述
但是,如上圖,我們如果光打印$?,命令行是無法識別的;

如果要想打印第1,2個參數,我們可以這樣運行腳本,在sh systemVariables.sh 後面加空格123,再加空格456(這就是執行腳本傳遞參數的方式,按照空格後錄入參數,以空格區分,依次順序錄入);
在這裏插入圖片描述

4、轉義
如果我們要打印【$1】或者【$0】這裏具有特殊意義的文本該如何處理呢?

echo "\$1"
echo "\$#"

來運行shell腳本了,這樣,我們就不用授權,也能執行了;執行結果如下圖:
在這裏插入圖片描述

本篇說明內容完畢;

三、總結

歡迎關注我的
CSDN博客: https://blog.csdn.net/River_Continent
微信公衆號:幕橋社區
在這裏插入圖片描述
* 知乎:張牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
* 簡書: https://www.jianshu.com/u/02c0096cbfd3

發佈了348 篇原創文章 · 獲贊 202 · 訪問量 83萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章