總第4篇
在前面博文中我講過了變量基礎部分[《變量基本概念及其初始化》](http://blog.csdn.net/guodongxiaren/article/details/38402577)。我們知道假如我們有初始化一個變量a=hello,那么如果我們想打印它的值,我們需要使用echo $a。
但是除此之外還有很多特殊的變量,可供 $ 使用。本文講到了$0 # * @ _ ? ! -這幾個特殊變量的含義。
## 腳本的參數
正如同C語言中有main(int argc,char **argv),Java中有main(String[]args)一樣,Bash同樣能對執行腳本時附加的參數做操作。
### 引用腳本的參數n
看一個簡單的腳本**test.sh**:
~~~
#!/bin/bash
echo $0 $1 $2 $3
~~~
然后看一下我的屏幕輸出情況。

沒錯,和你想的一樣。數字變量0,保存的是這個執行腳本的名稱,其他的數字1到n保存該腳本運行時的第1到第n個參數。
如果沒有腳本在運行,比如直接在終端中鍵入echo $0,那么顯示的是shell的名稱。
### 參數的個數#
現在我們繼續修改一下test.sh這個腳本
~~~
#!/bin/bash
echo "腳本$0的參數的個數為$#"
echo "分別是:"
echo $1 $2 $3
~~~
輸出的結果是:

`#`號代表參數的個數,實際上在Bash中#代表個數的情況,并無只此一例,以后我們在講*字符串操作*的時候還會見到。
### 所有的參數*和@
繼續修改腳本
~~~
#!/bin/bash
echo "腳本$0的參數的個數為$#"
echo "分別是:"
echo $@
echo $*
~~~
試試。

沒錯@,* 就是所有變量。從這里來看似乎兩者沒有差別。但是其實是不同的,通配符*將所有參數視作一個變量,而@則可以理解為所有參數的集合。
看一個長一點的腳本,star_at.sh(代表著star*和at@)
關于for循環,你可能還不理解,但是并沒有關系,這里僅僅是簡單的遍歷。
~~~
#!/bin/bash
echo $*
echo $@
echo "遍歷不帶引號的變量*"
for i in $*
do
echo $i
done
echo "遍歷帶引號的變量*"
for i in "$*"
do
echo $i
done
echo "遍歷不帶引號的變量@"
for i in $@
do
echo $i
done
echo "遍歷帶引號的變量@"
for i in "$@"
do
echo $i
done
~~~

看出來了沒,當遍歷的時候,可以發現,如果$@,$都沒有被引號包圍,那么兩者沒有差別。但是如果有了引號,則不同。可以發現$其實只是一個值而已。
### 最后一個參數_
$_保存的是命令(或腳本)的最后一個參數。
~~~
#!/bin/bash
echo "腳本$0的參數的個數為$#"
echo "分別是:"
echo $@
echo "最后一個參數是$_"
~~~
輸出結果是:

## 其他特殊變量
### 退出碼?
當我們執行完一個命令的時候,都可以用 echo $? 來查看命令的退出碼 ***exit code***(或稱返回碼),從而判斷命令是否正確執行。可以理解為命令的返回值(后面我們學到Bash函數的時候,也會用它來做返回值),但是與其他語言不同的是它只是一個固定的8位二進制數,也就是說它的范圍是0-255。并沒有其他語言中返回值那么豐富的功能。所以我個人喜歡稱之為**碼**而不是 值。(當然這不是重點)

上面是個簡單的例子,用which檢查某個命令是否存在,通過返回值可以了解。0代表成功,非0代表不成功。這可能與其他語言的思想相悖,但是也可以理解,畢竟*成功的狀態只有一個,而錯誤的情況卻有許多種*,所以用正數來標記錯誤狀態。
不過通常在腳本內部,我一般不會直接用到$?來判斷一個命令的返回值,if [? ]就差不多了。
當前進程的PID $
echo $$可以打印當前進程的PID(PID是什么,我就不解釋了)。繼續修改test.sh,你只需要關注最后一句就可以了。
~~~
#!/bin/bash
echo "腳本$0的參數的個數為$#"
echo "分別是:"
echo $@
echo "最后一個參數是$_"
echo "當前進程的PID為$$"
~~~
輸出結果是:

### 后臺執行的最后一個命令的PID !
shell執行命令的時候有前臺和后臺的概念。一直和你交互的就是前臺,但是有些命令會阻塞進程,導致你無法輸入其他命令。比如在終端里打開了一個圖形編輯器gedit或者火狐瀏覽器的時候。不過我們可以通過在命令后面加一個&,來把它丟到后臺,比如** gedit &**,這樣就不會阻塞前臺進程,你可以繼續輸入其他命令。
我喜歡在終端啟動瀏覽器,現在我們來試試$!,是不是可以查看它的PID。

關于 >/deb/null 2>&1這部分會在以后輸入輸出重定向的時候講到。它的功能是把火狐的各種終端輸出丟進垃圾桶,不在屏幕上顯示。
### 當前shell的默認選項 -

himBH是Bash的當然的默認選項,可以使用set -o打開某一選項,或者set +o來關閉某一選項。關于這幾個選項的含義,超出本文敘述范圍,
超綱內容請同學們自行
- man bash
- /-h
- /-i
- /-m
- /-B
- /-H
來查看
本系列(玩轉Bash腳本)更多文章,請訪問:[http://blog.csdn.net/column/details/wanbash.html](http://blog.csdn.net/column/details/wanbash.html)