概述:
承接之前腳本編程部分,本篇將介紹一下腳本編程基礎語法的最后一部分內容,具體分為:
1、數組簡介
2、高級字符串處理
3、高級變量操作
4、用戶環境配置
5、數組實例演示
第一章 數組簡介
1、數組的相關概念
數組:一種數據結構,存儲多個元素的連續的內存空間,相當于多個變量的集合,可以使用索引獲取相關元素
數組名和索引
索引:編號從0開始,屬于數值索引
注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引, bash4.0版本之后開始支持。bash的數組支持稀疏格式(索引不連續)
2、數組的定義
declare -a ARRAY_NAME 聲明為普通數組,可以不用事先定義,直接使用
declare -A ARRAY_NAME 聲明為關聯數組,關聯數組必須先申明后使用
3、數組元素的賦值:
<1>一次只賦值一個元素;ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[4]="Thursday"
<2> 一次賦值全部元素:(支持類似for中列表的賦值方式)
ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)
如:
aa=(/boot/*)
aa=(`ls /root`)
aa=({1..9})
aa=({1,2}.{a,b}) 此時數組中是1.a 1.b 2.a 2.b
<3> 只賦值特定元素:ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)
如:color=(‘red’ ‘blue’ [6]=‘green’)
此時color[0]值為red、color[1]值為blue、color[2]到color[5]值為空,color[6]值為green
<4> 交互式數組值對賦值 read -a ARRAY_NAME
4、數組引用
引用數組中某元素的值: ${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下標為0的元素
數組的長度(數組中元素的個數):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
數組的中某個元素的字符長度:
${#ARR_NAME[INDEX]}
引用數組中的元素:
所有元素: ${ARRAY[@]}, ${ARRAY[*]}
數組切片: ${ARRAY[@]:offset:number}
offset: 要跳過的元素個數
number: 要取出的元素個數
取偏移量之后的所有元素
${ARRAY[@]:offset}
5、向數組中追加元素:(放到數組最后一個)
ARRAY[${#ARRAY[*]}]
6、刪除數組中的某元素:導致稀疏格式
unset ARRAY[INDEX]
7、關聯數組:declare -A ARRAY_NAME
第二章 高級字符串處理
1、字符串切片:
${#var}:返回字符串變量var的長度
如:
aa=abcdefg
echo ${#aa} 結果為7
${var:offset}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,到最后的部分,offset的取值在0 到 ${#var}-1 之間
如:
aa=abcdefg
echo ${aa:3} 結果為defg
${var:offset:number}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,長度為number的部分
如:
aa=abcdefg
echo ${aa:3:2} 結果為de
${var: -lengh}:取字符串的最右側幾個字符:注意:冒號后必須有一空白字符
如:
aa=abcdefg
echo ${aa: -3} 結果為efg
echo ${aa:2: -1} 結果為 cdef
2、基于模式取子串:
${var#*word}:其中word可以是指定的任意字符
功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符
如:
aa=abcdefgabcdefgabcdefg
echo ${aa#*de} 結果為fgabcdefgabcdefg
${var##*word}:同上,不同的是,刪除的是字符串開頭至最后一次由word指定的字符之間的所有內容
如:
aa=abcdefgabcdefgabcdefg
echo ${aa##*de} 結果為fg
如:
file="/var/log/messages"
echo ${file##*/} 結果為 messages
${var%word*}:其中word可以是指定的任意字符;
功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最后一個字符向左至第一次出現word字符之間的所有字符;
如:
aa=abcdefgabcdefgabcdefg
echo ${aa%de*} 結果為 abcdefgabcdefgabc
如:
file="/var/log/messages"
echo ${file%/*} 結果為 /var/log
${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最后一次出現word字符之間的所有字符;
如:
aa=abcdefgabcdefgabcdefg
echo ${aa%%de*} 結果為 abc
3、查找替換:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之
如:
aa=abcdefgabcdefgabcdefg
echo ${aa/de/DE} 結果為 abcDEfgabcdefgabcdefg
${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之
如:
aa=abcdefgabcdefgabcdefg
echo ${aa//de/DE} 結果為 abcDEfgabcDEfgabcDEfg
${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之
如:
aa=abcdefgabcdefgabcdefg
echo ${aa/#abcde/DE} 結果為 DEfgabcDEfgabcDEfg
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之
如:
aa=abcdefgabcdefgabcdefg
echo ${aa/%efg/DE} 結果為 abcdefgabcdefgabcdDE
4、查找并刪除:
${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串
如:
aa=abcdefgabcdefgabcdefg
echo ${aa/de} 結果為 abcfgabcdefgabcdefg
${var//pattern}:查找var所表示的字符串中,刪除所有被pattern所匹配到的字符串
如:
aa=abcdefgabcdefgabcdefg
echo ${aa//de} 結果為 abcfgabcfgabcfg
${var/#pattern}:查找var所表示的字符串,刪除行首所匹配到的字符串
如:
aa=abcdefgabcdefgabcdefg
echo ${aa/#abc} 結果為 defgabcdefgabcdefg
${var/%pattern}:查找var所表示的字符串,刪除行尾所匹配到的字符串
如:
aa=abcdefgabcdefgabcdefg
echo ${aa/%efg} 結果為 abcdefgabcdefgabcd
5、字符大小寫轉換:
${var^^}:把var中的所有小寫字母轉換為大寫
如:
aa=abCDEFGABcdEFGABCDefG
echo ${aa^^} 結果為 ABCDEFGABCDEFGABCDEFG
${var,,}:把var中的所有大寫字母轉換為小寫
如:
aa=abCDEFGABcdEFGABCDefG
echo ${aa,,} 結果為 abcdefgabcdefgabcdefg
第三章 高級變量操作
1、高級變量賦值:
${var:-value}
功能:如果var為空或未設置,那么返回value,但是不會把值賦給var;否則,則返回var的值
如:echo ${aa:-abcd} 結果為 abcd 此時 echo $aa 結果是空
aa=1234;echo ${aa:-abcd} 結果為 1234
${var:+value}
功能:如果var不空,則返回value;也不會把值賦給var
如:echo ${aa:+abcd} 結果為空
aa=1234;echo ${aa:+abcd} 結果為 abcd
${var:=value}
功能:如果var為空或未設置,那么返回value,并將value賦值給var;否則,則返回var的值
如:echo ${aa:=abcd} 結果為 abcd 此時 echo $aa 結果為abcd
aa=1234;echo ${aa:=bacd} 結果為 1234 此時 echo $aa 結果為1234
${var:?error_info}
功能:如果var為空或未設置,那么返回error_info;否則,則返回var的值
如: echo ${aa:?"cuo wu"} 結果為 -bash: aa: cuo wu
此時echo $aa 結果為空
aa=1234 ; echo ${aa:?"cuo wu"} 結果為 1234
2、為腳本程序使用配置文件,實現變量賦值
<1>定義文本文件,每行定義“ name=value”
<2> 在腳本中source此文件即可
3、間接變量引用:
如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用
variable1=variable2
variable2=value
variable1的值是variable2,而variable2又是變量名,variable2的值為value,間接變量引用是指通過variable1獲得變量值value的行為
間接變量引用的定義方式:
方式一:eval VAR2=\$$VAR1
方式二:VAR2=${!VAR1}
如:
eval命令:eval命令將會首先掃描命令行進行所有的置換,然后再執行該命令。該命令適用于那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描
4、利用declare命令,定義有型變量:
Shell變量一般是無類型的,但是bash Shell提供了declare和typeset兩個命令用于指定變量的類型,兩個命令是完全等價的
命令語法:declare [選項] 變量名
常用選項:
-r 將變量設置為只讀屬性
-i 將變量定義為整型數
-a 將變量定義為數組
-A 將變量定義為關聯數組,注意關聯數組必須要先定義,后使用
-f 顯示此腳本前定義過的所有函數名及其內容
-F 僅顯示此腳本前定義過的所有函數名
-x 將變量聲明為環境變量
-l 將變量值轉為小寫字母
-u 將變量值轉為大寫字母
5、利用maketemp命令創建臨時文件,可避免腳本中需要創建臨時文件時造成的文件名沖突
語法格式:mktemp [OPTION]… [TEMPLATE]
TEMPLATE: filename.XXX X至少要出現三個
OPTION:
-d: 創建臨時目錄
–tmpdir=/DIR:指明臨時文件所存放的目錄位置,可以在創建的時候直接指定目錄,而不利用–tempdir指定
實例:
mktemp –tmpdir=/testdir test.XXXXXX
mktemp /testdir/file.XXX
6、bash展開命令行的優先級
展開別名
展開大括號種的聲明{}
展開波浪符聲明~
命令替換$() 和 “
再次把命令行分成命令詞
展開文件通配 *、 ?、 [abc]等等
準備I/0重導向<、 >
運行命令
7、防止擴展
反斜線( \)會使隨后的字符按原意解釋
echo Your cost: \$5.00
Your cost: $5.00
加引號來防止擴展
單引號( ’)防止所有擴展
雙引號( ”)也防止所有擴展,但是以下情況例外:
$(美元符號) - 變量擴展
`(反引號) - 命令替換
\(反斜線) - 禁止單個字符擴展
!(嘆號) - 歷史命令替換
第四章 用戶環境配置
1、bash配置文件的分類
按生效范圍劃分,存在兩類:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
個人配置:
~/.bash_profile
~/.bashrc
2、shell登錄的兩種方式和及其分別讀取的配置文件
交互式登錄:
<1>直接通過終端輸入賬號密碼登錄;
<2>使用su – USERNAME 切換的用戶
配置文件執行順序:
/etc/profile –> /etc/profile.d/*.sh –>~/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登錄:
<1>su USERNAME
<2>圖形界面下打開的終端
<3>執行腳本
配置文件執行順序:
~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
3、配置文件的作用
按功能劃分,存在兩類:profiile類和bashrc類
profile類:為交互式登錄的shell提供配置
全局: /etc/profile, /etc/profile.d/*.sh
個人: ~/.bash_profile
功用:
<1> 用于定義環境變量
<2> 運行命令或腳本
bashrc類:為非交互式和交互式登錄的shell提供配置
全局: /etc/bashrc
個人: ~/.bashrc
功用:
<1> 定義命令別名和函數
<2> 定義本地變量
修改profile和bashrc文件后需生效
兩種方法:
<1>重新啟動shell進程
<2> . /PATH/TO/FILENAME 或source /PATH/TO/FILENAME
例:
. ~/.bashrc
4、退出登錄的shell時執行任務的配置文件,保存在~/.bash_logout文件中
用途:
退出時自動創建備份
退出時清除臨時文件
第五章 數組實例演示
1、輸入若干個數值存入數組中,采用冒泡算法進行升序或降序排序
#!/bin/bash # Autor: nwc # Version: 2.0 # CreateTime: 2016-08-23 # Description: read -p "input how much numbers you want to create: " NUM if expr $NUM + 0 &>/dev/null && [ $NUM -ge 1 ] ; then for i in `seq 1 $NUM`;do num[$i]=$RANDOM done else echo "bad input" exit 88 fi echo -e "random numbers is:\n${num[@]}" n=${#num[@]} until [ $n -lt 1 ];do for j in `seq 1 $n`;do [ $j -lt $n ] && k=$[$j+1] || k=$n if [ ${num[$j]} -gt ${num[$k]} ] ; then mid=${num[$k]} num[$k]=${num[$j]} num[$j]=$mid else continue fi done let n-- done #正序從小到大排列 echo "sort from small to large:" for m in `seq 1 ${#num[@]}`;do echo -ne "${num[$m]}\t" done echo #逆序從大到小排列 echo "sort from large to small:" for r in `seq 1 ${#num[@]}|tac`;do echo -ne "${num[$r]}\t" done echo
執行結果為:
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/39400