javascript模板字串(反引號)
一、變數介紹
在程式設計中,我們總有一些資料需要臨時存放在記憶體,以待後續使用時快速讀出。先了解一下計算機的儲存單位吧。
計算機的單位:
1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
1EB=1024PB
1ZB=1024EB
...
好了,已經夠大了!當然還有YB、BB更大的單位,同樣進位制也是1024.
1G=1024*1024*1024=1073741824B
假如你將一個1B的字元存入記憶體,如何讀出呢?有沒有一種大海撈針的感覺啊!我們討論一下計算機是如何通過讓我們人類快速將資料存在記憶體,如何從記憶體中讀出資料的。我們研究過變數後就明白了。
變數:變數是程式設計中最常用的一種臨時在記憶體中存取資料的一種方式。
變數存取原理
關於記憶體的說明
a、系統啟動 記憶體被按照1B一個單位劃分成N塊 並且以十六進位制為每一個空間編號
b、記憶體跟蹤表記錄 使用和未使用的記憶體的地址編號
c、記憶體申請 系統從未使用的記憶體中拿出一個或者一段連續空間 給你使用 同時在記憶體跟蹤表中記錄
該地址被佔用不在分給別人,同時在系統中建立對映機制
比如:變數名 STRING1=‘ABC’
name<==>0x5
d、釋放記憶體
從記憶體跟蹤表中將記錄刪除,下次存資料直接覆蓋
CHAR1(0x3)=A 從圖片可以看出,當我們在指令碼中定義變數存值的時候,可以從以下方面看到變化: a、記憶體佔用:如果存的是一個字元則佔用1個位元組,如果存的是字串則是字串的長度加1個位元組長度(\0是一個 特殊字元,代表字串結束)。 b、變數名與記憶體空間關係:計算機中會將對應的記憶體空間地址和變數名稱繫結在一起,此時代表這段記憶體空間已經被 程式佔用,其他程式不可複用;然後將變數名對應的值存在對應記憶體地址的空間裡。
二、變數定義
2.1、什麼時候需要定義變數?
如果某個內容需要多次使用,並且在程式碼中重複出現,那麼可以用變數代表該內容。這樣在修改內容的時候,僅僅需要修改變數的值。
在程式碼運作的過程中,可能會把某些命令的執行結果儲存起來,後續程式碼需要使用這些結果,就可以直接使用這個變數。
2.2、定義一個變數
變數格式: 變數名=值
在shell程式設計中的變數名和等號之間不能有空格。
變數名命名規則: 命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。 中間不能有空格,可以使用下劃線(_)。 不能使用標點符號。 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。
定義變數舉例:
VAR1=1
age=18 整形
name=‘baism’ 字串
score=88.8 浮點
注意:字串要用單引號或雙引號引起來
建議變數名為大寫,和命令區分
_name
定義變數演示:
變數賦值,此種方法設定為本地變數
[root@zutuanxue ~]# name="baism"
[root@zutuanxue ~]# school='ayitula'
[root@zutuanxue ~]# age=30
[root@zutuanxue ~]# score=88.8
2.3、取消變數 unset
取消當前環境中的變數,如果是變數設定是儲存在檔案中,下次重啟又會恢復
[root@zutuanxue ~]# unset name
[root@zutuanxue ~]# echo $name
2.4、 有型別變數 declare
-i 將變數看成整數
-r 使變數只讀 readonly,該變數的值無法改變,並且不能為unset
-x 標記變數通過環境匯出 export
-a 指定為索引陣列(普通陣列);檢視普通陣列
-A 指定為關聯陣列;檢視關聯陣列
[root@zutuanxue ~]# declare -i num='asa'
[root@zutuanxue ~]# echo $num
0
[root@zutuanxue ~]# num=100
[root@zutuanxue ~]# echo $num
100
[root@zutuanxue ~]# declare -r num
[root@zutuanxue ~]# echo $num
100
[root@zutuanxue~]# num=200
-bash: num: 只讀變數
[root@zutuanxue ~]# declare -x
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="Bai_Shuming"
declare -x LANG="zh_CN.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
三、變數分類
系統中的變數根據作用域及生命週期可以分為四類:本地變數、環境變數、全域性變數、內建變數
3.1、本地變數
使用者自定義的變數,定義在指令碼或者當前終端中,指令碼執行完畢或終端結束變數失效。
3.2、環境變數
定義在使用者家目錄下的.bashrc或.bash_profile檔案中,使用者私有變數,只能本使用者使用。
檢視當前使用者的環境變數 env
查詢當前使用者的所有變數(臨時變數與環境變數) set
3.3、將當前變數變成環境變數 export
定義一個臨時變數
1、
[root@zutuanxue tmp]# export A=hello //臨時將一個本地變數(臨時變數)變成環境變數
[root@zutuanxue tmp]# env|grep ^A
A=hello
2、
[root@zutuanxue tmp]# A=HELLO
[root@zutuanxue tmp]# export A
3、定義一個永久生效變數:
vim .bash_profile 或者 ~/.bashrc
A=hello
關於export說明
使用者登入時:
1) 使用者登入到Linux系統後,系統將啟動一個使用者shell。在這個shell中,可以使用shell命令或宣告變數,也可以
建立並執行 shell指令碼程式。
執行指令碼時:
2) 執行shell指令碼程式時,系統將建立一個子shell。此時,系統中將有兩個shell,一個是登入時系統啟動的shell,
另一個是系統為執行指令碼程式建立的shell。當一個指令碼程式執行完畢,它的指令碼shell將終止,可以返回到執行該指令碼
之前的shell。
從這種意義上來說,使用者可以有許多 shell,每個shell都是由某個shell(稱為父shell)派生的。
在子shell中定義的變數只在該子shell內有效。如果在一個shell指令碼程式中定義了一個變數,當該指令碼程式執行時,
這個定義的變數只是該指令碼程式內的一個區域性變數,其他的shell不能引用它,要使某個變數的值可以在其他shell中
被改變,可以使用export命令對已定義的變數進行輸出。
export命令將使系統在建立每一個新的shell時定義這個變數的一個拷貝。這個過程稱之為變數輸出。
父shell與子shell
3.4、全域性變數
使用export命令將本地變數輸出為當前shell中的環境變數
所有使用者及shell都可以使用,可以在/etc/profile /etc/bashrc下永久定義
列印全域性變數 printenv
定義格式
export SCHOOL='zutuanxue'
測試方法:
通過不同使用者登入測試是否能讀取變數
3.5、內建變數
系統變數(內建bash中變數) : shell本身已經固定好了它的名字和作用.
$?:上一條命令執行後返回的狀態,當返回狀態值為0時表示執行正常,非0值表示執行異常或出錯
若退出狀態值為0,表示命令執行成功
若退出狀態值為127,表示command not found
若退出狀態值為126,表示找到了該命令但無法執行(許可權不夠)
若退出狀態值為1&2,表示沒有那個檔案或目錄
$$:當前所在程序的程序號 echo $$ eg:kill -9 `echo $$` = exit 退出當前會話
$!:後臺執行的最後一個程序號 (當前終端) # gedit &
!$ 呼叫最後一條命令歷史中的引數
!! 呼叫最後一條命令歷史
$#:指令碼後面接的引數的個數
$*:指令碼後面所有引數,引數當成一個整體輸出,每一個變數引數之間以空格隔開
$@: 指令碼後面所有引數,引數是獨立的,也是全部輸出
$0:當前執行的程序/程式名 echo $0
$1~$9 位置引數變數
${10}~${n} 擴充套件位置引數變數 第10個位置變數必須用{}大括號括起來
./1.sh a b c
[root@zutuanxue shell01]# cat 2.sh
#!/bin/bash
#xxxx
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$11 = ${11}"
echo "\$12 = ${12}"
瞭解$*和$@的區別:
$* :表示將變數看成一個整體
$@ :表示變數是獨立的
#!/bin/bash
for i in "$@"
do
echo $i
done
echo "======我是分割線======="
for i in "$*"
do
echo $i
done
[root@zutuanxue shell01]# bash 3.sh a b c
a
b
c
======我是分割線=======
a b c
變數總結說明:
本地變數:當前使用者自定義的變數。當前程序中有效,其他程序及當前程序的子程序無效。
環境變數:當前程序有效,並且能夠被子程序呼叫。
全域性變數:全域性所有的使用者和程式都能呼叫,且繼承,新建的使用者也預設能呼叫.
內建變數:shell本身已經固定好了它的名字和作用.
四、變數取值
讀取變數內容符: 讀取方法:變數名
變數內容讀出
[root@zutuanxue ~]# echo $name
baism
[root@zutuanxue ~]# echo $school
ayitula
[root@zutuanxue ~]# echo $age
30
[root@zutuanxue ~]# echo $score
88.8
注意
變數讀取過程中,預設單引號是不解釋變數的.比如
[root@zutuanxue ~]# echo '$name'
$name
如果必須使用單引號還要讀取變數的值可以使用eval命令[重新運算求出引數的內容]
[root@zutuanxue ~]# eval echo '$name'
baism
五、其他變數(擴充套件)
1)取出一個目錄下的目錄和檔案:dirname和 basename
2)變數"內容"的刪除和替換
一個“%”代表從右往左去掉一個/key/
兩個“%%”代表從右往左最大去掉/key/
一個“#”代表從左往右去掉一個/key/
兩個“##”代表從左往右最大去掉/key/
# A=/root/Desktop/shell/mem.txt
# echo $A
/root/Desktop/shell/mem.txt
# dirname $A 取出目錄
/root/Desktop/shell
# basename $A 取出檔案
mem.txt
# url=www.taobao.com
# echo ${#url} 獲取變數的長度
# echo ${url#*.} 以分隔符.界限 *匹配所有
# echo ${url##*.}
# echo ${url%.*}
# echo ${url%%.*}