Shell腳本變量部分超詳細解析

Shell腳本變量部分超詳細解析

變量的定義

【基本知識補充】mysql

  • 基本符號的意義:
  • 腳本執行和調試方法:

1. 變量是什麼?

一句話歸納:變量是用來臨時保存數據的,該數據是能夠變化的數據。sql

【注意】shell

  • 單引號雙引號敏感,單引號中不能有變量
  • 命令等價於「$()」,反引號中的shell命令會被先執行

2. 何時須要定義變量?

  • 若是某個內容須要屢次使用,而且在代碼中重複出現,那麼能夠用變量表明該內容。這樣在修改內容的時候,僅僅須要修改變量的值。
  • 在代碼運做的過程當中,可能會把某些命令的執行結果保存起來,後續代碼須要使用這些結果,就能夠直接使用這個變量。

3.變量如何定義?

*變量名=====變量值*vim

變量名:用來臨時保存數據的數組

變量值:就是臨時的可變化的數據bash

[root@MissHou ~]# A=hello			定義變量A
[root@MissHou ~]# echo $A			調用變量A,要給錢的,不是人民幣是美圓"$"
hello
[root@MissHou ~]# echo ${A}		還能夠這樣調用,無論你的姿式多優雅,總之要給錢
hello
[root@MissHou ~]# A=world			由於是變量因此能夠變,移情別戀是常事
[root@MissHou ~]# echo $A			無論你是誰,只要調用就要給錢
world
[root@MissHou ~]# unset A			不跟你玩了,取消變量
[root@MissHou ~]# echo $A			今後,我單身了,你能夠給我介紹任何人

4. 變量的定義規則

雖然能夠給變量(變量名)賦予任何值;可是,對於變量名也是要求的!😒app

㈠ 變量名區分大小寫

[root@MissHou ~]# A=hello
[root@MissHou ~]# a=world
[root@MissHou ~]# echo $A
hello
[root@MissHou ~]# echo $a
world

㈡ 變量名不能有特殊符號

[root@MissHou ~]# *A=hello
-bash: *A=hello: command not found
[root@MissHou ~]# ?A=hello
-bash: ?A=hello: command not found
[root@MissHou ~]# @A=hello
-bash: @A=hello: command not found

特別說明:對於有空格的字符串給變量賦值時,要用引號引發來
[root@MissHou ~]# A=hello world
-bash: world: command not found
[root@MissHou ~]# A="hello world"
[root@MissHou ~]# A='hello world'

㈢ 變量名不能以數字開頭

[root@MissHou ~]# 1A=hello
-bash: 1A=hello: command not found
[root@MissHou ~]# A1=hello
注意:不能以數字開頭並不表明變量名中不能包含數字呦。

㈣ 等號兩邊不能有任何空格

[root@MissHou ~]# A =123
-bash: A: command not found
[root@MissHou ~]# A= 123
-bash: 123: command not found
[root@MissHou ~]# A = 123
-bash: A: command not found
[root@MissHou ~]# A=123
[root@MissHou ~]# echo $A
123

㈤ 變量名儘可能作到見名知意

NTP_IP=10.1.1.1
DIR=/u01/app1
TMP_FILE=/var/log/1.log
...

說明:通常變量名使用大寫(小寫也能夠),不要同一個腳本中變量全是a,b,c等不容易閱讀

5. 變量的定義方式有哪些?

㈠ 基本方式

直接賦值給一個變量函數

[root@MissHou ~]# A=1234567
[root@MissHou ~]# echo $A
1234567
[root@MissHou ~]# echo ${A:2:4}		表示從A變量中第3個字符開始截取,截取4個字符
3456

說明:
$變量名 和 ${變量名}的異同
相同點:均可以調用變量
不一樣點:${變量名}能夠只截取變量的一部分,而$變量名不能夠

㈡ 命令執行結果賦值給變量

[root@MissHou ~]# B=`date +%F`
[root@MissHou ~]# echo $B
2019-04-16
[root@MissHou ~]# C=$(uname -r)
[root@MissHou ~]# echo $C
2.6.32-696.el6.x86_64

㈢ 交互式定義變量(read)

目的:用戶本身給變量賦值,比較靈活。命令行

語法:read [選項] 變量名調試

常見選項:

選項 釋義
-p 定義提示用戶的信息
-n 定義字符數(限制變量值的長度)
-s 不顯示(不顯示用戶輸入的內容)
-t 定義超時時間,默認單位爲秒(限制用戶輸入變量值的超時時間)

舉例說明:

用法1:用戶本身定義變量值,即在變量前加read
[root@MissHou ~]# read name
harry
[root@MissHou ~]# echo $name
harry
#在自定義變量時添加提示語句:
[root@MissHou ~]# read -p "Input your name:" name
Input your name:tom
[root@MissHou ~]# echo $name
tom

用法2:變量值來自文件
[root@MissHou ~]# cat 1.txt 
10.1.1.1 255.255.255.0

[root@MissHou ~]# read ip mask < 1.txt 
[root@MissHou ~]# echo $ip
10.1.1.1
[root@MissHou ~]# echo $mask
255.255.255.0
用法3:位置變量
例如$1/$2...,此時從交互命令行輸入多個數值按照定義變量的數字表示索引來決定調用那個位置的數值

㈣ 定義有類型的變量(declare)

目的:給變量作一些限制,固定變量的類型,好比:整型、只讀

用法:declare 選項 變量名=變量值

經常使用選項:

選項 釋義 舉例
-i 將變量當作整數 declare -i A=123
-r 定義只讀變量 declare -r B=hello
-a 定義普通數組;查看普通數組
-A 定義關聯數組;查看關聯數組
-x 將變量經過環境導出 declare -x AAA=123456 等於 export AAA=123456

舉例說明:

[root@MissHou ~]# declare -i A=123
[root@MissHou ~]# echo $A
123
[root@MissHou ~]# A=hello
[root@MissHou ~]# echo $A
0

[root@MissHou ~]# declare -r B=hello
[root@MissHou ~]# echo $B
hello
[root@MissHou ~]# B=world
-bash: B: readonly variable
[root@MissHou ~]# unset B
-bash: unset: B: cannot unset: readonly variable

6. 變量的分類

㈠ 本地變量

  • 本地變量:當前用戶自定義的變量。當前進程中有效,其餘進程及當前進程的子進程無效。

    定義方式:變量名=變量值

    查看進程父子關係
    [ipnet@localhost ~]$ ps -auxf |grep bash
    ipnet    19447  0.0  0.0 115440  2000 pts/0    Ss   10:29   0:00          \_ -bash
    ipnet    20741  0.0  0.0 115440  1984 pts/1    Ss   10:43   0:00          \_ -bash
    root     20844  0.0  0.0 115440  2008 pts/1    S    10:44   0:00          |       \_ -bash
    ipnet    22356  0.0  0.0 115440  2028 pts/2    Ss   11:14   0:00          \_ -bash
    ipnet    27420  0.0  0.0 115440  1984 pts/2    S    23:50   0:00          |   \_ bash
    ipnet    27448  0.0  0.0 112708   948 pts/2    S+   23:50   0:00          |       \_ grep --color=auto bash
    ipnet    23420  0.0  0.0 115440  2016 pts/3    Ss+  11:29   0:00          \_ -bash

㈡ 環境變量

  • 環境變量:當前進程有效,而且可以被子進程調用。
    • env查看當前用戶的環境變量
    • set查詢當前用戶的全部變量(臨時變量與環境變量)
    • export 變量名=變量值 或者 變量名=變量值;export 變量名
[root@MissHou ~]# export A=hello		臨時將一個本地變量(臨時變量)變成環境變量
[root@MissHou ~]# env|grep ^A
A=hello

永久生效:
vim /etc/profile 或者 ~/.bashrc
export A=hello
或者
A=hello
export A

說明:系統中有一個變量PATH,環境變量
export PATH=/usr/local/mysql/bin:$PATH

㈢ 全局變量

  • 全局變量:全局全部的用戶和程序都能調用,且繼承,新建的用戶也默認能調用.

  • 解讀相關配置文件

文件名 說明 備註
$HOME/.bashrc 當前用戶的bash信息,用戶登陸時讀取 定義別名、umask、函數等
$HOME/.bash_profile 當前用戶的環境變量,用戶登陸時讀取
$HOME/.bash_logout 當前用戶退出當前shell時最後讀取 定義用戶退出時執行的程序等
/etc/bashrc 全局的bash信息,全部用戶都生效
/etc/profile 全局環境變量信息 系統和全部用戶都生效
$HOME/.bash_history 用戶的歷史命令 history -w 保存歷史記錄 history -c 清空歷史記錄

說明:以上文件修改後,都須要從新source讓其生效或者退出從新登陸。

  • 用戶登陸系統讀取相關文件的順序
    1. /etc/profile
    2. $HOME/.bash_profile
    3. $HOME/.bashrc
    4. /etc/bashrc
    5. $HOME/.bash_logout

㈣ 系統變量

  • 系統變量(內置bash中變量) : shell自己已經固定好了它的名字和做用.
內置變量 含義
$? 上一條命令執行後返回的狀態;狀態值爲0表示執行正常,非0表示執行異常或錯誤
$0 當前執行的程序或腳本名
$# 腳本後面接的參數的個數
$* 腳本後面全部參數,參數當成一個總體輸出,每個變量參數之間以空格隔開
$@ 腳本後面全部參數,參數是獨立的,也是所有輸出
$1~$9 腳本後面的位置參數,$1表示第1個位置參數,依次類推
${10}~${n} 擴展位置參數,第10個位置變量必須用{}大括號括起來(2位數字以上擴起來)
$$ 當前所在進程的進程號,如echo $$
$! 後臺運行的最後一個進程號 (當前終端)
!$ 調用最後一條命令歷史中的參數
  • 進一步瞭解位置參數$1~${n}
#!/bin/bash
#瞭解shell內置變量中的位置參數含義
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1" 
echo "\$2 = $2" 
echo "\$3 = $3" 
echo "\$11 = ${11}" 
echo "\$12 = ${12}"
  • 進一步瞭解$*和​$@的區別

$*:表示將變量當作一個總體
$@:表示變量是獨立的

#!/bin/bash
for i in "$@"
do
echo $i
done

echo "======我是分割線======="

for i in "$*"
do
echo $i
done

[root@MissHou ~]# bash 3.sh a b c
a
b
c
======我是分割線=======
a b c

7.變量上的操做

1.變量刪除

2.變量索引及切片

3.變量內容替換

4.變量內容替代

  • ${-}號的做用

  • ${:-}的做用

  • ${+},${:+},${=},${:=},${?},${:?}的做用

相關文章
相關標籤/搜索