數組
數據結構,數據序列,保存了連續的多個數據,可以使用索引獲取相關元素,相當于多個變量的集合
§數組名和索引
索引:編號從0開始,屬于數值索引
注意:所以可支持使用自定義的格式,而不僅是數值格式,即關聯索引,bash4.0版本之后開始支持,bash的數組支持稀疏格式(索引不連續)
§聲明數組
declare –a arryname
declare –A arryname 關聯數組
初始化或賦值:各元素之間使用空白字符隔開,不加下標默認為第一個
第一種方式
arryname=(‘a’ ‘b’ ‘c’)
arryname=( [0]=’a’ [1]=’b’ [2]=’c’)
第二種方式
arryname[1]=”one”
第三種方式:交互式
read -a arryname
a b c
§ 引用數組
echo ${arryname[0]}
§獲取元素的長度
echo ${#arryname[@]}
echo ${#arryname[*]}
當我們想去某個字符的長度,撓破腦袋想找個工具來計算出字符串的長度時,bash shell提供了計算出字符的長度,這時候bash shell的功能就展露無遺了
bash的偽隨機生成器
$RANDOM
取特定位數的
$[$RANDOM%11]:取10以內的隨機數
§數組數據處理
引用數組中的元素:
所有元素:echo ${arryname[@] , echo ${arryname[*]}
數組切片:${arryname[@]:offset:number}
offset:要跳過的元素個數
number:要去除的元素個數
echo ${arryname[@]:2:3} 跳過兩個字符,取三個字符
向數組中追加元素
arryname[${#arryname[@]}]
刪除數組中的某元素:導致稀疏格式
unset arryname[索引編號]
關聯數組:
dexclare –A arryname3
arryname=([a]=1 [b]=2 [c]=3 … ),這里的索引編號可以自定義
注意:在賦值之前,必須要聲明數組為關聯數組
§字符串處理
bash的字符串處理工具
字符串切片
echo ${#arryname}:返回字符串變量的arryname的長度
echo ${arryname:offset}:返回字符串變量arryname從第offset個字符后(不包括offset的取值在0到${#arryname}-1之間
echo ${arryname:offset:number}:返回字符串變量arryname中從offset個字符后(不包括)的字符開始,長度為number的字符
echo ${arryname: -number}:去字符串最右側的幾個字符
注意:冒號后必須有一個空白字符
基于模式取子串
echo ${arryname#*keyword}:其中keywod可以是指定的任意字符
功能:自左而右,查找arryname變量所存儲的字符串中,第一次出現keyword,刪除字符串開頭至第一次出現keyword字符之間的所有字符
echo ${arryname##*keyword}
功能:自左而右,查找arryname變量所存儲的字符串中,刪除字符串開頭至最后一次出現keyword字符之間的所有字符
echo ${arryname%keyword*}:其中keyword可以使指定的任意字符
功能:自由而左,查找arryname變量所存儲的字符串中,第一次出現keyword,刪除字符串最后一個字符至第一次出現keyword字符之間的所有字符
echo ${arryname%%keyword*}
功能:自由而左,查找arryname變量所存儲的字符串中,刪除字符串最后一個字符至最后一次出現keyword字符之間的所有字符
在工作中,有時可能會遇到去一個url的協議以及端口這時候取字符串這個功能就非常好使了
url=http://www.magedu.com:80
${url##*:}80
${url%%:*}http
查找替換
echo ${arryname/pattern/abc:查找arryname所表示的字符串中,第一次被pattern所匹配到的字符串,用abc來替換
echo ${arryname//pattern/abc} :查找arryname所表示的字符串中,所有被pattern所匹配到的字符串,用abc來替換
echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,行首被pattern所匹配到的字符串,用abc來替換
echo ${arryname/%pattern/abc}:查找arryname所表示的字符串中,行尾被pattern所匹配到的字符串,用abc來替換
查找并刪除
echo ${arryname/pattern}:查找arryname所有字符串中,刪除第一次被pattern所匹配到的字符串
echo ${arryname//pattern}:查找arryname所有字符串中,刪除所有被pattern所匹配到的字符串
echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,刪除行首被pattern所匹配到的字符串echo
${arryname/%pattern/abc}:查找arryname所表示的字符串中,刪除行尾被pattern所匹配到的字符串
字符大小寫轉換
echo ${arryname^^}:把arryname的所有小寫字母轉換成大寫
echo ${arryname,,}:把arryname的所有大寫字母轉換成小寫
變量賦值
echo ${arryname:-value}:如果arryname為空或者未設置,那么就返回value,否則,則返回arryname的值
echo ${arryname:+value}:如果arryname非空,那么就返回value,否則返回空值
echo ${arryname:=value}:如果arryname為空或者未設置,那么就返回value,并且將value賦值給arryname,否則返回arryname的值
echo ${arryname:?error_messages}:如果arryname的值為空或未被設置,那么返回error_messages;否則,則返回arryname的值
為腳本程序使用配置文件,實現變量賦值
1. 定義在文本文件中,每行定義”name=value”
2. 在腳本中source次文件即可
Shell變量一般是無類型的,但是Bash Shell提供了declare和typeset兩個命令用于指定變量的類型,兩個命令是完全等價的
declare [選項] 變量名
-r 將變量設置為只讀屬性
-I 將變量設置為整型
-a 將變量設置為數組
-A 將變量設置為關聯數組
-f 顯示此腳本前定義過的所有函數名及內容
-F 僅顯示此腳本前定義過的所有函數名
-x 將變量定義為環境變量
-l 將變量值轉為小寫字母
-u 將變量值轉為大寫字母
間接變量引用
如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就成為間接引用
a=b
b=123
a的值b,而b又是變量名
b的值為123,間接變量引用是指通過a獲得變量值123的行為
Bash Shell提供了兩種格式實現間接變量引用
eval c=\\$$a
c=${!a}
Bash如何展開命令行
把命令行分成單個命令詞
展開別名
展開大括號中的聲明
展開波浪符聲明(~)
命令替換$()和` `
再次把命令行分成命令詞
展開文件通配符(*、?、[ab])
準備I/O重定向(<、>)
運行命令
防止擴展
反斜線(\)會使隨后的字符按原意解釋
echo you cost :\$500
加引號來防止擴展
單引號’ ‘ 防止所有擴展
雙引號也防止所有擴展,但是一下幾種情況除外
$ 變量擴展
` 命令替換
\ 禁止單個字符擴展
! 歷史命令替換
Bash的配置文件
按生效范圍劃分
全局配置
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
個人配置
~/.bash_profile
~/.bashrc
按功能劃分
profile類:為交互式登錄的shell提供配置
全局:/etc/profile,/etc/profile.d/*.sh
個人:~/.bash_profile
功能
1. 用于定義環境變量
2. 運行命令或腳本
bashrc類:為非交互式登錄的shell提供配置
全局:/etc/bashrc
個人:~/.bashrc
功能
定義命令別名
定義本地變量
修改profile和bashrc文件后需生效
兩種方法:
重新啟動shell進程
“.” 或source 文件
shell登錄的兩種方式
交互式登錄:
(1)直接通過終端輸入賬號密碼登錄;
(2)使用“su-UserName”切換的用戶
執行順序:
/etc/profile-à/etc/profile.d/*.shà~/.bash_profileà~/.bashrcà/etc/bashrc
非交互式登錄:
(1)suUserName
(2)圖形界面下打開的終端
(3)執行腳本
執行順序:
~/.bashrcà/etc/bashrcà/etc/profile.d/*.sh
Bash退出任務
保存在~/.bash_logout文件中
在退出登錄shell時運行
用于創建自動備份和清除臨時文件
1、生成10個隨機數,采用冒泡算法進行升序或降序排序
將給出的數,一次做大小比較,從小往大的順序排列
#!/bin/sh
#sorting following array
echo "please input a number list:"
read -a arr
for (( i=0 ; i<${#arr[@]} ; i++ ))
do
for (( j=${#arr[@]} – 1 ; j>i ; j– ))
do
#echo $j
if [[ ${arr[j]} -lt ${arr[j-1]} ]]
then
t=${arr[j]}
arr[j]=${arr[j-1]}
arr[j-1]=$t
fi
done
done
echo "after sorting:"
echo ${arr[@]}
原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/39355
文章內容很完整,讓我明白了數組的定義和調用,但在bash環境配置,只是進行了知識點的羅列,這是不合適的,希望自己能通過總結成自己的語言,清晰的表述出自己想要表達的意思。