天天看點

【shell程式設計】變量

變量

又分為環境變量和自定義變量

環境變量

使用 env 指令檢視

[api@kfxqtyglpt ~]$ env
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.190.179.212 60463 50023
SELINUX_USE_CURRENT_RANGE=
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/1
HISTORY_FILE=/var/log/usermonitor/usermonitor.log
JRE_HOME=/home/api/jdk1.7.0_25/jre
USER=api
MAVEN_HOME=/home/api/maven
MAIL=/var/spool/mail/api
PATH=/home/api/jdk1.7.0_25/bin:/home/api/maven/bin:/home/api/maven/bin:/home/api/jdk1.7.0_25/bin:/home/api/jdk1.7.0_25/jre/bin:/usr/local/nginx/sbin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/api/bin
JAVA_HOME=/home/api/jdk1.7.0_25
LANG=zh_CN.UTF-8
複制代碼           

環境變量通常用全大寫的形式

自定義變量

[api@kfxqtyglpt ~]$ myname=nanhai13
複制代碼           

注意等号兩邊不能有空格

檢視變量

[api@kfxqtyglpt ~]$ echo $myname
nanhai13
[api@kfxqtyglpt ~]$ echo ${myname}
nanhai13
複制代碼           

推薦使用${}方式

特殊情況處理

  1. 資料内容有空格
  2. 用單引号或者雙引号括起來
  3. 或者用轉移字元\把空格轉義了
  4. [api@kfxqtyglpt ~]$ myname="nanhai 13" [api@kfxqtyglpt ~]$ echo ${myname} nanhai 13 [api@kfxqtyglpt ~]$ myname='nanhai 14' [api@kfxqtyglpt ~]$ echo ${myname} nanhai 14 [api@kfxqtyglpt ~]$ myname=nanhai\ 15 [api@kfxqtyglpt ~]$ echo ${myname} nanhai 15 複制代碼
  5. 資料内容中引用其他變量
  6. 用雙引号括起。不能用單引号
  7. [api@kfxqtyglpt ~]$ hello="hi ${myname}" [api@kfxqtyglpt ~]$ echo $hello hi nanhai 15 複制代碼
  8. 如果用單引号
  9. [api@kfxqtyglpt ~]$ hello='hi ${myname}' [api@kfxqtyglpt ~]$ echo $hello hi ${myname} 複制代碼
  10. 可以看出單引号和雙引号的差別了
  11. 資料内容中執行其他指令
  12. 使用$()可以執行指令
  13. [api@kfxqtyglpt ~]$ myversion=$(uname -r) [api@kfxqtyglpt ~]$ echo $myversion 2.6.32-431.el6.x86_64 複制代碼

檢視自定義變量

使用set指令。可以檢視所有環境變量和自定義變量

删除自定義變量

unset指令

其他

$本身也是個變量

[api@kfxqtyglpt ~]$ echo $
74292
複制代碼           

'$'顯示目前shell的pid

?是上一個指令的結果

一般指令執行後都會回傳一個執行結果。

執行成功一般回傳0,如果執行出錯,會回傳錯誤碼。

[api@kfxqtyglpt ~]$ echo $?
0
[api@kfxqtyglpt ~]$ name=66 66
-bash: 66: command not found
[api@kfxqtyglpt ~]$ echo $?
127
複制代碼           

将自定義變量導出為環境變量

使用export指令,注意沒有$符号

[api@kfxqtyglpt ~]$ export myname
複制代碼           

使用env檢視

[api@kfxqtyglpt ~]$ env
...
myname=nanhai 15
...
複制代碼           

我們登入linux,取得一個bash指令視窗,就是開啟了一個bash程式,這個bash有自己的pid

在這個shell下執行的所有指令都是這個shell程式的子程式

子程式會繼承父程式的環境變量,但是不會繼承父程式的自定義變量

[api@kfxqtyglpt ~]$ name=superman
[api@kfxqtyglpt ~]$ echo $name
superman
[api@kfxqtyglpt ~]$ bash    ========>開啟一個bash子程式
[api@kfxqtyglpt ~]$ echo $name

[api@kfxqtyglpt ~]$ exit    ========>傳回父程式
exit
[api@kfxqtyglpt ~]$ export name      ========>export成環境變量
[api@kfxqtyglpt ~]$ bash
[api@kfxqtyglpt ~]$ echo $name
superman
複制代碼           

讀取輸入值

編寫shell腳本時經常會用到需要擷取使用者輸入的功能。這就需要read指令

[api@kfxqtyglpt ~]$ read name
king
[api@kfxqtyglpt ~]$ echo ${name}
king
[api@kfxqtyglpt ~]$ read -p "輸入名字:" -t 10 name
輸入名字:aaaaa
[api@kfxqtyglpt ~]$ echo $name
aaaaa
複制代碼           

read直接加變量名即可

參數-p可以加說明,-t是等待時間

聲明變量的類型

預設定義的變量都是字元串類型,是以

[api@kfxqtyglpt ~]$ sum=10+20
[api@kfxqtyglpt ~]$ echo ${sum}
10+20
複制代碼           

聲明變量類型使用declare指令,參數

-a數組類型

-i整數類型

-x導出為環境變量

-r隻讀類型

[api@kfxqtyglpt ~]$ unset sum
[api@kfxqtyglpt ~]$ declare -i sum
[api@kfxqtyglpt ~]$ sum=10+20
[api@kfxqtyglpt ~]$ echo $sum
30
複制代碼           

數組

直接使用中括号來定義即可,使用時需要用${}

[api@kfxqtyglpt ~]$ arr[0]=aa
[api@kfxqtyglpt ~]$ arr[1]=bb
[api@kfxqtyglpt ~]$ arr[2]=cc
[api@kfxqtyglpt ~]$ echo "${arr[0]},${arr[2]}"
aa,cc