如果你做過其他語(yǔ)言的編程,那么你肯定使用過變量。
要是你之前沒有接觸過變量,可以將變量理解為存儲(chǔ)一些可以隨著時(shí)間變化的信息或數(shù)據(jù)的容器。
其實(shí),不論是使用哪種語(yǔ)言進(jìn)行編程,我們都會(huì)使用到變量,就是在上一節(jié)的入門教程中,我們也有使用到定義在系統(tǒng)中的變量。比如HOME、USER、SHELL就是預(yù)先定語(yǔ)在系統(tǒng)中的變量。這一節(jié)的教程將學(xué)習(xí)怎么在bash腳本中使用變量.
在bash腳本中使用變量
在上一節(jié)的學(xué)習(xí)中,我們學(xué)會(huì)寫一個(gè)hellworld的bash腳本。
#! /bin/bash
echo -n 'Hello, World!'
這個(gè)腳本還比較簡(jiǎn)陋,我們來優(yōu)化豐富一下。
我們使用shell變量來改進(jìn)這個(gè)腳本,讓它可以用用戶輸入的名字來歡迎該用戶。
編輯hello.sh腳本并使用read命令獲取用戶的輸入:
#! /bin/bash
echo 'What's your name, stranger?'
read name
echo 'Hello, $name'
現(xiàn)在運(yùn)行你的hello.sh腳本;它會(huì)提示你輸入你的名字,然后用你提供的名字來向你問候:
sean@debian-12:~/scripts$ ./hello.sh
What's your name, stranger?
Elliot
Hello, Elliot
在這個(gè)例子中,我輸入了Jerry作為我的名字,腳本回復(fù)了“Hello,Jerry”,現(xiàn)在腳本比原來只會(huì)“Hello,World”有趣多了。
逐行解釋上面的腳本
現(xiàn)在,我們回過頭來解釋每行代碼都是做什么的。
首先,指定shell的解釋器的路徑,告訴系統(tǒng),我們要用bash來運(yùn)行腳本。
#!/bin/bash
接下來,告訴執(zhí)行這個(gè)腳本的用戶,需要輸入他/她的名字
echo 'What's your name, stranger?'
這個(gè)行是用echo在命令行中打印出一行文字,很好理解。
接下來是這個(gè)腳本最神奇的地方
read name
這里使用了read命令來獲取用戶的輸入,所以用戶可以在這里輸入一個(gè)名字或者其他的字符串,在按下enter鍵之后,輸入的內(nèi)容會(huì)被賦值給name變量。
提示輸入名字和獲取輸入的read命令,是可以寫成一行來完成的,這屬于進(jìn)階的內(nèi)容:
read -p 'What's your name, stranger?' name
使用-p參數(shù)就然后跟蹤提示文字就可以實(shí)現(xiàn),這里就只是提一下,不做細(xì)述。
最后,腳本用用戶輸入的名字和用戶打招呼:
echo “Hello, $name”
需要注意的是,這里的變量名前面結(jié)論一個(gè)美元的符號(hào),用于聲明這里是要調(diào)取變量名中的值,如果去掉美元的符號(hào),在輸出顯示時(shí)就變成了'Hello,name'
這個(gè) 美元的$ 符號(hào)在bash腳本中稱為解引用操作符。
整數(shù)、字符串、字符?怎樣在bash腳本中使用不同的數(shù)據(jù)類型?
讓我們把變量的使用場(chǎng)景弄得混亂一些。
你可以使用等號(hào)來給變量賦值,例如下面一行將創(chuàng)建一個(gè)名為age的變量,并設(shè)置它的值為27.
age=27
在age的變量創(chuàng)建完成后,你可以隨心所欲的修改它的值,例如下面這樣:
age=3
上面的命令,將變量age的值從第一次賦值的27變更為3.
變量可以保存不同的數(shù)據(jù)類型,比如字符串、字符和整數(shù),bash本身內(nèi)置的數(shù)據(jù)類型是沒有浮點(diǎn)數(shù)這類有小數(shù)點(diǎn)的數(shù)據(jù)類型。
letter='c'
color='blue'
year=2020
bash中的常量
你也可以創(chuàng)建一個(gè)常量,常量的意思就是,這個(gè)變量的值一旦被賦予之后,就不能被改變!也稱為只讀變量。要定義一個(gè)常量的方式就是在變量名前面添加一個(gè)readonly來實(shí)現(xiàn)。
readonly PI=3.1415926
上面的命令創(chuàng)建了一個(gè)名為PI的常量,并且將它的值設(shè)置為3.1415926。如果你嘗試改變這個(gè)常量的值,會(huì)得到一個(gè)報(bào)錯(cuò)。
bash: PI: readonly variable
就像下面截圖看到的一樣,你只能度一個(gè)常量的值,這個(gè)常量沒創(chuàng)建后就不能修改它的值了。
如果要把這個(gè)常量刪除,可以使用unset命令,比如刪掉上面定義的PI常量:
unset $PI
命令替換
將命令的輸出結(jié)果復(fù)制給變量的能力被稱為命令替換,這是bash上面的一個(gè)神奇特性。下面演示將data命令的輸出結(jié)果復(fù)制給TODAY:
TODAY=$(date)
注意:在上面的復(fù)制例子中,需要在date命令的前面添加一個(gè)美元的$符號(hào),然后date用括號(hào)括起來。
當(dāng)然,你也可以使用兩個(gè)反單引號(hào)把date給括起來:
TODAY=`date`
使用反引號(hào)來執(zhí)行命令替換是以前舊的方法,現(xiàn)在很多文章和教程是建議使用下面的這種格式
variable=$(command)
讓你的HelloWorld腳本看起來聰明點(diǎn)
既然學(xué)習(xí)了如何執(zhí)行命令替換,那么我們可以來再次改進(jìn)一下HelloWorld的腳本,這個(gè)腳本上一次的版本是要求用戶輸入他/她的名字?,F(xiàn)在不用了,你的腳本通過whoami命令和命令替換的方式來問候運(yùn)行腳本的人。
#! /bin/bash
echo 'Hello, $(whoami)'
看到了嗎?現(xiàn)在代碼就僅僅只有兩行!
現(xiàn)在運(yùn)行這個(gè)腳本:
./hello.sh
它看起來好像比之前的版本聰明一點(diǎn)!
好了,這節(jié)的教程就到此為止。感謝您的閱讀。
練習(xí)題
自己動(dòng)手做練習(xí)可以幫助你記憶剛學(xué)到的東西,下面是幾到簡(jiǎn)單的練習(xí)題,用到了上面提到的內(nèi)容。如果您是初學(xué)者,建議您可以自己動(dòng)手做一下。
練習(xí) 1: 您的全名叫什么?
寫一個(gè)shell腳本,詢問用戶的全名并將輸入的名字打印出來。
難度級(jí)別:容易
提示:可以使用read命令獲取用戶輸入。
練習(xí) 2: 您今年多大啦?
寫一個(gè)shell腳本,詢問用戶的年齡并打印出來。
難度級(jí)別:容易
提示:用echo和read命令賦值變量的值為一個(gè)整數(shù)并打印出來。
練習(xí) 3: 你喜歡蘋果派?
編寫一個(gè)命令打印圓周率的值。證明它是不可改變的。
難度級(jí)別:容易
提示:可以使用readonly命令去賦值PI的值為3.14159。
練習(xí) 4: 今天的日期?
寫一個(gè)shell腳本,將當(dāng)前日期存儲(chǔ)在一個(gè)變量中并打印出來。
難度級(jí)別:容易
提示:可以使用date命令進(jìn)行命令轉(zhuǎn)化并將變量的值打印出來。
練習(xí) 5: 姓名、年齡和當(dāng)前時(shí)間
寫一個(gè)腳本,打印上面練習(xí)1、練習(xí)2和練習(xí)4的所有輸出,每個(gè)答案單獨(dú)一行顯示。
難度級(jí)別:容易
輸出的格式可以參考下面的格式:
What is your name?
XYZ ABC
Hello XYZ ABC
What is your age?
44
So you are 44.
Today's date is Thursday 20 January 2022 12:55:23 PM IST
替換上面模板中的XYZ為您的答案。當(dāng)然您也可以把這個(gè)寫成中文的,shell是支持中文輸出的。
練習(xí)題答案
答案 1: 您的全名叫什么?
寫一個(gè)shell腳本,詢問用戶的全名并將輸入的名字打印出來。
#! /bin/bash
echo 'What's your full name?'
read name
echo 'Hello, $name'
答案 2:您今年多大啦?
寫一個(gè)shell腳本,詢問用戶的年齡并打印出來。
#!/bin/bash
echo 'What is your age?'
read age
echo 'So you are $age years old'
答案 3: 你喜歡蘋果派?
編寫一個(gè)命令打印圓周率的值。證明它是不可改變的。
$ readonly PI=3.14159
$ echo 'Pi value is $PI'
Pi value is 3.14159
$ PI=3.5
bash: PI: readonly variable
答案 4: 今天的日期?
寫一個(gè)shell腳本,將當(dāng)前日期存儲(chǔ)在一個(gè)變量中并打印出來。
#!/bin/bash
today=$(date)
echo 'Today's date is $today'
答案 5: 姓名、年齡和當(dāng)前時(shí)間
寫一個(gè)腳本,打印上面練習(xí)1、練習(xí)2和練習(xí)4的所有輸出,每個(gè)答案單獨(dú)一行顯示。
#!/bin/bash
echo 'What is your name?'
read name
echo 'Hello $name'
echo 'What is your age?'
read age
echo 'So you are $age.'
today=$(date)
echo 'Today's date is $today'
如果您對(duì)我的文章有興趣,我把我發(fā)布的文章都?xì)w檔到我私人網(wǎng)站中去,歡迎訪問Corner 三的小角落 -- 首頁(yè)查閱之前的文章。