免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Linux Bash編程超詳細(xì)語法總結(jié)
來自公眾號(hào):馬哥Linux運(yùn)維

在Linux學(xué)習(xí)過程中,我們無可避免的會(huì)碰到一個(gè)既讓人喜歡,又令人頭疼的神奇的東西——bash編程,即shell腳本。那么什么是shell腳本呢?shell是一個(gè)命令語言解釋器,而shell腳本則是Linux命令的集合,按照預(yù)設(shè)的順序依次解釋執(zhí)行,來完成特定的、較復(fù)雜的系統(tǒng)管理任務(wù),類似于Windows中的批處理文件。本文帶來的是bash編程的基礎(chǔ)語法講解。

bash編程之變量

bash變量類別

本地變量:只對(duì)當(dāng)前shell進(jìn)程有效的變量,對(duì)其它shell進(jìn)程無效,包當(dāng)前shell進(jìn)程的子進(jìn)程


VAR_NAME=VALUE

變量賦值:向變量的存儲(chǔ)空間保存數(shù)據(jù)

變量引用:${VAR_NAME} 



'':弱引用,里面的變量會(huì)被替換'':強(qiáng)引用,里面的所有字符都是字面量,直接輸出

環(huán)境變量:對(duì)當(dāng)前shell進(jìn)程及其子shell有效,對(duì)其它的shell進(jìn)程無效         





定義:export VAR_NAME=VALUE導(dǎo)出:export VAR_NAME撤消變量:unset VAR_NAME只讀變量:readonly VAR_NAME

局部變量: 對(duì)shell腳本中某代碼片斷有效,通常用于函數(shù)本地


local VAR_NAME=VALUE

位置變量:用來接受變量指定位置的參數(shù)


$1,$2...,${10}

特殊變量:shell對(duì)一些參數(shù)做特殊處理,這些參數(shù)只能被引用而不能被賦值








$#  傳遞到腳本的參數(shù)個(gè)數(shù)$*  顯示所有向腳本傳遞的參數(shù)                  #與位置變量不同,此選項(xiàng)參數(shù)可超過9個(gè)$$  獲取當(dāng)前shell的進(jìn)程號(hào)$!  執(zhí)行上一個(gè)指令的進(jìn)程號(hào)$?  獲取執(zhí)行的上一個(gè)指令的返回值              #0為執(zhí)行成功,非零為執(zhí)行失敗$-  顯示shell使用的當(dāng)前選項(xiàng),與set命令功能相同$@  與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)

查看變量:



set:查看當(dāng)前shell進(jìn)程中的所有變量export, printenv, env:查看當(dāng)前shell進(jìn)程中的所有環(huán)境變量

變量命名:

  • 1、不能使用程序中的關(guān)鍵字(保留字)

  • 2、只能使用數(shù)字、字母和下劃線,且不能以數(shù)字開頭

  • 3、要見名知義

變量類型:




數(shù)值型:精確數(shù)值(整數(shù)),近似數(shù)值(浮點(diǎn)型)字符型:char,string布爾型:true, false

類型轉(zhuǎn)換:



顯式轉(zhuǎn)換隱式轉(zhuǎn)換

bash的配置文件:

功能:設(shè)定本地變量,定義命令別名

  • profile類:為交互式登錄的用戶提供配置



全局:/etc/profile、/etc/profile.d/*.sh用戶:~/.bash_profile
  • bashrc類:為非交互式的用戶提供配置



全局:/etc/bashrc用戶:~/.bashrc

bash編程之編寫格式及執(zhí)行方式

  • 編寫格式:shell腳本第一行必須頂格寫,用shebang定義指定的解釋器來解釋該腳本。



#!/bin/bash       #!即為shebang# 其它的以#開頭的行均為注釋,會(huì)被解釋器忽略,可用來注釋腳本用途及版本,方便使用管理。
  • 執(zhí)行方式:bash編程屬于面向過程編程,執(zhí)行方式如下:




順序執(zhí)行:按命令先后順尋依次執(zhí)行選擇執(zhí)行:測(cè)試條件,可能會(huì)多個(gè)測(cè)試條件,某條件滿足時(shí),則執(zhí)行對(duì)應(yīng)的分支循環(huán)執(zhí)行:將同一段代碼反復(fù)執(zhí)行多次,因此,循環(huán)必須有退出條件;否則,則陷入死循環(huán)
  • bash執(zhí)行選項(xiàng):



bash -n SHELLNAME  #語法測(cè)試,測(cè)試是否存在語法錯(cuò)誤bash -x SHELLNAME  #模擬單步執(zhí)行,顯示每一步執(zhí)行過程

bash之算數(shù)運(yùn)算與邏輯運(yùn)算

  • 算數(shù)運(yùn)算

定義整型變量:



let VAR_NAME=INTEGER_VALUE #例如:let a=3declare -i VAR_NAME=INTEGER_VALUE #declare -i a=3

實(shí)現(xiàn)算術(shù)運(yùn)算的方式:





let VAR_NAME=ARITHMATIC_EXPRESSIONVAR_NAME=$[ARITHMATIC_EXRESSION]VAR_NAME=$((EXPRESSION))VAR_NAME=$(expr $num1 + $num2)

算術(shù)運(yùn)算符:







+:加法-:減法*:乘法/:整除%:取余數(shù)**:乘冪
注意:即使沒有定義為整型變量,字符型的數(shù)字依然可以參與算術(shù)運(yùn)算,bash會(huì)執(zhí)行變量類型的隱式類型轉(zhuǎn)換。
  • 邏輯運(yùn)算












布爾運(yùn)算:真,假與運(yùn)算:真 && 真 = 真        真 && 假 = 假        假 && 真 = 假        假 && 假 = 假或運(yùn)算:真 || 真 = 真  真 || 假 = 真  假 || 真 = 真  假 || 假 = 假非運(yùn)算:!真=假        !假=真

bash編程之條件測(cè)試語句

bash條件測(cè)試

整型測(cè)試:整數(shù)比較









例如 [ $num1 -gt $num2 ]
-gt: 大于則為真-lt: 小于則為真-ge: 大于等于則為真-le: 小于等于則為真-eq: 等于則為真-ne: 不等于則為真

字符測(cè)試:字符串比較
















































雙目:例如[[ '$str1' > '$str2' ]]
>: 大于則為真<: 小于則為真>=:大于等于則為真<=:小于等于則為真==:等于則為真!=:不等于則為真

單目:-n String: 是否不空,不空則為真,空則為假-z String: 是否為空,空則為真,不空則假
文件測(cè)試:判斷文件的存在性及屬性等
-a FILE:存在則為真;否則則為假;-e FILE: 存在則為真;否則則為假;-f FILE: 存在并且為普通文件,則為真;否則為假;-d FILE: 存在并且為目錄文件,則為真;否則為假;-L/-h FILE: 存在并且為符號(hào)鏈接文件,則為真;否則為假;-b: 存在并且為塊設(shè)備,則為真;否則為假;-c: 存在并且為字符設(shè)備,則為真;否則為假-S: 存在并且為套接字文件,則為真;否則為假-p: 存在并且為命名管道,則為真;否則為假-s FILE: 存在并且為非空文件則為值,否則為假;-r FILE:文件可讀為真,否則為假-w FILE:文件可寫為真,否則為假-x FILE:文件可執(zhí)行為真,否則為假file1 -nt file2: file1的mtime新于file2則為真,否則為假;file1 -ot file2:file1的mtime舊于file2則為真,否則為假;
組合條件測(cè)試:在多個(gè)條件間實(shí)現(xiàn)邏輯運(yùn)算
與:[ condition1 -a condition2 ] condition1 && condition2或:[ condition1 -o condition2 ] condition1 || condition2非:[ -not condition ] ! condition與:COMMAND1 && COMMAND2COMMAND1如果為假,則COMMAND2不執(zhí)行或:COMMAND1 || COMMAND2COMMAND1如果為真,則COMMAND2不執(zhí)行非:! COMMAND

條件測(cè)試之if語句

































































1、if語句之單分支語句結(jié)構(gòu):if 測(cè)試條件;then 選擇分支fi表示條件測(cè)試狀態(tài)返回值為值,則執(zhí)行選擇分支例:寫一個(gè)腳本,接受一個(gè)參數(shù),這個(gè)參數(shù)是用戶名;如果此用戶不存在,則創(chuàng)建該用戶;
#!/bin/bashif ! id $1 &> /dev/null;then useradd $1fi
2、if語句之雙分支語句結(jié)構(gòu):if 測(cè)試條件;then 選擇分支1else 選擇分支2fi
兩個(gè)分支僅執(zhí)行其中之一例:通過命令行給定一個(gè)文件路徑,而后判斷:如果此文件中存在空白行,則顯示其空白行的總數(shù);否則,則顯示無空白行;#!/bin/bashif grep '^[[:space]]*$' $1 &> /dev/null; then echo '$1 has $(grep '^[[:space]]*$' $1 | wc -l) blank lines.'else echo 'No blank lines'fi
注意:如果把命令執(zhí)行成功與否當(dāng)作條件,則if語句后必須只跟命令本身,而不能引用。
3、if語句之多分支語句結(jié)構(gòu):if 條件1;then 分支1elif 條件2;then 分支2elif 條件3;then 分支3 ...else 分支nfi
例:傳遞一個(gè)用戶名給腳本:如果此用戶的id號(hào)為0,則顯示說這是管理員;如果此用戶的id號(hào)大于等于500,則顯示說這是普通用戶;否則,則說這是系統(tǒng)用戶。#!/bin/bashif [ $# -lt 1 ]; then echo 'Usage: `basename $0` username' exit 1fiif ! id -u $1 &> /dev/null; then echo 'Usage: `basename $0` username' echo 'No this user $1.' exit 2fi
if [ $(id -u $1) -eq 0 ]; then echo 'Admin'elif [ $(id -u $1) -ge 500 ]; then echo 'Common user.'else echo 'System user.'fi

bash交互式編程














read [option] “prompt”-p:直接指定一個(gè)變量接受參數(shù)-t timaout:指定等待接受參數(shù)的時(shí)間-n:表示不換行
例:輸入用戶名,可返回其shell
#!/bin/bashread -p 'Plz input a username: ' userNameif id $userName &> /dev/null; then echo 'The shell of $userName is `grep '^$userName\>' /etc/passwd | cut -d: -f7`.'else    echo 'No such user. stupid.'fi    

條件測(cè)試之case語句
















case語句:有多個(gè)測(cè)試條件時(shí),case語句會(huì)使得語法結(jié)構(gòu)更明晰語句結(jié)構(gòu):
case 變量引用 inPATTERN1) 分支1;;PATTERN2) 分支2;;...*) 分支n;;esac

PATTERN:類同于文件名通配機(jī)制,但支持使用|表示或者


























































 a|b:  a或者b*:匹配任意長度的任意字符?: 匹配任意單個(gè)字符[]: 指定范圍內(nèi)的任意單個(gè)字符
例:寫一個(gè)腳本,完成如下任務(wù),其使用形式如下所示:script.sh {start|stop|restart|status}
其中:如果參數(shù)為空,則顯示幫助信息,并退出腳本;如果參數(shù)為start,則創(chuàng)建空文件/var/lock/subsys/script,并顯示“starting script successfully.”如果參數(shù)為stop,則刪除文件/var/lock/subsys/script,并顯示“Stop script successfully.”如果參數(shù)為restart,則刪除文件/var/locksubsys/script并重新創(chuàng)建,而后顯示“Restarting script successfully.”如果參數(shù)為status,那么:如果文件/var/lock/subsys/script存在,則顯示“Script is running…”,否則,則顯示“Script is stopped.”
#!/bin/bashfile='/var/lock/subsys/script'case $1 instart) if [ -f $file ];then echo 'Script is running...' exit 3 else touch $file [ $? -eq 0 ] && echo 'Starting script successfully.' fi ;;stop) if [ -f $file ];then rm -rf $file [ $? -eq 0 ] && echo 'Stop script successfully.' else echo 'Script is stopped...' exit 4 fi ;;restart) if [ -f $file ];then rm -rf $file [ $? -eq 0 ] && echo 'Stop script successfully' else echo 'Script is stopped...' exit 5 fi touch $file [ $? -eq 0 ] && echo 'Starting script successfully' ;;status) if [ -f $file ];then echo 'Script is running...' else echo 'Script is stopped.' fi ;;*) echo '`basename $0` {start|stop|restart|status}' exit 2 ;; esac

bash編程之循環(huán)語句

循環(huán)之for循環(huán)
































1、for語句格式一語句結(jié)構(gòu):for 變量名 in 列表; do 循環(huán)體done列表:可包含一個(gè)或多個(gè)元素循環(huán)體:依賴于調(diào)用變量來實(shí)現(xiàn)其變化循環(huán)可嵌套退出條件:遍歷元素列表結(jié)束例:求100以內(nèi)所有正整數(shù)之和
#!/bin/bashdeclare -i sum=0for i in {1..100}; do let sum+=$idoneecho $sum
2、for語句格式二for ((初始條件;測(cè)試條件;修改表達(dá)式)); do 循環(huán)體done先用初始條件和測(cè)試條件做判斷,如果符合測(cè)試條件則執(zhí)行循環(huán)體,再修改表達(dá)式,否則直接跳出循環(huán)。
例:求100以內(nèi)所有正整數(shù)之和(for二實(shí)現(xiàn))#!/bin/bashdeclare -i sum=0for ((counter=1;$counter <= 100; counter++)); do let sum+=$counterdoneecho $sum

循環(huán)之while語句

while適用于循環(huán)次數(shù)未知,或不便用for直接生成較大的列表時(shí)













































語句結(jié)構(gòu):while 測(cè)試條件; do  循環(huán)體done測(cè)試條件為真,進(jìn)入循環(huán);測(cè)試條件為假,退出循環(huán)例1:求100以內(nèi)所有偶數(shù)之和,要求使用取模方法#!/bin/bashdeclare -i counter=1declare -i sum=0while [ $counter -le 100 ]; do  if [ $[$counter%2] -eq 0 ]; then     let sum+=$counter  fi  let counter++ doneecho $sum
例2:提示用戶輸入一個(gè)用戶名,如果用戶存在,就顯示用戶的ID號(hào)和shell;否則顯示用戶不存在;顯示完成之后不退出,再次重復(fù)前面的操作,直到用戶輸入q或quit為止#!/bin/bashread -p 'Plz enter a username: ' userNamewhile [ '$userName' != 'q' -a '$userName' != 'quit' ]; do if id $userName &> /dev/null; then grep '^$userName\>' /etc/passwd | cut -d: -f3,7 else echo 'No such user.' firead -p 'Plz enter a username again: ' userNamedone
while特殊用法:遍歷文本文件語句結(jié)構(gòu):while read 變量名; do 循環(huán)體done < /path/to/somefile變量名,每循環(huán)一次,記憶了文件中一行文本
例:顯示ID號(hào)為偶數(shù),且ID號(hào)同GID的用戶的用戶名、ID和SHELLwhile read line; do userID=`echo $line | cut -d: -f3` groupID=`echo $line | cut -d: -f4` if [ $[$userID%2] -eq 0 -a $userID -eq $groupID ]; then echo $line | cut -d: -f1,3,7 fidone < /etc/passwd

循環(huán)之until語句
































語句結(jié)構(gòu):until 測(cè)試條件; do 循環(huán)體done測(cè)試條件為假,進(jìn)入循環(huán);測(cè)試條件為真,退出循環(huán)
例:求100以內(nèi)所有偶數(shù)之和,要求使用取模方法(until實(shí)現(xiàn))
#!/bin/bashdeclare -i counter=1declare -i sum=0until [ $counter -gt 100 ]; do if [ $[$counter%2] -eq 0 ]; then let sum+=$counter fi let counter++doneecho $sum例:提示用戶輸入一個(gè)用戶名,如果用戶存在,就顯示用戶的ID號(hào)和shell;否則顯示用戶不存在;顯示完成之后不退出,再次重復(fù)前面的操作,直到用戶輸入q或quit為止(until實(shí)現(xiàn))

#!/bin/bashread -p 'Plz enter a username: ' userNameuntil [ '$userName' = 'q' -a '$userName' = 'quit' ]; do if id $userName &> /dev/null; then grep '^$userName\>' /etc/passwd | cut -d: -f3,7elseecho 'No such user.'firead -p 'Plz enter a username again: ' userNamedone

循環(huán)之循環(huán)控制和shift






循環(huán)控制命令:break:提前退出循環(huán)break [N]: 退出N層循環(huán);N省略時(shí)表示退出break語句所在的循環(huán)continue: 提前結(jié)束本輪循環(huán),而直接進(jìn)入下輪循環(huán)continue [N]:提前第N層的循環(huán)的本輪循環(huán),而直接進(jìn)入下輪循環(huán)

死循環(huán):





















#while體while true; do 循環(huán)體done#until體until false; do 循環(huán)體done
例1:寫一個(gè)腳本,判斷給定的用戶是否登錄了當(dāng)前系統(tǒng)(1) 如果登錄了,則腳本終止;(2) 每5秒種,查看一次用戶是否登錄;#!/bin/bashwhile true; do who | grep 'gentoo' &> /dev/null if [ $? -eq 0 ];thenbreak fi sleep 5doneecho 'gentoo is logged.'

shift:





























































如果沒有數(shù)字,只有shift 就是跳過一個(gè)參數(shù)獲取下一個(gè)參數(shù),如果加上數(shù)字,比如shift 2 ,跳過兩個(gè)參數(shù)獲取下一個(gè)參數(shù)。例:寫一個(gè)腳本,使用形式如下所示    showifinfo.sh [-i INTERFACE|-a] [-v]要求:1、-i或-a不可同時(shí)使用,-i用于指定特定網(wǎng)卡接口,-a用于指定所有接口;顯示接口的ip地址2、使用-v,則表示顯示詳細(xì)信息,顯示接口的ip地址、子網(wǎng)掩碼、廣播地址;3、默認(rèn)表示僅使用-a選項(xiàng);
#!/bin/bashallinterface=0ifflag=0verbose=0interface=0if [ $# -eq 0 ];then ifconfig | grep 'inet addr:' | awk '{print $2}'fiwhile [ $# -ge 1 ];do case $1 in -a) allinterface=1 shift 1  ;;-i) ifflag=1 interface=$2 shift 2 ;;-v) verbose=1 shift 1 ;; *)echo 'error option'exit 2 ;; esacdoneif [ $allinterface -eq 1 ];then if [ $ifflag -eq 1 ];then  echo 'command not found' exit 5 fi if [ $verbose -eq 1 ];then ifconfig | grep 'inet addr:' else ifconfig | grep 'inet addr:' | awk '{print $2}' fifiif [ $ifflag -eq 1 ];then if [ $allinterface -eq 1 ];then echo 'command not found' exit 5 fi if [ $verbose -eq 1 ];then ifconfig $interface | grep 'inet addr:' else ifconfig $interface | grep 'inet addr:' | awk '{print $2}' fifi

bash編程之函數(shù)

語法結(jié)構(gòu):








function F_NAME { 函數(shù)體 }
F_NAME() { 函數(shù)體 }

可調(diào)用:使用函數(shù)名,函數(shù)名出現(xiàn)的地方,會(huì)被自動(dòng)替換為函數(shù)

函數(shù)的返回值:

函數(shù)的執(zhí)行結(jié)果返回值:代碼的輸出

函數(shù)中使用打印語句:echo, printf

函數(shù)中調(diào)用的系統(tǒng)命令執(zhí)行后返回的結(jié)果

執(zhí)行狀態(tài)返回值:

默認(rèn)取決于函數(shù)體執(zhí)行的最后一個(gè)命令狀態(tài)結(jié)果

自定義退出狀態(tài)碼:return [0-255]

注意:函數(shù)體運(yùn)行時(shí),一旦遇到return語句,函數(shù)即返回;

函數(shù)可以接受參數(shù):

在函數(shù)體中調(diào)用函數(shù)參數(shù)的方式同腳本中調(diào)用腳本參數(shù)的方式:




位置參數(shù)$1, $2, …$#, $*, $@

例:寫一個(gè)腳本,完成如下功能(使用函數(shù)):

1、提示用戶輸入一個(gè)可執(zhí)行命令;

2、獲取這個(gè)命令所依賴的所有庫文件(使用ldd命令);

3、復(fù)制命令至/mnt/sysroot/對(duì)應(yīng)的目錄中

解釋:假設(shè),如果復(fù)制的是cat命令,其可執(zhí)行程序的路徑是/bin/cat,那么就要將/bin/cat復(fù)到/mnt/sysroot/bin/目錄中,如果復(fù)制的是useradd命令,而useradd的可執(zhí)行文件路徑為/usr/sbin/useradd,那么就要將其復(fù)制到/mnt/sysroot/usr/sbin/目錄中;

4、復(fù)制各庫文件至/mnt/sysroot/對(duì)應(yīng)的目錄中;






































#!/bin/bashtarget=/mnt/sysroot/[ -d $target ] || mkdir $targetpreCommand() { if which $1 &> /dev/null; then commandPath=`which --skip-alias $1` return 0 else echo 'No such command.' return 1 fi}
commandCopy() { commandDir=`dirname $1` [ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir} [ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}}
libCopy() { for lib in `ldd $1 | egrep -o '/[^[:space:]]+'`; dolibDir=`dirname $lib`[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}[ -f ${target}${lib} ] || cp $lib ${target}${libDir} done} read -p 'Plz enter a command: ' command
until [ '$command' == 'quit' ]; do
if preCommand $command &> /dev/null; then commandCopy $commandPath libCopy $commandPath fi
read -p 'Plz enter a command: ' commanddone

bash編程之信號(hào)捕捉

trap命令用于在shell程序中捕捉到信號(hào),之后可以有三種反應(yīng)方式:

  • (1)執(zhí)行一段程序來處理這一信號(hào)

  • (2)接受信號(hào)的默認(rèn)操作

  • (3)忽視這一信號(hào)

trap對(duì)上面三種方式提供了三種基本形式:

第一種形式的trap命令在shell接收到signal list清單中數(shù)值相同的信號(hào)時(shí),將執(zhí)行雙引號(hào)中的命令串。



trap 'commands' signal-listtrap 'commands' signal-list

第二種形式的trap命令恢復(fù)信號(hào)的默認(rèn)操作:


trap signal-list

第三種形式的trap命令允許忽視信號(hào):



trap ' ' signal-listtrap 'COMMAND' SIGINT(表示關(guān)閉進(jìn)程)

例:寫一個(gè)腳本,能夠ping探測(cè)指定網(wǎng)絡(luò)內(nèi)的所有主機(jī)是否在線,當(dāng)沒有執(zhí)行完時(shí)可接收ctrl+c命令退出。








































#!/bin/bashquitScript() { echo 'Quit...'} trap 'quitScript; exit 5' SIGINT
cnetPing() { for i in {1..254}; do if ping -c 1 -W 1 $1.$i &> /dev/null; then echo '$1.$i is up.' else echo '$1.$i is down.' fi done}
bnetPing() { for j in {0..255}; do cnetPing $1.$j done}anetPing() {for m in {0..255}; dobnetPing $1.$mdone}
netType=`echo $1 | cut -d'.' -f1`
if [ $netType -ge 1 -a $netType -le 126 ]; thenanetPing $netTypeelif [ $netType -ge 128 -a $netType -le 191 ]; thenbnetPing $(echo $1 | cut -d'.' -f1,2)elif [ $netType -ge 192 -a $netType -le 223 ]; thencnetPing $(echo $1 | cut -d'.' -f1-3)elseecho 'Wrong'exit 2fi

bash編程之?dāng)?shù)組

數(shù)組:連續(xù)的多個(gè)獨(dú)立內(nèi)存空間,每個(gè)內(nèi)存空間相當(dāng)于一個(gè)變量

數(shù)組元素:數(shù)組名+索引(從0開始編號(hào))

索引的表示方式:a[0], a[1]

聲明數(shù)組


declare -a ARRAR_NAME

關(guān)聯(lián)數(shù)組


declare -A ARRAY_NAME

支持稀疏格式:僅一維數(shù)組  

數(shù)組元素的賦值:

(1) 一次只賦值一個(gè)元素


a[0]=$RANDOM

(2) 一次賦值全部元素


a=(red blue yellow green)

(3) 指定索引進(jìn)行賦值


a=([0]=green [3]=red [2]=blue [6]=yellow)

(4) 用戶輸入


read -a ARRAY

數(shù)組的訪問:

用索引訪問:


ARRAY[index]

數(shù)組的長度:



${#ARRAY[*]}${#ARRAY[@]}

例:寫一個(gè)腳本,生成10個(gè)隨機(jī)數(shù),保存至數(shù)組中;而后顯示數(shù)組下標(biāo)為偶數(shù)的元素






#!/bin/bashfor i in {0..9}; do    rand[$i]=$RANDOM    [ $[$i%2] -eq 0 ] && echo '$i:${rand[$i]}'done

從數(shù)組中挑選某元素:


${ARRAY[@]:offset:number}

切片:





offset: 偏移的元素個(gè)數(shù)number: 取出的元素的個(gè)數(shù)${ARRAY[@]:offset}:取出偏移量后的所有元素${ARRAY[@]}: 取出所有元素

數(shù)組復(fù)制:要使用${ARRAY[@]}



$@: 每個(gè)參數(shù)是一個(gè)獨(dú)立的串$*: 所有參數(shù)是一個(gè)串

向數(shù)組中追加元素:非稀疏格式



week, week[${#week[@]}]

從數(shù)組中刪除元素:


unset ARRAY[index]

例:復(fù)制一個(gè)數(shù)組中下標(biāo)為偶數(shù)的元素至一個(gè)新數(shù)組中












#!/bin/bashdeclare -a mylogslogs=(/var/log/*.log)echo ${logs[@]}for i in `seq 0 ${#logs[@]}`; do  if [ $[$i%2] -eq 0 ];then    index=${#mylogs[@]}     mylogs[$index]=${logs[$i]}  fidoneecho ${mylogs[@]}

例2:生成10個(gè)隨機(jī)數(shù),升序排序



















#!/bin/bashfor((i=0;i<10;i++))do rnd[$i]=$RANDOMdoneecho -e 'total=${#rnd[@]}\n${rnd[@]}\nBegin to sort'for((i=9;i>=1;i--))do for((j=0;j<i;j++)) do if [ ${rnd[$j]} -gt ${rnd[$[$j+1]]} ] ;then swapValue=${rnd[$j]} rnd[$j]=${rnd[$[$j+1]]} rnd[$[$j+1]]=$swapValue fi donedoneecho ${rnd[@]}

例3:打印九九乘法表












#!/bin/bashfor((i=1;i<=9;i++))do strLine=''  for((j=1;i<=9;j++))  do    strLine=$strLine'$i*$j='$[$i*$j]'\t'    [ $i -eq $j ] && echo -e $strLine && break  donedone

bash編程之字符串操作

字符串切片:











${string:offset:length}[root@scholar scripts]# string='hello word'[root@scholar scripts]# echo ${string:2:4}llo
取尾部的指定個(gè)數(shù)的字符:${string: -length}[root@scholar scripts]# echo ${string: -2}rd

取子串:基于模式

  • ${variable#*word}:在variable中存儲(chǔ)字串上,自左而右,查找第一次出現(xiàn)word,刪除字符開始至此word處的所有內(nèi)容;

  • ${variable##*word}:在variable中存儲(chǔ)字串上,自左而右,查找最后一次出現(xiàn)word,刪除字符開始至此word處的所有內(nèi)容;




file='/var/log/messages'${file#*/}: 返回的結(jié)果是var/log/messages${file##*/}: 返回messages
  • ${variable%word*}: 在variable中存儲(chǔ)字串上,自右而左,查找第一次出現(xiàn)word,刪除此word處至字串尾部的所有內(nèi)容;

  • ${variable%%world*}:在variable中存儲(chǔ)字串上,自右而左,查找最后一次出現(xiàn)word,刪除此word處至字串尾部的所有內(nèi)容;








file='/var/log/messages'${file%*/}: 返回的結(jié)果是/var/log${file%%*/}: 返回結(jié)果為空
例:url='http://www.redhat.com:80'取端口:${url##*:}取協(xié)議:${url%%:*}

查找替換:

${variable/pattern/substi}: 替換第一次出現(xiàn)






#userinfo=`tail -1 /etc/passwd#echo $userinfoscholar:x:500:500:scholar:/home/scholar:/bin/bash#echo ${userinfo/scholar/redhat}redhat:x:500:500:scholar:/home/scholar:/bin/bash

${variable//pattern/substi}:替換所有的出現(xiàn)



#echo ${userinfo//scholar/redhat}redhat:x:500:500:redhat:/home/redhat:/bin/bash

${variable/#pattern/substi}:替換行首被pattern匹配到的內(nèi)容



#echo ${userinfo/#scholar/redhat}redhat:x:500:500:scholar:/home/scholar:/bin/bash

${variable/%pattern/substi}:替換行尾被pattern匹配到的內(nèi)容



#echo ${userinfo/%bash/redhat}scholar:x:500:500:scholar:/home/scholar:/bin/redhat

pattern可以使用globbing中的元字符:* ?

查找刪除:

${variable/pattern}:刪除第一次出現(xiàn)



#echo ${userinfo/scholar}:x:500:500:scholar:/home/scholar:/bin/bash

${variable//pattern}:刪除所有的出現(xiàn)



#echo ${userinfo//scholar}:x:500:500::/home/:/bin/bash

${variable/#pattern}:刪除行首被pattern匹配到的內(nèi)容



#echo ${userinfo/#scholar}:x:500:500:scholar:/home/scholar:/bin/bash

${variable/%pattern}:刪除行尾被pattern匹配到的內(nèi)容





#echo ${userinfo/%bash}scholar:x:500:500:scholar:/home/scholar:/bin/

大小寫轉(zhuǎn)換:

小–>大:${variable^^}



#echo ${userinfo^^}SCHOLAR:X:500:500:SCHOLAR:/HOME/SCHOLAR:/BIN/BASH

大–>?。?{variable,,}




#name='SCHOLAR'#echo ${name,,}scholar

變量賦值操作:

${variable:-string}:variable為空或未設(shè)定,那么返回string,否則,返回variable變量的值;

${variable:=string}:variable為空或未設(shè)定,則返回string,且將string賦值給變量variable,否則,返回variable的值;

為腳本使用配置文件,并確保某變量有可用值的方式

variable=${variable:-default vaule}

寫個(gè)腳本,配置etc目錄;

(1) 在配置文件中定義變量;

(2) 在腳本中source配置文件;






#!/bin/bash[ -f /etc/sysconfig/network ] && source /etc/network/network[-z '$HOSTAME' -o '$HOSTNAME' = '(none)' ] || HOSTNAME ='localhost'/bin/hostname $HOSTNAME/bin/hostname

mktemp命令:

mktemp [OPTIONS] filename.XXX







-d: 創(chuàng)建臨時(shí)目錄--tmpdir=/path/to/somewhere :指定臨時(shí)文件所在的目錄
mktemp /tmp/tmp.XXX #XXX生成相同數(shù)量隨機(jī)字符mktemp --tmpdir=/var/tmp tmp.XXX #指定目錄創(chuàng)建臨時(shí)文件mktemp --tmpdir=/var/tmp -d tmp.XXX #指定目錄創(chuàng)建臨時(shí)目錄

install命令:

install [OPTIONS] SOURCE DEST

install [OPTIONS] SOURCE… DIR

install [OPTIONS] -d DIR …












增強(qiáng)型的復(fù)制命令:-o OWNER-g GROUP-m MODE-d : 創(chuàng)建目錄
install /etc/fstab /tmp #復(fù)制文件到指定目錄install --mode=644 /etc/fstab /tmp/ #復(fù)制時(shí)指定權(quán)限install --owner=scholar /etc/fstab /tmp #復(fù)制時(shí)指定屬主install --group=scholar /etc/fstab /tmp #復(fù)制時(shí)指定屬組install -d /tmp/install #創(chuàng)建目錄

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
bash 進(jìn)階之變量替換與字符串操作
Linux Shell Bash 陷阱 - Powered by PHPWind.net
shell淺談之一變量和引用
Unix下Shell的變量替換命令
Loops in Bash
Shell 腳本面試問題大全
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服