變量及運算符css
變量node
變量,便可變化的量,實質是定義一段內存空間,這段空間能夠存取任意符合定義的數據類型的數據。shell
1、bash變量命名:編程
1、只能包含字母、數字和下劃線,而且不能以數字開頭centos
2、不該該跟系統中已有的環境變量重名數組
3、最好能見名知意bash
2、bash變量分類:編程語言
1、本地變量:只在當前shell進程中有意義ide
2、環境變量:當前shell進程及子進程中有意義函數
3、局部變量:某個函數執行過程當中有意義
4、位置參數變量:在腳本中引用傳遞給腳本的參數;
擴展:在shell中,一行命令行中,命令被自動默認爲是shell參數$0,其後的命令參數按順序一次爲$1,$2,$3……${10}……
5、特殊變量:具備特殊含義的變量;例如:$?,$*,$@,$#,$$
$?:驗證上條命令行執行結果,正確執行爲0,其餘爲非0
$*:將全部的位置參數,被做爲一個單詞
$@:每一個參數都被當成一個獨立的單詞
$#:傳遞給腳本或函數的參數個數
$$:當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID
3、bash變量類型:
數據類型的定義決定了存儲空間的大小,運算範圍和存儲格式。根據編程語言對變量類型的支持分爲強類型和弱類型。
強類型:必須按照數據類型的定義來定義變量
弱類型:變量類型不嚴格區分
bash編程的變量類型屬於弱類型,它的默認數據類型是字符型數據,無需事先聲明變量,可直接使用;bash經常使用的幾種數據類型:整數,浮點數,字符型,布爾型等。
舉例:120 整數型:須要將120變爲二進制數,只佔用了8bit 字符型:120每一個數字須要一個字符,一個字符用了8bit,3個一共用了24bit
4、bash變量賦值:
格式:[let] var_name=value
聲明數據類型使用declare,例如聲明整數變量:
declare -i name[=value]
注意:若是先聲明瞭變量爲數值型數據,以後給變量賦值爲字母或字符串,那麼變量的值爲0
[root@centos ~]# set |grep name [root@centos ~]# name=obama [root@centos ~]# set|grep name name=obama [root@centos ~]# [root@centos ~]# declare -i id [root@centos ~]# id=2014 [root@centos ~]# set |grep ^id id=2014 [root@centos ~]# id=abc [root@centos ~]# set |grep ^id id=0 [root@centos ~]#
5、bash變量引用:
引用定義的變量使用符號$,例如:${name},$name
弱引用:"" 其內部的變量引用會被替換爲變量值
強引用:'' 其內部的變量引用會保持原有字符
命令引用:`COMMAND`,$(COMMAND),引用的是命令的執行結果
[root@centos ~]# ll `which cat` -rwxr-xr-x. 1 root root 48568 Oct 15 2014 /bin/cat [root@centos ~]# ll $(which cat) -rwxr-xr-x. 1 root root 48568 Oct 15 2014 /bin/cat [root@centos ~]# [root@centos ~]# set |grep name name=obama [root@centos ~]# echo '$name' $name [root@centos ~]# echo "$name" obama [root@centos ~]#
6、bash變量週期:
從聲明建立一個bash變量到這個bash變量被銷燬,稱爲一個變量的生命週期。變量的銷燬有兩種方式:
1、自動,shell進程終止
2、手動,使用命令unset
7、bash環境變量:
被"導出"的本地變量;將本地變量導出就變成了一個環境變量;也能夠直接定義:
export name[=value]
declare -x name[=value]
[root@centos ~]# name=obama [root@centos ~]# set|grep name name=obama [root@centos ~]# env |grep name [root@centos ~]# export name [root@centos ~]# env |grep name name=obama [root@centos ~]# [root@centos ~]# declare -xi id [root@centos ~]# id=1025 [root@centos ~]# set |grep ^id id=1025 [root@centos ~]# env |grep ^id id=1025 [root@centos ~]#
8、bash變量查看:
要查看本地普通變量使用命令set,查看環境變量使用:env,printenv,export
9、數組:
定義格式:
一、a=(value1 value2……value#)
二、a[1]=value1
a[2]=value2
……
3、a=(value1 [3]=value3……)
引用格式:
顯示單個元素的值: echo ${a[1]}
取出數組中全部的值: echo ${a[@]} 或者echo ${a[*]}
取得數組元素的個數: echo ${#a[@]} 或者 echo ${#a[*]}
[root@centos ~]# a[1]=1 [root@centos ~]# a[2]=2 [root@centos ~]# a[3]=3 [root@centos ~]# echo ${a[1]} 1 [root@centos ~]# echo ${a[*]} 1 2 3 [root@centos ~]# echo ${#a[*]} 3 [root@centos ~]# b=(2 3 4 5 6) [root@centos ~]# echo ${b[*]} 2 3 4 5 6 [root@centos ~]# echo ${#b[*]} 5 [root@centos ~]# c=(1 [3]=3 [4]=4 5 2) [root@centos ~]# echo ${c[*]} 1 3 4 5 2 [root@centos ~]# echo ${c[2]} [root@centos ~]#
10、擴展
截取字符串變量指定的字符,相似於cut的效果。第一個字符的編號從0開始,與數組的編號相同。
格式:
${變量:位置起點:長度}
[root@centos ~]# str=abcdefghijk [root@centos ~]# echo ${str:3} defghijk [root@centos ~]# echo ${str:4:3} efg [root@centos ~]#
運算符
啥是運算符和它能幹哈,就不用說了吧,小學生都懂的。。直接正題。先看下在bash編程中都有哪些運算符
一、算術運算符:+, -, *, /, %,+=,-=, *=, /=, %=,++,--
二、整數比較符:-gt,-lt,-ge,-le,-eq,-ne
三、字符比較符:==, >, <, !=, -z, -n, =~
四、條件組合符:-a,-o,!,&&,||
五、文件判斷符:-e,-a,-f,-d,-h,-L,-b,-c,-S,-p,-r,-w,-x,-u,-g,-k,-O,-G,-nt,-ot,-ef
不敢說上面是全部的,可是平常使用到的,上面羅列的已是絕對夠了。詳細看下每一個的使用吧。
一、算術運算符
這個真不知道怎麼解釋,小學生都會的。+ - * / 加減乘除 % 求餘
運算後賦值
+=:加後賦值
-=:減後賦值
*=:乘後賦值
/=:除後賦值
%=:求餘賦值
[root@centos ~]# declare -i i=2 [root@centos ~]# declare -i j=3 [root@centos ~]# let i+=$j [root@centos ~]# echo $i 5 [root@centos ~]# let i-=1 [root@centos ~]# echo $i 4 [root@centos ~]# let i*=3 [root@centos ~]# echo $i $j 12 3 [root@centos ~]# let i/=$j [root@centos ~]# echo $i $j 4 3 [root@centos ~]# let i%=$j [root@centos ~]# echo $i $j 1 3 [root@centos ~]
++,--這兩個學過編程的都明白啥意思。是吧,下面是這個符號的推算過程:
let count=$[$count+1] --> let count+=1 --> let count++ let count=$[$count-1] --> let count-=1 --> let count--
二、整數比較符
-gt $A -gt $B:是否大於;是則爲「真」,不然爲「假」;
-ge $A -ge $B: 是否大於等於;
-lt $A -lt $B:是否小於;
-le $A -le $B: 是否小於等於;
-eq $A -eq $B: 是否等於;
-ne $A -ne $B:是否不等於;
[root@centos bash]# test $i>$j [root@centos bash]# echo $? 0 [root@centos bash]# test $i<$j [root@centos bash]# echo $? 0 [root@centos bash]# test $i -gt $j [root@centos bash]# echo $? 1 [root@centos bash]# test $i -lt $j [root@centos bash]# echo $? 0 [root@centos bash]# echo $i $j 1 5 [root@centos bash]#
三、字符比較符
> "$A" > "$B":是否大於;
< "$A" < "$B":是否小於;
== "$A" == "$B":是否等於;
!= "$A" != "$B":是否不等於;
-z -z "$A":是否爲空;空則爲「真」,不然爲「假」
-n -n "$A":是否不空;不空則「真」,空則爲「假」
=~ $A =~ PATTERN:字符或字串是否匹配模式PATTERN
注意:應該使用[[ EXPRESSION ]],ASCII數值越大,字符比較時其值越大;
[root@centos bash]# cat fuzhi.sh #!/bin/bash if [[ $1 > $2 ]];then echo $1 elif [[ $1 < $2 ]];then echo $2 fi [root@centos bash]# [root@centos bash]# ./fuzhi.sh abc cba cba [root@centos bash]# ./fuzhi.sh cab acb cab [root@centos bash]# ./fuzhi.sh abc abc [root@centos bash]# ./fuzhi.sh abc acb acb [root@centos bash]#
4、條件組合符
條件組合符,即將多個條件表達式組合起來做爲一個總體的符號。關係爲與,或,非三種。符號:
與:-a,&&
或:-o,||
非:!
與運算: 0 -a 0 = 0
0 -a 1 = 1
1 -a 0 = 1
1 -a 1 = 1
或運算: 0 -o 0 = 0
1 -o 0 = 0
0 -o 1 = 0
1 -o 1 = 1
非運算:取反,0變1,1變0
[root@centos bash]# cat fuzhi.sh #!/bin/bash if [ $1 -gt $2 ]&&[ $2 -gt $3 ];then echo $1 elif [ $1 -lt $2 ]||[ $2 -gt $3 ];then echo $2 elif ! [ $1 -eq $3 ];then echo $3 fi [root@centos bash]# ./fuzhi.sh 3 2 1 3 [root@centos bash]# ./fuzhi.sh 1 2 3 2 [root@centos bash]# ./fuzhi.sh 2 1 3 3 [root@centos bash]#
5、文件判斷符:測試文件的存在性以及屬性
-e $file: 是否存在;存在則爲「真」,不然爲「假」;
-a $file: 同上;
-f $file:文件是否存在且爲普通文件;
-d $file:文件是否存在且爲目錄;
-h $file:是否存在且爲符號連接文件;
-L $file: 同上
-b $file:是否存在且爲塊設備文件;
-c $file:是否存在且爲字符設備文件;
-S $file:是否存在且爲套接字文件;
-p $file: 是否存在且爲管道文件;
權限判斷:
-r $file: 當前用戶對文件是否擁有讀權限;
-w $file:當前用戶對文件是否擁有寫權限;
-x $file:當前用戶對文件是否擁有執行權限;
-u $file:文件是否擁有SUID權限;
-g $file:文件是否擁有SGID權限;
-k $file:文件是否擁有sticky權限;
屬主/組判斷:
-O $file: 當前用戶是否爲指定文件的屬主;
-G $file: 當前用戶是否爲指定文件的屬組;
雙目操做符:
$file1 -nt $file2: file1是否新於file2, file1的最近一次的修改時間戳是否晚於file2的;
$file1 -ot $file2: file1是否舊於file2, file1的最近一次的修改時間戳是否早於file2的;
$file1 -ef $file2:file1與file2是否指向了同一個inode;測試兩者是否爲同一個文件的硬連接;