## Bash中的特殊變量
在Bash中有一些特殊的變量,他們分別是:
* $0 當前腳本的文件名
* $\# 傳遞給腳本或函數的參數個數。
* $\* 傳遞給腳本或函數的所有參數。
* $@ 傳遞給腳本或函數的所有參數。被雙引號\(" "\)包含時,與 $\* 稍有不同,下面將會講到。
* $? 上個命令的退出狀態,或函數的返回值。
* $$ 當前Shell進程ID。對于 Shell 腳本,就是這些腳本所在的進程ID。
* $! 最近一次執行命令的進程號
### 1.$0 變量
$0變量是顯示當前的文件名,譬如以下腳本為test.sh。
```
#!/bin/bash
echo $0 # 打印test.sh腳本名
echo $(dirname $0) # $0 還有一種用法就是通過dirname命令顯示當前腳本所在的位置。
```
### 2.$\#變量
傳遞給腳本或函數的參數個數。
```
#!/bin/bash
echo $# # 輸出當前位置變量的個數。
if [ $# -ne 3 ];then # 位置變量通常用于判斷位置參數的個數
echo "please input three parameter!"
fi
```
## 3.$\* 和$@變量
$_ 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號\(" "\)包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
但是當它們被雙引號\(" "\)包含時,"$_" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數,以下是區別的案例。
```
#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
```
## 4.$?變量
判斷上一個命令或函數的返回狀態,其中0表示成功,非0表示失敗。
```
[root@blog.puppeter.com_centos ~]# ls abc # 在Linux終端執行ls abc,其中abc文件不存在系統會包錯
ls: abc: No such file or directory
[root@blog.puppeter.com_centos ~]# echo $? # 這時我執行$?就會顯示一個非0的數字,表示上一次命令執行失敗
1
[root@blog.puppeter.com_centos ~]# ls /etc/passwd # 查看/etc/passwd文件是否存在,很顯然他存在
/etc/passwd
[root@blog.puppeter.com_centos ~]# echo $? # 會返回一個0的值,表示上一個命令返回成功。
0
```
我們在寫腳本的過程中也可通過exit函數來告訴系統當前腳本的執行狀態,譬如以下案例。
```
#!/bin/bash
echo "hello world"
exit 0 # 表示成功執行此腳本,退出狀態碼為0
```
## 5.$$變量
顯示當前進程ID,我們在Linux系統中每執行一次命令或一個腳本都會啟動一次進程,而進程ID就相當于唯一識別進程的身份證號。
```
[root@blog.puppeter.com_centos ~]# echo $$ # 他會打印出當前echo執行過程中的進程ID
1307
```
如果我們寫了一個程序是常駐內存的,可以把此進程ID寫到程序的pid文件中來告訴當前程序運行過程中的進程ID值,其實這有點像Apache和Nginx,這兩款WEB服務都會將當前進程的ID值寫入自己的pid文件中,當我要重啟或關閉時其實就是獲取pid文件中的進程ID并發送KILL信號。
## 6.$!變量
將一程序放在系統后臺,打印$!放在后臺這個程序的pid。
```
[root@blog.puppeter.com_centos ~]# sh 2.sh &
[1] 57947
[root@blog.puppeter.com_centos ~]# echo $!
57947
```
- Introduction
- 1.Shell編程基礎
- 什么是Shell
- 編寫第一個Bash程序
- 2.變量
- 什么是變量
- 變量四種賦值方式
- 指定變量類型
- 變量的類型
- 特殊變量
- 3.Bash符號相關
- Bash符號相關
- 特殊符號
- 數學運算符號
- 4.內建命令與外部命令
- 內建命令與外部命令
- 5.read命令
- read命令
- 6.條件語句
- if..then..fi
- if..then..else..fi
- if..then..elif..fi
- 空命令
- 文件測試符
- 字符串判斷、與、或和非
- []與[[]]符號
- 7.Bash循環 && 分支語句
- while循環語句
- for循環
- for..in循環
- until循環
- select循環
- case分支語句
- 8.正則表達式
- 正則表達式
- 9.子Shell和受限Shell
- 子Shell
- 受限Shell
- 10.函數與函數的加載
- 函數語法與案例
- 遞歸函數
- 函數的加載
- 11.Bash腳本風格
- Bash腳本風格
- 12.Bash腳本調試
- Bash腳本調試
- 13.sed && awk
- sed
- 14.awk
- awk
- 15 Bash雜項 && 案例
- while循環的陷阱
- Bash的生命周期
- IO重定向
- /bin/bash和/bin/sh區別
- 命令雜項
- Shell加密
- 16.10.2.案例
- Bash版回收站
- 17.Bash中文速查表
- 中文速查表