1. 程式人生 > 其它 >shell階段-day3-基本資料型別與值操作

shell階段-day3-基本資料型別與值操作

技術標籤:Linux基礎日記

文章目錄

基本資料型別與值操作

一、 資料型別介紹

1、什麼是資料?為何要有多種型別的資料?

資料即變數的值,如age=18,18則是我們儲存的資料。
變數的是用來反映/保持狀態以及狀態變化的,毫無疑問針對不同的狀態就應該用不同型別的資料去標識

2、shell是一門解釋型、弱型別、動態語言

概括地說,程式語言的劃分方式有以下三種:
1、編譯型or解釋型
2、強型別or弱型別
	強型別語言: 資料型別不可以被忽略的語言
    即變數的資料型別一旦被定義,那就不會再改變,除非進行強轉。
在python中,例如:name = 'egon',這個變數name在被賦值的那一刻,資料型別就被確定死了,是字元型,值為'egon'。

	弱型別語言:資料型別可以被忽略的語言
比如linux中的shell中定義一個變數,是隨著呼叫方式的不同,資料型別可隨意切換的那種,即shell對資料型別的概念沒有那麼強的要求

3、動態型or靜態型
	動態語言 :執行時才進行資料型別檢查(即在變數賦值時,就確定了變數的資料型別,不用事先給變數指定資料型別)
	靜態語言:需要事先給變數進行資料型別定義

所以綜上所述,shell是一門解釋型的弱型別動態語言!

二、基本資料型別

1、數字型別

int整型
定義:age=10
用於標識:年齡,等級,身份證號,qq號,個數

float浮點型
定義:salary=3.1
用於標識:工資,身高,體重

2、字串

在shell中,加了引號的字元就是字串型別

定義:name='egon' 
用於標識:描述性的內容,如姓名,性別,國籍,種族


# 注意1:字串包含空格必須加引號
[[email protected] ~]# msg="hello egon"
[[email protected] ~]# msg=hello egon
bash: egon: 未找到命令...

# 注意2:連續的字元不加引號包含也是可以的,但我們還是強烈建議加上引號,規範一些
[[email protected] ~]# msg=hello [[email protected] ~]# echo $msg hello [[email protected] ~]# # 注意3:單引號與雙引號是不同的 " " 弱引用,引號的特殊字元有意義 ' ' 強引用,引號內所有特殊字元都取消意義 [[email protected] ~]# name=“egon” [[email protected] ~]# echo "${name} is good" egon is good [[email protected] ~]# echo '${name} is good' ${name} is good

3、shell是弱型別語言

[[email protected] ~]# x=10
[[email protected] ~]# y="3"
[[email protected] ~]# expr $x + $y
13

4、陣列介紹

# 1、什麼是陣列?
陣列就是一系列元素的集合,一個數組內可以存放多個元素

# 2、為何要用陣列?
我們可以用陣列將多個元素彙總到一起,避免單獨定義的麻煩

5、陣列分為兩種

  • 普通陣列:只能使用整數作為陣列索引
  • 關聯陣列:可以使用字串作為陣列索引,需要用declare -A宣告

1、普通陣列

=================宣告普通陣列=================
# 方式一:array=(元素1 元素2 元素3)
array=(egon 18 male)

# 方式二:array=([key1]=value1 [key2]=value2 [key3]=value3)
array=([0]=111 [1]="two" [2]=333)

# 方式三:依次賦值
array_new[0]=111
array_new[1]=222
array_new[2]="third"

# 方式四:利用執行命令的結果設定陣列元素:array=($(命令))  或者  array=(`命令`)
該方式會將命令的結果以空格為分隔符切成多個元素然後賦值給陣列
[[email protected] ~]# ls /test
a.txt	b.txt
[[email protected] ~]# array3=(`ls /test`)
[[email protected] ~]# declare -a |grep array3
declare -a array3='([0]="a.txt" [1]="b.txt")'


# ps:檢視宣告過的陣列
declare -a

=================訪問普通陣列=================
[[email protected] ~]# ip_array=(1.1.1.1 2.2.2.2 3.3.3.3)

# 正向索引
[[email protected] ~]# echo ${ip_array[0]}
1.1.1.1
[[email protected] ~]# echo ${ip_array[1]}
2.2.2.2
[[email protected] ~]# echo ${ip_array[2]}
3.3.3.3
[[email protected] ~]# 

# 負向索引
[[email protected] ~]# echo ${ip_array[-1]}
3.3.3.3
[[email protected] ~]# echo ${ip_array[-2]}
2.2.2.2
[[email protected] ~]# echo ${ip_array[-3]}
1.1.1.1

2、關聯陣列

=================宣告關聯陣列=================
[[email protected] ~]# declare -A info
[[email protected] ~]# info["name"]="egon"
[[email protected] ~]# info["age"]=18
[[email protected] ~]# info["gender"]="male"
[[email protected] ~]# 
[[email protected] ~]# declare -A |grep info
declare -A info='([gender]="male" [name]="egon" [age]="18" )'
[[email protected] ~]# 
[[email protected] ~]# echo ${info[*]}
male egon 18
[[email protected] ~]# 
[[email protected] ~]# echo ${info["name"]}

=================訪問關聯陣列=================
[[email protected] ~]# info=([0]="egon" ["age"]=18 ["gender"]="male")
[[email protected] ~]# echo ${info[0]}
egon
[[email protected] ~]# echo ${info["age"]}
18
[[email protected] ~]# echo ${info["gender"]}
male
[[email protected] ~]# 

PS:bash shell只支援一維陣列,但陣列元素個數沒有限制。

三、變數值操作

1、獲取變數值的長度

[[email protected] ~]# echo ${#url}
15

企業面試題:已知變數msg='hello world!',請統計出變數中包含的字元數量
# 方法一:
[[email protected] /]# echo ${#msg}
12
# 方法二:
[[email protected] /]# echo $msg | wc -L
12
# 方法三:
[[email protected] /]# echo $msg|awk '{print length}'
12
# 方法四:
[[email protected] ~]# expr length "$msg" #length是一個函式,注意因為msg的值有空格,所以$msg必須用引號包含
12

2、切片

列印切出該變數值的指定字元

語法:
${paramter:offset:length}

[[email protected] /]# msg="abcdef"
[[email protected] /]# echo ${msg:3}  # 從3號索引開始,一直到最後
def
[[email protected] /]# echo ${msg:3:2}  # 從3號索引開始,往後數2個字元
de
[[email protected] /]# echo ${msg::3}  # 從0開始,往後數3個字元
abc

3、截斷

=================》一、砍掉左邊的字元《=================
1.簡單使用 
[[email protected] ~]# url="www.sina.com.cn"
[[email protected] ~]# echo ${url#www.}
sina.com.cn

2.結合*=》非貪婪,預設情況下*是非貪婪,儘可能地少“吃”字元
[[email protected] ~]# echo ${url#*w}
ww.sina.com.cn

3.結合*=》貪婪,儘可能地多“吃”字元
[[email protected] ~]# echo ${url##*w}  # *會盡可能多地吃掉字元,一直匹配到最遠的那個w才停下來
.sina.com.cn

=================》二、砍掉右邊的字元《=================
1.簡單使用
[[email protected] ~]# url="www.sina.com.cn"
[[email protected] ~]# echo ${url%.cn}
www.sina.com

2.結合*=》非貪婪
[[email protected] ~]# echo ${url%.*}
www.sina.com
3.結合*=》貪婪
[[email protected] ~]# echo ${url%%.*}
www

=================》三、應用示例《=================
[[email protected] ~]# hostname
egon.xxx.com
[[email protected] ~]# echo $HOSTNAME
egon.xxx.com
[[email protected] ~]# echo ${HOSTNAME%.*}
egon.xxx
[[email protected] ~]# echo ${HOSTNAME%%.*}
egon

4、內容的替換

[[email protected] ~]# url="www.sina.com.cn"
[[email protected] ~]# echo ${url/sina/baidu}
www.baidu.com.cn
[[email protected] ~]# echo ${url/n/N}
www.siNa.com.cn
[[email protected] ~]# echo ${url//n/N}  # 貪婪
www.siNa.com.cN

# 應用示例:批量修改檔名稱
[[email protected] shell]# touch egon_2020_{01..05}_linux.txt
[[email protected] shell]# ls
egon_2020_01_linux.txt  egon_2020_02_linux.txt  egon_2020_03_linux.txt  egon_2020_04_linux.txt  egon_2020_05_linux.txt
[[email protected] shell]# for i in `ls *linux.txt`;do mv $i ${i/_linux/};done
[[email protected] shell]# ls
egon_2020_01.txt  egon_2020_02.txt  egon_2020_03.txt  egon_2020_04.txt  egon_2020_05.txt

5、變數的替代

語法:
${x:-臨時變數資訊}
${x:=新的變數資訊}
${x:?沒有設定變數提示資訊}   
${x:+有設定變數提示資訊} 

1.${parameter-word}: 當調取變數沒有定義過, 就返回word字串資訊
[[email protected] ~]# unset name 
[[email protected] ~]# echo ${name}

[[email protected] ~]# echo ${name-"egon"}  # 沒有定義過變數name,則使用-後的值
egon
[[email protected] ~]# 
[[email protected] ~]# gender=  # 定義過變量了,則使用變數的原值,哪怕變數的值為空值
[[email protected] ~]# echo ${gender-"male"}

[[email protected] ~]# 
[[email protected] ~]# age=18  
[[email protected] ~]# echo ${age-19}  # 定義過變量了,則使用變數的原值
18
[[email protected] ~]# 

2.${parameter:-word}: 當調取變數資訊值為空時或未定義變數, 就返回word字串資訊
[[email protected] ~]# unset x  
[[email protected] ~]# unset y
[[email protected] ~]# unset z
[[email protected] ~]# 
[[email protected] ~]# echo ${x:-aaa}  # 沒有定義過變數x,則使用-後的值
aaa
[[email protected] ~]# y=
[[email protected] ~]# echo ${y:-aaa}  # 定義過變數y,但變數y的值為空值,則使用-後的值
aaa
[[email protected] ~]# z=333
[[email protected] ~]# echo ${z:-aaa}  # 定義過變量了,並且變數有一個非空的原值,則使用變數的原值
333

3.{parameter:=word}:當調取變數資訊值為空時或未定義,則設定指定字串為新的變數值
[[email protected] /]# unset x
[[email protected] /]# echo ${x:=123}
123
[[email protected] /]# echo $x
123

4.${parameter:?word}:當調取變數資訊值為空時或未定義,指定為賦值的錯誤提示資訊
[[email protected] /]# unset x
[[email protected] /]# echo ${x:?該變數沒有定義過}
-bash: x: 該變數沒有定義過
        
5.${parameter:+word}:當調取變數資訊值為空時或未定義,不做任何處理,否則word字串將替代變數值
[[email protected] /]# unset x
[[email protected] /]# echo ${x:+哈哈哈}

[[email protected] /]# x=123
[[email protected] /]# echo ${x:+哈哈哈}
哈哈哈

6、let

1.變數的值+1
[[email protected] ~]# j=1
[[email protected] ~]# let ++j
[[email protected] ~]# echo $j
2
[[email protected] ~]# 

2.表示式的值
[[email protected] ~]# unset i
[[email protected] ~]# i=1
[[email protected] ~]# j=1
[[email protected] ~]# let x=i++  # 先把i賦值給x,然後再++
[[email protected] ~]# let y=++j  # 先++j,然後再把j的結果賦值給y
[[email protected] ~]# echo $i
2
[[email protected] ~]# echo $j
3
[[email protected] ~]# echo $x
1
[[email protected] ~]# echo $y
2

7、取命令的結果賦值給變數

``$()	#都是取裡面的命令,反引號會被優先呼叫

` `  命令替換 等價於 $()   反引號中的shell命令會被先執行
[[email protected] ~]# touch `date +%F`_file1.txt  
[[email protected] ~]# touch $(date +%F)_file2.txt 

[[email protected] ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'"  # 錯誤
[[email protected] ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}') # 正確
[[email protected] ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`  # 正確