總第2篇
## 基本概念
### 命名
注意以下規則:
- 只能包含字母、數字和下劃線,并且不能以數字開頭
- 大小寫敏感
- 不能和系統變量重名
除此以外,如果要導出為全局變量,名稱最好要全部大寫。這只是一種習慣的約定,并非嚴格的約束。
### 類型
幾乎所有的編程語言都有變量的概念,Bash當然也不例外。說道變量就少不了說一說類型。但與其他語言不同的是Bash屬于無類型語言,如果強要說一種類型,可以認為都是字符串。說到這里,你可能會說,Bash里面也有整數類型吧,好像有整數的運算。但其是通過一些運算符,表達式或者命令將字符串視作整數處理的,其本質還是字符串。
### 新建變量
Bash中的變量和其他腳本語言一樣,都是無需聲明,**直接拿來用**的。所以變量的第一次出現都是伴隨著初始化的。關于***初始化***本文第二部分有詳細介紹。
### 取用變量
變量前加一個 ***$***符號。稱作dollar符,就是美元符號。這是最基本的一種取用方式,其他的方式以后再表。
~~~
a="hello world"
echo $a
~~~
終端會打印出 hello world。當然你可以把變量和常量字符串放到一起來打印,比如
~~~
boy=Jelly
echo "$boy:hello world!"
~~~
結果為Jelly:hello world!
## 初始化/賦值
Bash中的變量由于無需聲明,所以第一次出現都會伴隨初始化。Bash中的變初始化(或賦值)方式共有三種:直接賦值、讀取輸入和命令替換。
### 直接賦值
直接賦值就是使用一個等于號了,這在其他編程語言里也很常見,比如:
~~~
a=123
b=abc
c=‘123’
d=“hello world”
~~~
注意空格
需要注意的是**等號左右不能有空格**!!!有其他語言編程經驗的程序員,可能經常通過增加空格來使代碼變得美觀。然而這在Bash中是不允許的。
存在的即是合理的,這樣限制的道理是,如果你寫作 a = 123。那么系統會將視作你在執行一個命令a 而= 和123都是這個命令的參數。能夠直接在腳本內部調用各種系統命令是Bash的與眾不同之處,并且沒有硬性的規定說過等于號=不能作為命令的參數。
關于引號
其次要理解的是,由于剛才說過的所有變量都可視作字符串,所以其實a=123和a=“123”沒什么不同。不過如果你的變量**包含空格**就一定需要用引號來包裹了。
關于單引號和雙引號一般情況下作用相同,除了某些特殊情況:
~~~
a="I'm Jelly"
b='Jelly:"Hi"'
echo $a
echo $b
~~~
當字符串中含有單引號那么外面要用雙引號,反之亦然。
### 讀取輸入
讀取終端的輸入給變量賦值,就是使用read命令。read和echo一樣都是內嵌命令。直接看代碼:
~~~
echo -n "Please Input your name:"
read name
echo "Hi,$name,welcome to uncle Jelly's cabin!"
~~~

或者可以使用read命令的 -p 選項來簡化上述代碼:
~~~
read -p "Please Input your name:" name
echo "$name,welcome to uncle jelly's cabin!"
~~~
直接結果與前面的代碼相同。關于read命令的更多用法,請自行 man read
。
### 命令替換
這是非常實用的一種初始化或賦值的方式。利用其他命令的輸出來給一個變量賦值。這需要用到反引用符號**` `這是數字鍵1左邊的符號,可不是單引號。**
~~~
dir=`pwd`
tim=`date`
echo "我在$dir目錄下"
echo "現在時間是$time"
~~~
這里調用了pwd和date兩個命令。你可以直接在終端鍵入這兩個命令試試,看看打印結果。反引號就是把這個結果給賦值了。
注意
有的命令的打印結果是一行一行的,但是使用反引號賦值的時候,變量是不會保存\n符的,會以空格來替換掉這些換行符,這樣再echo的時候會發現原先的每一行都打印到了一行。懶得貼代碼了,大家直接看這個過程的截圖吧:

除此之外,還有另外一種命令替換的格式——$( )
比如上面的內容可寫作
~~~
dir=$(dir)
tim=$(date)
~~~
**兩種替換方式的區別在于:
內部需要進行轉義才能嵌套使用命令替換如a=`cmd1 `cmd2``,是錯誤的,需要**a=`cmd1 \`cmd2\``。而$()可以直接a=$(cmd1 $(cmd2))。
此外一些其他特殊字符,在` `內部也需要轉義。**
### 其他
其他初始化的方式,比如用一些特殊的變量。舉一例RANDOM,這是一個特殊的變量,你每一次 echo $RANDOM。打印的結構都不一樣。當然你可以用它來實現給變量賦隨機值。
~~~
a=$RANDOM
b=$RANDOM
c=$RANDOM
~~~
自己打印一下這三個變量的值吧。
看懂了嗎?本期教程結束,下次再見
。
本系列(玩轉Bash腳本)更多文章,請訪問:[http://blog.csdn.net/column/details/wanbash.html](http://blog.csdn.net/column/details/wanbash.html)