天天看點

Batch入門教程丨第二章:認識變量相關概念

腳本語言Batch入門教程第二章:認識變量相關概念

i春秋助您提升技能,實力倍增!

在前兩期的學習内容中,我們已經了解了Batch入門教程有關的知識和程式設計方法,如何編寫和運作Windows Batch程式,腳本語言的入門方式等,今天我們将繼續深入學習Batch入門教程之認識變量相關概念。

前期回顧 

◀Batch入門教程丨部署與Hello World(上)

◀Batch入門教程丨部署與Hello World(下)

進階

我們在之前所接觸到的三個指令僅僅是Batch中的冰山一角,一些比較重點的指令都會放在本節中進行講述。在進階内容中,您将會了解到變量、邏輯判斷、調用與傳參和函數這幾大概念。

在本次釋出内容中,我們來了解第一大概念:變量。

變量

變量(Variable),在國中對函數的學習中我們可能接觸到了這個名詞,當然,如果您還沒有接觸到也沒有關系,您隻需要将它了解為“一種可以改變的值”即可。在計算機中,變量的含義會更加清晰,因為它的确是可以變的。

我們如果提到變量,就必定會談到指派(Assignment)。這個指派并不是代數中的指派(名詞),而是一個動賓短語。賦,即賦予,給予,這個詞的意思很明顯了,就是給予一個值。給予誰值呢?我們就要談到變量名(Name)了。變量名一般是可以随便取的,但是如果我們想要更好地去分辨,我們最好取一些有意義的名字。

set

set是變量操作最基本的指令,它能夠指定一個變量名并給它指派。下面是一個常見的變量指派表達式:

set a=1

其中,set為變量操作指令,它是不可缺少的。a是變量名,它的值則是=後的1。那麼,=是等号嗎?不是。在計算機領域,=從來沒有等号的意思,它被稱為指派運算符(Assignment Operator),隻要看到它,就代表着左側與右側相等,但是它并不表示相等關系。

也就是說,如果我們要表達“a 與 1 相等”,那麼我們需要的是a==1而不是 a=1。假設此時a的值為hello,那麼我們若執行:

此時a的值會被徹底改變,變成1。也就是說,a=x任何時候都成立,因為它是用來改變左側變量名所對應的值的,而a==x僅在a真正與x相等時成立。

經過一系列的糾結和解釋,我們最終得到了一個名為a的變量,它的值為1。那麼這個時候我們就要想辦法來使用它。能不能與之前的echo結合起來呢?

echo %a%

得到1。是可以的。在Batch中,您可以用%變量名%的形式來表示一個變量,并且在任何地方都可以用,比如:

set a=set

set b=a

set c=^=

set d=1

set e=%a% %b%%c%%d%

%e%

pause

exit

這個突如其來的奇怪程式也許非常難懂。接下來我們慢慢分析。

首先我們可以看到,我們定義了5個變量,分别叫做a, b, c, d, e。那麼您能說出它們的值是多少嗎?我相信答案是肯定的,除了c和e。

a的值為set,b的值為a,c的值為=,d的值為1。那麼,如果我們一個一個地echo它們呢?

echo %b%

echo %c%

echo %d%

我們得到的結果将是這樣的:

Batch入門教程丨第二章:認識變量相關概念

這看起來就像是一個指令:

這樣您也許可以猜到e的值是什麼了。沒錯,e的值就是a, b, c, d的組合。可以注意到,%a%右邊有一個空格,其它的都是相連的,這樣組合起來也是不會變的。那麼把

%a% %b%%c%%d%

組合起來,我們就得到了:

然後下面有一個單行,寫着:

這樣,在e的值被賦為set a=1後,再把%e% 當作指令執行,我們就相當于是執行了指令:

随後再echo出a的值,我們得到的是1。

Batch入門教程丨第二章:認識變量相關概念

轉義字元

為什麼%c%的值是=而不是^=?

首先我們觀察:

在這裡,如果我們去掉了中間的^,那麼這就是一個錯誤的指令,因為==會被識别成判斷是否相等的運算符,而右邊又是空的,更何況set沒有這種用法。

set c==

是以我們需要讓cmd知道我們是想讓c等于=(等于等于)。于是^的用處有了。它叫做轉義符(Escape Character),用來把原本有特殊含義的符号給轉義成一般的字元。

轉義符的作用很多,您能想到嗎?

如果我們想要輸出一句話,這句話裡包含%a%,但是我們并不想要輸出a的值,而僅僅是輸出兩個百分号和一個a,怎麼辦?轉義符的用處有了。我們可以這樣寫:

echo %%a%%

這裡我們又用到了一個轉義符,它叫做“雙百分号”,但它隻能在使用變量轉義的時候起作用。因而:

set c=%%=%%

不相等。

^轉義符的效用是它後面的1個字元,%%轉義符用來代表一個正常沒有特殊含義的%。使用%%a%%,我們得到的結果就不是a的值了。我們看一個示例:

這樣,我們得到的結果是:

Batch入門教程丨第二章:認識變量相關概念

set /p

set指令有非常多的參數。在本教程中介紹/p和/a兩種。首先,set /p屬于暫留性指令中的一種,也是使用者輸入的第二種途徑。如果您想要讓使用者自己來定義變量的值,您将需要用到/p。

set /p a=

含/p參數的set指令,指派運算符右側無論是什麼,都不會影響到它的值。若我們單單執行set /p a=,我們将得到:

Batch入門教程丨第二章:認識變量相關概念

這是一個輸入空框,我們可以随意在這裡輸入東西。例如,我們輸入 123456,那麼什麼也不會發生:

Batch入門教程丨第二章:認識變量相關概念

但是如果此時我們調出%a%的值,效果就出現了:

Batch入門教程丨第二章:認識變量相關概念

也就是說,我們輸入的任何東西都已經被賦入了變量a裡。/p參數的用處就在如此。

但是,每一次都是這個輸入空框,使用者根本不知道輸入什麼。這樣,我們就可以再指派運算符右側加上提示文字,來提示使用者這是在輸入什麼。運作如下程式:

Batch入門教程丨第二章:認識變量相關概念

其中,this is my passwd是筆者手動輸入的部分。

那麼,我們結合先前将變量直接當作指令執行的方式,來制造一個假的cmd控制台:

Batch入門教程丨第二章:認識變量相關概念

這時,我們輸入的值會直接被賦入%command%内,緊接下一行就是直接把變量的值當作指令來處理。也就是說,我們輸入一條指令,就會被直接當作指令來處理,進而實作假控制台的效果。

利用這條思路,我們就可以自定義我們自己的控制台了。當然這是後續的内容。

set /p <

多了一個<,意義就完全不一樣了。準确來說,這種用法是建立在檔案重定向運算符<上的。它的具體用法:

set /p a=<1.txt

左側沒有多大的差別,仍然是變量名,但是右側則是一個<加上一個檔案。嚴格來講,這個檔案隻能是純文字檔案(擴充名随意,隻要不是二進制即可)。這條指令的意思是從1.txt讀取第一行的所有内容并指派到%a% 中。

我們不妨直接做個實驗:

Batch入門教程丨第二章:認識變量相關概念

這樣,從檔案讀取内容也成功了。但是如果有多行文本呢?出于局限性,這個方法隻能讀取第一行的内容。在後面的學習中,我們會介紹如何讀取全部内容,以及如何選擇性地讀取指定行的内容。

set /a

指定/a參數可以進行數學運算操作。如果set指令擁有/a參數,那麼它的指派運算符後面的變量不需要帶上百分号。

例如:

Batch入門教程丨第二章:認識變量相關概念

但是前提是指派運算符後的變量必須為數字。因為/a是專為數學運算而設計的,是以這樣能夠讓計算寫作時更加快速。

一個簡單的加減乘除程式就可以通過參數/a來實作:

Batch入門教程丨第二章:認識變量相關概念

這代表着在/a參數的前提下,指派運算符後将可以直接寫四則運算符号。但是這遠遠不夠。因為批處理的局限性,目前是無法計算超過32位的數字以及任何浮點數的(是以不建議用批處理計算除法)。不過,這樣就相當于是實作了電腦的核心功能。

至此,set介紹得就差不多了。接下來我們了解一下環境變量。

環境變量

環境變量(Environment Variable),是指系統已經預先配置好的父程序環境預設設定。簡要來講,就是一些包含您計算機的基本資訊的變量,雖然說叫做“變量”,但是實際上如果您的系統沒有從底層上發生改變,這些變量的值是不會改變的。

環境變量在批處理的作用非常巨大,可以節省我們編寫代碼的時間,也能讓我們的代碼更加适配其它人的電腦。

我們舉個例子,衆所周知很多人的Windows系統是安裝在盤符為C:的存儲空間的,是以如果我們在批處理内要對系統盤内的項進行操作,我們必定需要寫路徑。例如,我們要用上文中提到的set /p指令來讀取位于系統盤根目錄的1.txt,那麼怎麼做?(忽略權限)

set /p content=<C:\1.txt

一般我們的思路當然就會是這樣的了,但是,您有沒有思考過,萬一真的有人系統盤不在C槽呢?(實際上這種情況非常普遍)這條指令豈不是失去意義了?這個時候,環境變量就發揮作用了。環境變量可以根據不同的電腦而改變,這就是它“變”的地方。

例如,在Windows中有一個環境變量,叫作%SYSTEMDRIVE%(環境變量不區分大小寫),它的字面意思是系統盤符(System Drive Volume),這也是它所代表的。那麼我們可以直接在echo指令中輸出它,因為它在系統安裝的時候就被定義了。

Batch入門教程丨第二章:認識變量相關概念

我們得到的是C:,這正是我們系統盤的盤符。

而如果某人的電腦系統盤是E:,那麼這個變量的值就會等于E:。利用這個原理,我們就可以适配所有的電腦了,于是把我們的指令修改成:

set /p content=<%SYSTEMDRIVE%\1.txt

這樣,這條指令就有了萬能性。

環境變量的使用方法基本上就是這樣,接下來我們列出一些常用的環境變量:

Batch入門教程丨第二章:認識變量相關概念
Batch入門教程丨第二章:認識變量相關概念

變量截取與替換

如果我們希望将一個變量分段,隻取其中一部分内容,在Batch中是有方法的。

set a=1234567890

echo %a:~0,1%

上面的執行結果是1。看吧,這是一個您不認識的變量寫法。:~0,1就是變量控制符。一般地,在Batch中,我們對變量截取有以下原則:

%操作變量名:~始, 終%

其中,操作變量名很好了解,這是我們要采取截取工作的變量。例如,我們要截取變量a,那麼操作變量名就是a。始(from Index),指定從哪一位(Index)開始截取,終(to Index)指定截取到的位。

在計算機中,位是從0開始的。也就是說,我們日常生活中所表示的1,在這裡就是0。觀察以下資料:

1234567890

請問這組資料中的第一個數字是什麼?是1。但是,如果我們要在計算機内表示的話,我們要說它在第0位。以此類推,如果我們要截取變量的前8位,那麼我們應當寫成:

%a:~0,8%

這行代碼代表截取變量a的第一位至第八位。如果我們仿照上例執行:

echo %a:~0,8%

我們将得到12345678。這種截取也适用于非0開頭。需要注意的是,開頭的位必須與我們現實生活中所數的位數少1。例如:

set a=你好啊

echo %a:~1,1%

輸出的結果是好。這行代碼代表從第2位開始,截取1個字元。那麼我們就直接截取了第2位本身。如果我們将終改為2,我們得到的結果是 好啊,即從第2位開始,截取了2位。

請您參考如下例子來好好了解一下變量截取:

Batch入門教程丨第二章:認識變量相關概念

我們同樣可以反過來,從相反方向截取。例如:

set a=3.14

echo %a:~-1%

這種用法裡沒有始和終的區分。以上例子代表截取a的倒數第一位,我們得到的結果是4。如果我們使用echo %a:~-2%,那麼我們截取的是倒數的兩位,結果是14。以此類推,當我們使用echo %a:~-n% 的時候,實際上是截取了這個資料的倒數n位(即從倒數第1位一直截取到倒數第n位)。

此外我們還可以結合起來用:

echo %a:~0,-1%

我們得到的結果是3.1。這行指令代表截取從正數第一位一直到倒數第一位之前的那一位的資料。以此類推,當我們使用echo %a:~b,-c%的時候,實際上是截取了這個變量從正數第a+1位到倒數第|c|+1位的資料。

至于變量替換,相對于變量截取,比較簡單。

set a=我好!

echo %a:我=你%

下一篇: biao

繼續閱讀