shell腳本基礎進階(二)----變量及運算符

變量及運算符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,查看環境變量使用:envprintenvexport

9、數組:

定義格式:

一、a=(value1 value2……value#)

二、a[1]=value1

       a[2]=value2

       ……

3a=(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

非運算:取反,01,10

[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 $file2file1file2是否指向了同一個inode;測試兩者是否爲同一個文件的硬連接;

相關文章
相關標籤/搜索