# 第一行:幻數
- #!/bin/sh(是Bash的軟鏈接)
- #!/bin/bash(推薦)
內核會根據它來確定使用什么解釋器來執行它,不寫不規范。
如果沒有設置Linux默認解釋器是什么就用什么來解釋
# 環境變量
## 一般定義
在/etc/profile(全局變量下)
>export 變量=值
注意:export意味著所有終端都生效,是真正的全局。
為了規范和避免未知錯誤,最好加上。
如果不加就是在當前終端或者當前腳本中生效,關閉終端或執行完腳本失效。
## 激活變量
>source /etc/profile
>. /etc/profile
**注意**:環境變量文件是無法用sh激活的,只有用.和source
經典題:
echo "user=`whoami`"> a.sh
sh a.sh && echo $user
**這道題就是用sh激活環境變量,是絕對不行的**
應該是:source a.sh && echo $user
而且如果永久使用user=`whoami`前要加export
## 在Shell腳本中定義
```
a=192.168.1.1
b="192.168.1.1"
c='192.168.1.1'
echo "a=$a"
echo "b=$b"
echo "c=${c}"
```
特性:
單引號定義變量:所見即所得
>c='192.168.1.1'
## 特殊變量和環境變量
- $0 獲取當前執行腳本的文件名,可以包括腳本路徑
- dirname,basename。配合$0使用
- $n 獲取腳本的第n個參數值
- $# 獲取腳本總共傳了幾個參數
- $? 查看上個語句返回值,默認返回值如下
- 0:正確 2:權限拒絕 1-125:執行失敗(腳本問題) 127:命令輸入錯誤 >=128:執行中取消
- exit 1 指定腳本返回值
- shift 把第n+1參數變為第n個參數,第一個參數消失。場景:使用過的參數就刪除(一次性筷子)
- $@ //獲取當前腳本的所有傳參的參數當成字符串:不合并他們為完整字符串
- $* //獲取當前腳本的所有傳參的參數當成字符串:把他們合并成完整字符串
- $$ //當前shell進程號
### 簡單使用
>sh jiaoben.sh "我是第一個參數" "我是 第二個參數" 我是第三個參數
```
echo "$0"
dirname $0
basename $0
echo "$1"
echo "$3"
echo "$#"
echo "$3"
echo "$$"
for i in "$*";do echo $i;done
for i in "$@";do echo $i;done
```
### 升級使用
>sh pidjiaoben.sh
```
```
## 比較參數
- expr 適合校驗文件擴展名:`if expr "$1" : ".*\.pub"; then`
- expr 還可以檢驗是不是整數、分數
- -eq
- -lt
- -gt
- -a 并且:\[ -n "內容" -a "內容"="內容" \]
- -o 或者
- -n 為空:\[ -n "內容" \] && {執行內容}
- -z 為整數
```
expr "test.pub" : ".*\.pub" && echo 1 || echo 0
```
## 變量替換(備胎功能)
>result=${test:=hello}
如果test沒有定義值則result顯示hello,并且把hello賦值給result
>result=${test:-hello}
如果test沒有定義值則result顯示hello,不把hello賦值給result
test如果在之前被定義過則顯示定義結果(test=abc;result=${test:-hello};顯示為abc)
但如果在之后才定義test=abc則不行,顯示結果還是hello
在腳本中刪除文件/文件夾一定要使用它
```
```
## 取消定義變量
>unset result
## 清屏