1、變量
1.1、什么是變量
變量是計算機內(nèi)存中的單元,其中存放的值是可以改變。
當shell腳本需要保存一些信息時,如一個文件名或是一個數(shù)字,這時候就可以把信息存放在一個變量中。每個變量有一個名字,所以很容易通過名稱引用它。
1.2、變量定義規(guī)則
- 變量名稱可以由字母、數(shù)字和下劃線組成 ,但是不能以數(shù)字開頭。如果變量名是 “2name”則是錯誤的;
- 在bash中,變量的默認類型都是字符串型。如果要進行數(shù)值運算,則必需指定變量類型為數(shù)值型;
- 變量用等號連接值,等號左右兩側不能有空格;
- 變量的值如果有空格,需要使用單引號或雙引號包括;
- 在變量的值中,可以使用“\”轉義符;
- 如果是把命令的結果作為變量值賦予變量 ,則需要使用反引號或$()包含命令;
- 環(huán)境變量名建議大寫,便于區(qū)分;
1.3、變量分類
- 用戶自定義變量(也可以叫本地變量);
- 環(huán)境變量:主要保存的是和系統(tǒng)操作環(huán)境相關的數(shù)據(jù);
- 位置參數(shù)變量:主要是用來向腳本中傳遞數(shù)據(jù)的,變量名不能自定義,變量作用是固定的;
- 預定義變量:是bash中已經(jīng)定義好的變量,變量名不能自定義,變量作用也是固定的;
2、用戶自定義變量
2.1、定義變量
定義變量name和age,如下圖所示:

2.2、調(diào)用變量
使用 $變量名 的方式調(diào)用變量。
執(zhí)行下面命令:
echo '我是'\$name',我今年'$age'歲'

2.3、查看變量
使用set命令,查看變量。
但是set命令返回結果有點多,看的時候要耐心一點。
或者是結合管道符和grep命令,搜索變量名稱name。
set | grep name
返回結果如下圖所示:

2.4、刪除變量
命令格式:unset 變量名;
定義變量myname,myname=通靈鹿小六;
刪除變量myname,unset myname;
整個過程如下圖所示:

3、環(huán)境變量
用戶自定義變量只在當前的shell中生效,而環(huán)境變量會在當前shell和這個shell的所有子shell當中生效。如果把環(huán)境變量寫入相應的配置文件,那么這個環(huán)境變量就會在所有的shell中生效。
3.1、定義環(huán)境變量
命令格式: export 變量名=變量值;
3.2、查看環(huán)境變量
執(zhí)行命令:env;
環(huán)境變量定義名稱都是大寫的,查看結果如下圖所示:

3.3、調(diào)用環(huán)境變量
同用戶自定義變量一樣,通過$變量名的方式調(diào)用。
3.4、刪除環(huán)境變量
同用戶自定義變量一樣,unset 變量名;
3.5、系統(tǒng)常見環(huán)境變量
- PATH:系統(tǒng)查找命令的路徑(這便是執(zhí)行系統(tǒng)命令不用輸入命令絕對路徑的原因,系統(tǒng)會在PATH定義的所有路徑中查詢是否有輸入的命令,找到命令后就直接執(zhí)行);

4、位置參數(shù)變量
| 位置參數(shù)變量 | 作用 |
|---|---|
| $n | n為數(shù)字,$0代表命令本身,$1-$9代表第一個到第九個參數(shù),十以上的參數(shù)需要用大括號包含,如${10}; |
| $* | 代表命令行中所有的參數(shù),$*把所有的參數(shù)看成一個整體; |
| $@ | 代表命令行中所有的參數(shù),不過$@把每個參數(shù)區(qū)分對待; |
| $# | 代表命令行中所有參數(shù)的個數(shù); |
4.1、$n示例
(1)創(chuàng)建add.sh文件,編輯腳本內(nèi)容:
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $num1 '+' $num2 '=' $sum
(2)給文件add.sh賦予執(zhí)行權限
chmod 755 add.sh
(3)執(zhí)行add.sh腳本文件
./add.sh 4 9
整個過程如下圖所示:

通過這個例子,可以看到將4賦予了$1,將9賦予了$2。
4.2、$*、$@、$#示例
(1)創(chuàng)建param1.sh文件,編輯腳本內(nèi)容:
#!/bin/bash
echo "總共有 $# 個參數(shù)" #使用$#代表所有參數(shù)的個數(shù)
echo "參數(shù)是: $*" #使用$*代表所有的參數(shù)
echo "參數(shù)是: $@" #使用$@也代表所有參數(shù)
(2)給文件param1.sh賦予執(zhí)行權限
chmod 755 param1.sh
(3)執(zhí)行param1.sh腳本文件
./param1.sh 111 222 333
整個執(zhí)行過程如下圖所示:

4.3、$*和$@區(qū)別示例
(1)創(chuàng)建param2.sh文件,編輯腳本內(nèi)容:
#!/bin/bash
echo '這是$*的輸出內(nèi)容'
for i in "$*" #$*中的所有參數(shù)看成是一個整體,所以這個for循環(huán)只會循環(huán)一次
do
echo "參數(shù)是: $i"
done
echo '這是$#的輸出內(nèi)容'
x=1
for j in "$@" #$@中的每個參數(shù)都看成是獨立的,所以"$@"中有幾個參數(shù),就會循環(huán)幾>次
do
echo "參數(shù)是: $x is: $j"
x=$(( $x+1 ))
done
(2)給文件param2.sh賦予執(zhí)行權限
chmod 755 param2.sh
(3)執(zhí)行param2.sh腳本文件
./param2.sh 111 222 333
整個執(zhí)行過程如下圖所示:

5、預定義變量
| 預定義變量 | 作用 |
|---|---|
| $? | 最后一次執(zhí)行命令的返回狀態(tài)。如果變量值為0,證明上一個命令正確執(zhí)行;如果變量值為非0(具體返回值,由命令自己來決定),則證明上一個命令執(zhí)行錯誤; |
| $$ | 當前進程的進程號(PID); |
| $! | 后臺運行的最后一個進程的進程號(PID); |
5.1、接收鍵盤輸入
命令格式:read [選項] [變量名];
選項說明:
- -p “提示信息”:在等待read輸入時,輸出提示信息;
- -t 秒數(shù):read命令會一直等待用戶輸入,使用 此選項可以指定等待時間;
- -n 字符數(shù):read命令只接受指定的字符數(shù),就會執(zhí)行;
- -s: 隱藏輸入的數(shù)據(jù),適用于機密信息的輸入;
(1)創(chuàng)建param3.sh文件,編輯腳本內(nèi)容:
#!/bin/bash
#作者:通靈鹿小六
read -t 30 -p '請輸入你的名字:' name
read -t 30 -p '請輸入你的年齡:' age
read -n 1 -t 30 -p "請選擇你的性別[M/F]:" gender
echo -e "\n"
echo "你叫$name,你的年齡是$age歲,你的性別是$gender!"
(2)給文件param3.sh賦予執(zhí)行權限
chmod 755 param3.sh
(3)執(zhí)行param3.sh腳本文件
./param3.sh
整個執(zhí)行過程如下圖所示:
