什麼是變量?
linux
變量最初來源於數學,指的是非固定的值可變化的數一般用拉丁字母表示。在計算機中變量它依舊指的是可變化的數,只不過表現形式有些變化。它指的是變量名+所指向的內存空間。
shell
如下實驗環境均在CentOS7.2進行centos
變量的特色
bash
變量分強類型變量,與弱類型變量
ide
強類型變量:變量需事先聲明且需提早定義其變量存儲格式函數
弱類型變量:不需事先聲明,不需定義變量存儲格式。學習
bash把全部變量通通視做字符型;bash中的變量無需事先聲明,至關於,把聲明和賦值過程同時實現。centos7
變量名的命名規範:spa
變量名只能包含數字,字母和下劃線,並且不能以數字開頭。blog
其命名要求見名知義,命名機制遵循某種法則(駝峯法則);不能使用程序的保留字:if,else,then,while,for...
bash的變量類型及其使用格式
本地變量,環境變量,局部變量,位置參數變量,特殊變量
變量引用格式:$VAR、${VAR}
………………………………………………………………………………………………………………………
本地變量:做用域僅爲當前shell進程
變量賦值:name=‘value’
value有以下引用類型
一、直接字符串引用,格式:name="CHARS"
[root@centos7 ~]# name1=abc [root@centos7 ~]# echo $name1 abc
二、變量引用,格式:name=「$VAR」
[root@centos7 ~]# name2=$SHELL [root@centos7 ~]# echo $name2 /bin/bash
三、命令引用,格式:name=`COMMAND` | name=$(COMMAND)
[root@centos7 ~]# name3=`date` [root@centos7 ~]# echo $name3 2016年 08月 14日 星期日 11:16:55 CST [root@centos7 ~]# name3=$(date) [root@centos7 ~]# echo $name3 2016年 08月 14日 星期日 11:17:11 CST
「」:弱引用,其中的變量引用會被替換爲變量值;
[root@centos7 ~]# name4="$name1" [root@centos7 ~]# echo $name4 abc
‘’:強引用,其中的變量引用不會被替換爲變量值,而保持原字符串;
[root@centos7 ~]# name5='$name1' [root@centos7 ~]# echo $name5 $name1
命令set用於顯示已定義的全部變量
撤銷已定義的變量,格式:unset 變量名
[root@centos7 ~]# echo $name5 $name1 [root@centos7 ~]# unset name5 [root@centos7 ~]# echo $name5 [root@centos7 ~]#
注:在剛接觸bash變量時特別容易搞錯的就是變量的使用格式,有時候該命令引用卻忘記加``或$(),還有就是強引用與弱引用的使用時機。
下面以例子說明本地變量的做用範圍,使用命令bash進入子shell
[root@centos7 ~]# bash [root@centos7 ~]# echo $name1 [root@centos7 ~]# exit exit [root@centos7 ~]# echo $name1 abc
由實驗可知,做用域僅爲當前shell進程。固然上面實驗作的不夠完善,由於並無演示在符父shell中其變量是否有效,你們能夠在下面補充實驗去驗證。
………………………………………………………………………………………………………………………
環境變量:做用域爲當前shell進程及子進程
變量賦值:
有四種賦值格式:
一、export name=value
二、name=value
export name
三、declare -x name=value
四、name=value
declare -x name
注:bash內嵌了許多環境變量(一般全爲大寫字符),用於定義bash的工做環境
查看/顯示環境變量 命令
export
[root@centos7 ~]# export | head -5 declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000" declare -x HOME="/root" declare -x HOSTNAME="centos7" declare -x LANG="zh_CN.UTF-8"
declare -x
[root@centos7 ~]# export | head -5 declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000" declare -x HOME="/root" declare -x HOSTNAME="centos7" declare -x LANG="zh_CN.UTF-8"
printenv
[root@centos7 ~]# printenv | head -5 XDG_SESSION_ID=8 HOSTNAME=centos7 SELINUX_ROLE_REQUESTED= TERM=linux SHELL=/bin/bash
env
[root@centos7 ~]# printenv | head -5 XDG_SESSION_ID=8 HOSTNAME=centos7 SELINUX_ROLE_REQUESTED= TERM=linux SHELL=/bin/bash
上面四個命令雖然顯示順序略有不一樣可是所包含的內容都是同樣的
[root@centos7 ~]# env | wc -l 24 [root@centos7 ~]# printenv | wc -l 24 [root@centos7 ~]# export | wc -l 24 [root@centos7 ~]# declare -x | wc -l 24
撤銷環境變量
格式:unset VAR
下面經過例子驗證環境變量的做用範圍
[root@centos7 ~]# export name6=$name2 [root@centos7 ~]# echo $name6 /bin/bash [root@centos7 ~]# bash [root@centos7 ~]# echo $name6 /bin/bash
………………………………………………………………………………………………………………………
局部變量:做用域僅爲某代碼片斷(一般用在函數)
由於函數還沒學到,這裏不舉例子
………………………………………………………………………………………………………………………
位置變量:當執行腳本的shell進程傳遞的參數
$1,$2,...$(10)...:對應調用第1,第2...第10個參數
………………………………………………………………………………………………………………………
特殊變量:shell內置的特殊功用的變量
$#:傳遞給腳本參數的個數
$*:傳遞給腳本的全部參數;各參數讀成多個獨立字符串
$@:傳遞給腳本的全部參數;各參數讀成一個完整的字符串形式
$?:程序執行狀態返回值,0表示正確,1-255表示失敗
$0:表示命令自己
下面以一個簡單的腳原本給出位置變量與特殊變量的應用
[root@centos7 test]# cat var1.sh #!/bin/bash # echo "$1" echo "$2" echo "$#" echo "$@" echo "$*"
上面特殊變量及位置變量均須要結合腳本才能使用。$@,$*兩者雖然有區別不過在初學時能夠沒必要在乎,當學到必定階段接觸了必定的腳本後天然也就會區分兩者的不一樣了。
算術運算
在未學習bash中的算術運算以前若是要計算從1+...+10須要使用管道將其送入bc計算器來解決,
echo {1..10} | tr ' ' '+'| bc很麻煩。而使用bash中的算術運算則能夠簡化代碼。
bash中的算術運算格式:有不少種,本文只介紹經常使用的4種
1)let VAR=算術運算表達式
[root@centos7 test]# let sum1=1+10 [root@centos7 test]# echo $sum1 11
2)VAR=$[算術表達式]
[root@centos7 test]# sum2=$[2+2] [root@centos7 test]# echo $sum2 4
3)VAR=$((算術表達式))
[root@centos7 test]# sum3=$((5+5)) [root@centos7 test]# echo $sum3 10
4)VAR=$(expr $ARG $OP $ARG2)
[root@centos6 ~]# sum4=$(expr 2+8) [root@centos6 ~]# echo $sum4 2+8 [root@centos6 ~]# sum4=$(expr 2 + 8 ) [root@centos6 ~]# echo $sum4 10
這種是調用expr命令計算後面運算表達式,它要求數值與運算符之間有空格,沒有空格則不進行計算,保持運算表達式本來模樣賦值給變量。
注:它與上述三種不一樣之處還有若是有乘法運算,乘法符號*在第四種裏面須要加\進行轉義。
如下爲四種算術運算在乘法中的表現
[root@centos6 ~]# sum4=$(expr 2 * 8 ) expr: 語法錯誤 [root@centos6 ~]# sum4=$(expr 2 \* 8 ) [root@centos6 ~]# echo $sum4 16 [root@centos6 ~]# let sum1=6*6 [root@centos6 ~]# echo $sum1 36 [root@centos6 ~]# sum2=$[2*3] [root@centos6 ~]# echo $sum2 6 [root@centos6 ~]# sum3=$((3*4)) [root@centos6 ~]# echo $sum3 12
第四種須要轉義,其餘三種不須要。