Linux基礎之bash腳本編程初級-變量與算術運算

什麼是變量?

    變量最初來源於數學,指的是非固定的值可變化的數通常用拉丁字母表示。在計算機中變量它依舊指的是可變化的數,只不過表現形式有些變化。它指的是變量名+所指向的內存空間

                                                  以下實驗環境均在CentOS7.2進行



變量的特點

變量分強類型變量,與弱類型變量

強類型變量:變量需事先聲明且需提前定義其變量存儲格式

弱類型變量:不需事先聲明,不需定義變量存儲格式。

bash把所有變量統統視作字符型;bash中的變量無需事先聲明,相當於,把聲明和賦值過程同時實現。


變量名的命名規範

變量名只能包含數字字母下劃線,而且不能以數字開頭

其命名要求見名知義,命名機制遵循某種法則(駝峯法則)不能使用程序的保留字:if,else,then,while,for...




bash的變量類型及其使用格式

本地變量,環境變量,局部變量,位置參數變量,特殊變量

變量引用格式:$VAR、${VAR}

………………………………………………………………………………………………………………………

本地變量:作用域僅爲當前shell進程


變量賦值:name=‘value’

value有如下引用類型


1、直接字符串引用,格式name="CHARS"

[root@centos7 ~]# name1=abc
[root@centos7 ~]# echo $name1 
abc


2、變量引用,格式:name=“$VAR”

[root@centos7 ~]# name2=$SHELL
[root@centos7 ~]# echo $name2
/bin/bash


3、命令引用,格式: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進程及子進程

變量賦值:

有四種賦值格式:

    1、export name=value

    2、name=value

       export name

    3、declare -x name=value

    4、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 "$*"

wKioL1ev-1mCXOcbAAAVpS__va0046.gif

  上面特殊變量及位置變量均需要結合腳本才能使用。$@,$*二者雖然有區別不過在初學時可以不必在意,當學到一定階段接觸了一定的腳本後自然也就會區分二者的不同了。




算術運算


在未學習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

第四種需要轉義,其他三種不需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章