從零開始學習Linux(三十六):Shell基礎之變量

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í)行過程如下圖所示:

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容