## 定義
暫時存儲數據的地方,是一種數據標記,通過變量名可以取出對應內存空間中的數據
## 聲明規則
* 變量名和值之間不能有空格
* 無需聲明變量類型(默認字符串)
* 變量名只能包含數字、字母、下劃線
* 變量名不能以數字開頭
* 區分大小寫
>變量賦值中包含反引號(`)則表示將命令執行的結果返回給變量
```
[henry@localhost shell]$ var1=`whoami`
[henry@localhost shell]$ echo $var1
henry
```
### 單引號和雙引號的區別
單引號變量不識別特殊語法
雙引號變量能識別特殊語法
```
[henry@localhost shell]$ name=Henry
[henry@localhost shell]$ echo1='my name is ${name}'
[henry@localhost shell]$ echo2="my name is ${name}"
[henry@localhost shell]$ echo $echo1
my name is ${name}
[henry@localhost shell]$ echo $echo2
my name is Henry
```
## 作用域
父子Shell中的變量無法相互訪問
環境變量在任意子進程都可以訪問
> bash和sh命令可以開啟子shell
> pstree可以查看當前shell存在的域
### Shell的調用方式不同,作用域不同
bash和sh調用會開啟對應的子shell
source和./腳本名調用不會開啟對應的子shell
```
[henry@localhost shell]$ cat test.sh
name=henry1
[henry@localhost shell]$ name=henry
[henry@localhost shell]$ bash test.sh
[henry@localhost shell]$ echo $name
henry *****開啟子shell定義變量name,父shell的name變量沒變
[henry@localhost shell]$ source test.sh
[henry@localhost shell]$ echo $name
henry1 *****在父shell執行腳本name變量被替換
```
## 特殊變量
| 變量名 | 說明 | 注釋 |
| --- | --- | --- |
| $? | 返回上一命令執行結果狀態 | 0執行成功,大于0執行失敗 |
| $0 | 獲取shell腳本的文件名以及路徑 | |
| $n | 獲取腳本的第n個參數 | |
| $# | 獲取腳本的參數個數 | |
| $* | 獲取腳本的所有參數 | 帶“”輸出參數時所有參數整合為一個字符串 |
| $@ | 獲取腳本的所有參數 | 帶“”輸出參數時每個參數分別整合為獨立字符串 |
```
[henry@localhost shell]$ cat test.sh
echo "參數個數:$#"
echo "腳本路徑:$0"
echo "參數:$1 $2 $3"
echo '$*輸出所有參數:'
for var in "$*"
do
echo $var
done
echo '$@輸出所有參數:'
for var in "$@"
do
echo $var
done
[henry@localhost shell]$ ./test.sh a b c
參數個數:3
腳本路徑:./test.sh
參數:a b c
$*輸出所有參數:
a b c
$@輸出所有參數:
a
b
c
```