如何在shell腳本中使用變數
系統定義的變數:
這些變數由操作系統(Linux)自身創建並維護,通常它們以大寫字母定義,我們可以通過命令「$ set」來查看這些變數。下面列出了部分系統定義的變數:
系統定義的變數 | 意義 |
BASH=/bin/bash | Bash Shell 名稱 |
BASH_VERSION=4.1.2(1) | Bash 版本 |
COLUMNS=80 | 你的屏幕寬度(列數) |
HOME=/home/linuxtechi | 用戶家目錄 |
LINES=25 | 你的屏幕高度(行數) |
LOGNAME=LinuxTechi | 當前登錄用戶的名字 |
OSTYPE=Linux | 操作系統類型 |
PATH=/usr/bin:/sbin:/bin:/usr/sbin | 可執行文件搜索路徑 |
PS1=[u@h W]$ | 命令行提示符 |
PWD=/home/linuxtechi | 當前工作目錄 |
SHELL=/bin/bash | Shell 名稱 |
USERNAME=linuxtechi | 當前登錄的用戶名 |
要列印以上變數的值,可以使用echo command命令,如下:
# echo $HOME
# echo $USERNAME
我們可以通過在環境變數名前前置一個美元符號來從你的腳本里輸入環境變數。請看下面腳本演示:
$ cat myscript
#!/bin/bash
# display user information from the system.
echo 「User info for userid: $USER」
echo UID: $UID
echo HOME: $HOME
注意:echo命令中的環境變數在腳本運行時會被它們的值替代。同時注意,我們可以再第一個字元串的雙引號中放置$USER系統變數,而shell腳本仍然可以明白我們的意思。然而,該方法有一個缺點。看下面這個例子:
$ echo 「The cost of the item is $15」
The cost of the item is 5
很明顯,那不是我們說希望的。無論何時,當腳本遇見引號中的美元符號時,它都會認為你是在調用一個變數。在本例中,該腳本試著顯示變數$1(而這個變數並沒有定義),然後顯示數字5。要顯示實際上的美元符號,你必須前置一個反斜線字元:
$ echo 「The cost of the item is $15」
The cost of the item is $15
那樣好多了。反斜線允許shell腳本將美元符號解釋成為實際的美元符號,而不是變數。
用戶定義的變數:
這些變數由用戶定義。shell腳本允許我們在腳本中設置並使用我們自己的變數。設置變數允許你臨時存儲數據並在腳本中使用,讓shell腳本看起來像一個真正的計算機程序。
用戶變數可以是任何不超過20個的字母、數字或者下劃線字元的文本字元串(LCTT 譯註:變數只能以字母或下劃線開頭)。用戶變數是大小寫敏感的,因此,變數Var1和變數var1是不同的變數。這個小規則常常讓新手編寫腳本時麻煩重重。
我們可以通過等於號為變數賦值。變數,等於號和值(對於新手又是個麻煩的地方)之間不能有空格。下面是幾個給用戶變數賦值的例子:
var1=10
var2=-57
var3=testing
var4=「still more testing」
shell腳本為變數值自動確定數據類型。shell腳本內定義的變數會在腳本運行時保留它們的值,當腳本完成後則刪除這些值。
就像系統變數一樣,用戶變數也可以使用美元符號來調用:
$ cat test3
#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"
$
運行腳本會產生以下輸出:
$ chmod u+x test3
$ ./test3
Katie checked in 10 days ago
Jessica checked in 5 days ago
$
每次變數被調用,它都會變成了當前分配給它的值。有一點很重要,當調用一個變數值時,你使用美元符號,但是當為一個變數分配一個值時,你不能用美元符號。下面用例子來說明:
$ cat test4
#!/bin/bash
# assigning a variable value to another variable
value1=10
value2=$value1
echo The resulting value is $value2
$
當你使用賦值語句中value1變數的值時,你仍然必須使用美元符號。這段代碼產生了如下輸出:
$ chmod u+x test4
$ ./test4
The resulting value is 10
$
如果你忘了美元符號,而又讓value2賦值行看起來像這樣:
value2=value1
你會獲得下面的輸出:
$ ./test4
The resulting value is value1
$
沒有美元符號,shell解釋變數名為普通文本字元串,這極有可能不是你想要的。
在shell變數中使用反引號(`):
反引號允許你將shell命令的輸出賦值給變數。雖然這似乎沒什麼大不了,但它是腳本編程中主要的構建基塊。你必須使用反引號將整個命令行包含起來:
**testing=`date`**
shell會在反引號中運行命令,然後將輸出結果賦值給變數testing。下面的例子給出了如何使用一個常規shell命令的輸出結果來創建一個變數:
$ cat test5
#!/bin/bash
# using the backtick character
testing=`date`
echo "The date and time are: " $testing
$
變數testing接收來自date命令的輸出結果,而它又在echo語句中被調用。運行腳本會產生如下輸出:
$ chmod u+x test5
$ ./test5
The date and time are: Mon Jan 31 20:23:25 EDT 2011
注:在bash中,你也可以選用$(...)語法來替換反引號(`),它有個優點就是可以重用(re-entrant)。
例:
$ echo " Today』s date & time is :" $(date)
Today』s date & time is : Sun Jul 27 16:26:56 IST 2014
via: http://www.linuxtechi.com/variables-in-shell-scripting/
作者:Pradeep Kumar 譯者:GOLinux 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive