shell的基础学习
提示:本人才疏學(xué)淺,此例子僅供參考,如有不對(duì)還請(qǐng)告知
目錄
前言
Shell概述
shell腳本的編寫(xiě)規(guī)范
變量
shell中的運(yùn)算
條件測(cè)試
if分支
for循環(huán)
while循環(huán)
?控制循環(huán)
case分支?
echo命令
?函數(shù)
字符串處理
read交互式輸入
?
前言
現(xiàn)階階段所學(xué),如有錯(cuò)誤還請(qǐng)指正
Shell概述
shell是什么?
????????????????在Linux內(nèi)核與用戶之間的解釋器程序
????????????????通常指 /bin/bash
????????????????負(fù)責(zé)向內(nèi)核翻譯及傳達(dá)用戶/程序指令
????????????????相當(dāng)于操作系統(tǒng)的“外殼”
????????????????bash優(yōu)點(diǎn):tab鍵、歷史命令、快捷鍵、別名、重定向、管道
使用步驟
1.交互式 —— 命令行
????????????????人工干預(yù)、智能化程度高
??????????????? 逐條解釋執(zhí)行、效率低
2.非交互式 —— 腳本
????????????????需要提前設(shè)計(jì)、智能化難度大
????????????????批量執(zhí)行、效率高
????????????????方便在后臺(tái)靜悄悄地運(yùn)行
什么是shell腳本
提前寫(xiě)好可執(zhí)行的語(yǔ)句,能夠完成特定任務(wù)的文件 按順序、批量化處理
shell腳本的編寫(xiě)規(guī)范
1.聲明解釋器 #!/bin/bash
2.編寫(xiě)注釋 #編寫(xiě)腳本功能、作者信息、變量作用等內(nèi)容
3.執(zhí)行指令 ls? cd? pwd .....
????????????????所有需要腳本執(zhí)行的任務(wù)都可以逐行寫(xiě)在這里
腳本的執(zhí)行方式:
1.添加x權(quán)限,使用絕對(duì)或者相對(duì)路徑執(zhí)行
chmod u+x test01.sh /opt/test01.sh用戶(root)---bash---bash--- echo abc
2.使用解釋器執(zhí)行腳本,無(wú)需x權(quán)限,會(huì)開(kāi)啟新bash進(jìn)程(子進(jìn)程)
bash test01.sh用戶(root)---bash---bash--- echo abc
3.使用source命令執(zhí)行腳本,無(wú)需x權(quán)限,不會(huì)開(kāi)啟新bash進(jìn)程
source test01.sh用戶(root)---bash--- echo abc
變量
常量? 固定不變(內(nèi)容)
變量? 使用固定的名稱存放,可能會(huì)發(fā)生變化的內(nèi)容(值),可以提高腳本 的靈活度、提高適應(yīng)力?
變量的種類
自定義變量,名稱可以用數(shù)字、字母、下劃線,不能以數(shù)字開(kāi)頭,不能使用特殊符號(hào)。
變量名稱=變量的值
????????????????a=10?? //創(chuàng)建變量(賦值)
????????????????echo? $a? //調(diào)用變量
????????????????unset? a? //取消變量或者
????????????????a= echo ${a}RMB?? //使用大括號(hào)可以避免混淆
????????????????a=10 然后 a=20 多次賦值之后,僅最后一次生效
env? //可以顯示所有環(huán)境變量
env | grep HOSTNAME?? //可以配合grep搜索
set? //顯示所有變量
abcd=8888
set | grep abcd? //可以配合grep搜索
引號(hào)與反撇號(hào)
" "? 雙引號(hào)?? 界定范圍
' '?? 單引號(hào)?? 界定范圍? 屏蔽特殊符號(hào)功能 ,即便 $ 也視為普通字符
``?? 反撇號(hào)?? 可以獲取命令的執(zhí)行結(jié)果,或者使用$( )可以實(shí)現(xiàn)相同效果
環(huán)境變量,由系統(tǒng)提前定義好,使用時(shí)直接調(diào)用
????????????????USER? 當(dāng)前用戶名?? HOME? 當(dāng)前用戶的家目錄??? UID? 當(dāng)前用戶的id號(hào)
????????????????SHELL? 當(dāng)前用戶的解釋器?? HOSTNAME? 主機(jī)名?? PWD? 當(dāng)前位置
????????????????PATH? 存儲(chǔ)命令路徑?? PS1 一級(jí)提示符 PS2 二級(jí)提示符
比如:你輸入cp filename1 \,回車,此時(shí)就出現(xiàn)第二級(jí)提示符。\是續(xù)行的意思。 ??? 默認(rèn)的第二級(jí)提示符是“>;”?
位置變量與預(yù)定義變量 ??
$1?? 執(zhí)行腳本時(shí)后面跟的第1個(gè)位置參數(shù)? ??? ?
$2?? 執(zhí)行腳本時(shí)后面跟的第2個(gè)位置參數(shù) ?? ?
$3?? 執(zhí)行腳本時(shí)后面跟的第3個(gè)位置參數(shù) ?? ?
$*?? 執(zhí)行腳本時(shí)后面跟的所有位置參數(shù) ?? ?
$#?? 執(zhí)行腳本時(shí)后面跟的所有位置參數(shù)的個(gè)數(shù) ??
$$?? 隨機(jī)的進(jìn)程號(hào) ?? ?
$??? 判斷上一條指令是否成功,0是成功,非0是失敗
export發(fā)布全局變量
局部變量 ,僅當(dāng)前解釋器進(jìn)程中可以使用的變量
全局變量,解釋器進(jìn)程產(chǎn)生的子進(jìn)程也可以使用的變量
a=10 //創(chuàng)建變量,默認(rèn)是局部變量 export a //將已有的局部變量發(fā)布為全局變量 export b=20 //創(chuàng)建全局變量 export -n b //將全局變量恢復(fù)成局部變量注意,測(cè)試時(shí)要在父進(jìn)程創(chuàng)建變量,然后可以執(zhí)行bash進(jìn)入 子進(jìn)程測(cè)試效果,如果要返回父進(jìn)程要執(zhí)行exit指令
shell中的運(yùn)算
1,expr? 可以運(yùn)算并輸出
expr 1 + 1 //加法運(yùn)算,運(yùn)算符號(hào)兩邊要加空格 expr 2 - 1 expr 2 '*' 2 //使用單引號(hào)屏蔽*的特殊功能即可實(shí)現(xiàn)乘法 expr 2 \* 2 //使用轉(zhuǎn)義符號(hào)屏蔽*的特殊功能 expr 4 / 2 expr 10 % 3 a=10 b=20 expr $a + $b 還能進(jìn)行變量的運(yùn)算 expr $a + 100 expr $a + $a2,使用$[? ] 或者 $((? ))
echo $[1+1] echo $[2-1] echo $[2*2] echo $[2/2] echo $[2%2] echo $[a+a]3,使用let命令,不顯示結(jié)果,通常用于變量的創(chuàng)建于自增減
功能一:let a=1+1?? //變量的創(chuàng)建,然后可以用echo $a查結(jié)果
功能二:對(duì)變量進(jìn)行自增減
常規(guī)寫(xiě)法 主流寫(xiě)法 let a=a+1 let a++ 變量的自增減,將變量a的值加1 let a=a-1 let a-- 變量a減1 let a=a+2 let a+=2 變量a加2 let a=a-2 let a-=2 變量a減2 let a=a*10 let a*=10 變量a乘以104,使用bc計(jì)算器,可以進(jìn)行小數(shù)運(yùn)算?
echo "1.1+1" | bc??? //非交互的方式使用bc工具
echo "scale=3;10/3" | bc?? //scale可以定義小數(shù)點(diǎn)后面的長(zhǎng)度
條件測(cè)試
?條件測(cè)試,可以為腳本賦予智能判斷的效果
使用格式:
?1, test? 表達(dá)式??
?2, [ 表達(dá)式 ]
1.對(duì)字符串進(jìn)行測(cè)試
==? 判斷兩邊是否相等?? !=? 判斷兩邊是否不等
test a == a test a == b [ a == a ] //使用常量判斷,再用echo $?測(cè)試結(jié)果 [ a == b ] [ $a == $b ] //使用變量判斷兩個(gè)變量的值是否相等 [ $a != $b ] //使用變量判斷兩個(gè)變量的值是否不相等-z? 判斷變量是否為空??? !? -z? 判斷變量是否非空或-n
a=10 [ -z $a ] //判斷變量a是否為空,如果為空則判斷正確 [ ! -z $a ] //判斷變量a中是否有值,有值則判斷正確2.邏輯符號(hào),可以連接條件測(cè)試或者指令,來(lái)決定之后如何操作
&&? 之前指令執(zhí)行成功才會(huì)執(zhí)行之后指令
||?? 之前指令執(zhí)行失敗才會(huì)執(zhí)行之后指令
3.數(shù)字測(cè)試
-eq 是否相等? -ne 是否不等?? -gt 是否大于
-ge 是否大于等于? -lt? 是否小于? -le? 是否小于等于
[ 1 -eq 1 ] //判斷1是否等于1 [ 3 -ge 5 ] //判斷3是否大于等于5 a=10 b=20 [ $a -ne $b ] //判斷變量a是否不等于變量b4.文件(當(dāng)前用戶的測(cè)試)
-e? 判斷文件是否存在,不關(guān)心類型
-f? 判斷文件是否存在,必須是普通文件
-d? 判斷文件是否存在,必須是目錄
-r? 判斷當(dāng)前用戶對(duì)文件是否有讀權(quán)限,對(duì)root無(wú)效
-w 判斷當(dāng)前用戶對(duì)文件是否有寫(xiě)權(quán)限,對(duì)root無(wú)效
-x? 判斷當(dāng)前用戶對(duì)文件是否有執(zhí)行權(quán)限(目錄是否可以進(jìn)入)
if分支
1.單分支
if 條件測(cè)試;then? //如果條件測(cè)試成功,那就執(zhí)行下面的所有指令(指令可以有很多) ?? ??
?????? 執(zhí)行指令???
fi
#!/bin/bash if [ $USER == root ];thenecho "你是管理員~" fi2.雙分支
stty? -echo? 屏蔽回顯
stty? echo?? 恢復(fù)回顯
reset?? 恢復(fù)回顯
if 條件測(cè)試;then? //如果條件測(cè)試成功,就執(zhí)行下面的所有指令(指令可以有很多) ?? ??
? ????????執(zhí)行指令 ?? ?
else ?? ??
???????? 執(zhí)行指令? //如果上述條件測(cè)試失敗,那就執(zhí)行下面的指令
fi
#!/bin/bash if [ $USER == root ];then echo "你是管理員~" else echo "你不是管理員~" fi3.多分支
if 條件測(cè)試;then? //如果條件測(cè)試成功,就執(zhí)行下面的所有指令(指令可以有很多)
????????執(zhí)行指令
elif 條件測(cè)試;then?? //如果條件測(cè)試成功,就執(zhí)行下面的指令 ?? ?
????????執(zhí)行指令
elif 條件測(cè)試;then? //如果條件測(cè)試成功,就執(zhí)行下面的指令 ?? ?
????????執(zhí)行指令
。。。。
else
????????執(zhí)行指令? //如果上述條件測(cè)試失敗,那就執(zhí)行下面的指令
fi
?
for循環(huán)
有時(shí)我們需要某個(gè)或者某群任務(wù)反復(fù)在服務(wù)器中執(zhí)行很多次,就可以使用循環(huán)命 令寫(xiě)成腳本,而無(wú)需手工一次次執(zhí)行
for循環(huán),有次數(shù)的循環(huán)
for 變量名 in 值1 值2 值3 。。。。?? //此處變量名可以自定義,通常習(xí)慣用i,值的多少?zèng)Q定了下面do與done之間的任務(wù)執(zhí)行多少次,每個(gè)值之間有空格,這里是有3個(gè)值,所以就循環(huán)執(zhí)行指令3次
do
????????循環(huán)任務(wù)
done
#!/bin/bash for i in {1..100} //執(zhí)行100次任務(wù)的簡(jiǎn)略寫(xiě)法,但不支持變量 doecho ${i}abc done #!/bin/bash a=100 for i in $(seq $a) //使用seq支持變量 doecho ${i}abc donewhile循環(huán)
while循環(huán)(while:連用匹配所有,代表死循環(huán))
while 條件測(cè)試? //如果條件測(cè)試成功,就執(zhí)行下面的指令,然后再回 來(lái)繼續(xù)看條件測(cè)試能否成功,如果成功就繼續(xù)執(zhí)行指令,且可以實(shí)現(xiàn)無(wú)限 循環(huán),一旦發(fā)現(xiàn)條件測(cè)試失敗了,就立刻終止循環(huán)
do ?? ?
????????執(zhí)行指令
done
#!/bin/bash while [ 1 -eq 1 ] //故意寫(xiě)一個(gè)永遠(yuǎn)正確的條件測(cè)試可以實(shí)現(xiàn)無(wú)限循環(huán)或?qū)憽?#xff1a;” doecho abcsleep 0.2 //如果系統(tǒng)執(zhí)行任務(wù)消耗cpu比較多,可以每次稍微休息0.2秒 done?控制循環(huán)
通常,在執(zhí)行循環(huán)任務(wù)中途如果想退出可以用exit指令,但該指令不但會(huì)退出循環(huán),連同腳本也會(huì)一并退出,此時(shí)可以使用break與continue指令更精細(xì)的控制循環(huán)。?
exit? 可以終止循環(huán),但同時(shí)也終止腳本
break? 可以終止循環(huán),繼續(xù)執(zhí)行循環(huán)之后的任務(wù)
continue? 終止當(dāng)前循環(huán),繼續(xù)下一次循環(huán)
#!/bin/bash x=0 while : do read -p "請(qǐng)輸入一個(gè)整數(shù)求和(0是結(jié)束并輸出結(jié)果)" n [ -z $n ] && continue [ $n -eq 0 ] && echo "結(jié)果為$x" && exit let x+=n done #!/bin/bash x=0 while : //while循環(huán)后面寫(xiě)冒號(hào)代表永遠(yuǎn)正確可以無(wú)效循環(huán) do read -p "請(qǐng)輸入一個(gè)整數(shù)求和(0是結(jié)束并輸出結(jié)果)" n [ -z $n ] && continue //如果n是空值則重新進(jìn)行循環(huán)任務(wù) [ $n -eq 0 ] && break //如果n是0則退出循環(huán)執(zhí)行循環(huán)后任務(wù) let x+=n //不斷的將n的值保存在x里 done echo "結(jié)果為$x"case分支?
?功能類似if,編寫(xiě)時(shí)語(yǔ)句比if精簡(jiǎn)
?case 調(diào)用變量的名稱 in??? //如果調(diào)用的變量?jī)?nèi)容與下面某個(gè)模式一致,就執(zhí)行模式下面的指令
模式1)???? //模式可以有很多 ?? ?
????????執(zhí)行指令;;?? //指令需要用雙分號(hào)結(jié)尾,如果一個(gè)模式有多個(gè)指令,那只需在該模式的最后一條指令后加雙分號(hào)即可
模式2)???
????????? 執(zhí)行指令;;
.... *) ?? ?
????????執(zhí)行指令
esac?
#!/bin/bash case $1 in T|t) //如果$1是t就執(zhí)行touch任務(wù)(|或者)touch $2;; m) //如果$1是m就執(zhí)行mkdir任務(wù)mkdir $2;; r) //如果$1是r就執(zhí)行rm任務(wù)rm -rf $2;;(最后一條可以不寫(xiě);) *)echo "請(qǐng)輸入t或m或r" esacecho命令
\r?? ?回車符
\t?? ?水平制表符,也就是Tab鍵
stty? -echo? 屏蔽回顯
stty? echo?? 恢復(fù)回顯
reset?? 恢復(fù)回顯
字顏色:30—–37 echo -e "\033[30m 黑色字 \033[0m"echo -e "\033[31m 紅色字 \033[0m"echo -e "\033[32m 綠色字 \033[0m"echo -e "\033[33m 黃色字 \033[0m"echo -e "\033[34m 藍(lán)色字 \033[0m" echo -e "\033[35m 紫色字 \033[0m" echo -e "\033[36m 天藍(lán)字 \033[0m" echo -e "\033[37m 白色字 \033[0m" 字背景顏色范圍:40—–47echo -e "\033[40;37m 黑底白字 \033[0m"echo -e "\033[41;37m 紅底白字 \033[0m" echo -e "\033[42;37m 綠底白字 \033[0m" echo -e "\033[43;37m 黃底白字 \033[0m" echo -e "\033[44;37m 藍(lán)底白字 \033[0m" echo -e "\033[45;37m 紫底白字 \033[0m" echo -e "\033[46;37m 天藍(lán)底白字 \033[0m" echo -e "\033[47;30m 白底黑字 \033[0m" 最后面控制選項(xiàng)說(shuō)明\33[0m 關(guān)閉所有屬性 \33[1m 設(shè)置高亮度 \33[4m 下劃線 \33[5m 閃爍 \33[7m 反顯 \33[8m 消隱 \33[30m — \33[37m 設(shè)置前景色 \33[40m — \33[47m 設(shè)置背景色 \33[nA 光標(biāo)上移n行 \33[nB 光標(biāo)下移n行 \33[nC 光標(biāo)右移n行 \33[nD 光標(biāo)左移n行 \33[y;xH設(shè)置光標(biāo)位置 \33[2J 清屏 \33[K 清除從光標(biāo)到行尾的內(nèi)容 \33[s 保存光標(biāo)位置 \33[u 恢復(fù)光標(biāo)位置 \33[?25l 隱藏光標(biāo) \33[?25h 顯示光標(biāo)?函數(shù)
使用一個(gè)函數(shù)名稱存儲(chǔ)公共的語(yǔ)句塊,實(shí)現(xiàn)精簡(jiǎn)腳本方便 后期調(diào)用的效果?
a(){?? //定義函數(shù),函數(shù)名是a
echo abc???? //大括號(hào)里面是函數(shù)a的所有任務(wù)
echo xyz
}?
a?? //調(diào)用函數(shù)
a??? //可以反復(fù)調(diào)用
字符串處理
linux中很多地方都需要這樣或著那樣的去使用、管理、操作字符,多掌握在linux中字符的控制方法直接決定能否寫(xiě)好腳本與更好的控制linux系統(tǒng)?
1.字符串的截取
${變量名稱:截取位置:截取的長(zhǎng)度}
a=abcdef
echo ${a:0:1}?? //從變量的第1位截取,截取1位
echo ${a:2:2}?? //從變量的第3位截取,截取2位
2.字符替換
${變${變量名/舊/新}量名/舊/新}3,字符串的刪除
${變量名/舊/新} a=123456 echo ${a/3/2} //將3換成2 echo ${a/23/66} //將23換成66 echo ${a/23/6} a=123123 echo ${a/2/6} //默認(rèn)情況下如果存在多個(gè)舊內(nèi)容,只替換1個(gè) echo ${a//2/6} //寫(xiě)2個(gè)斜杠可以替換所有舊內(nèi)容 echo ${a/2/} //還可以替換為空,相當(dāng)于刪除3.字符串的刪除
${變量名稱#被刪除內(nèi)容}?? 從左往右刪除?? 掐頭
a=abcdef echo ${a#abcde} //從左往右刪除到e echo ${a#*e} //效果同上 a=abcabc echo ${a#*b} //從左往右刪除到第1個(gè)b echo ${a##*b} //從左往右刪除到最后1個(gè)b${變量名稱%被刪除內(nèi)容} 從右往左刪除 去尾 a=abcde echo ${a%cde} //從右往左刪除到c echo ${a%bcde} //從右往左刪除到b echo ${a%b*} //效果同上 a=abcabc echo ${a%b*} //從右往左刪除到第1個(gè)b echo ${a%%b*} //從右往左刪除到最后1個(gè)b4.定義變量初值(備用值)
${變量名:-初值}
#!/bin/bash read -p "請(qǐng)輸入要?jiǎng)?chuàng)建的賬戶名:" u useradd $u read -p "請(qǐng)輸入要配置的密碼(默認(rèn)123456):" p echo ${p:-123456} | passwd --stdin $u //如果沒(méi)有輸入密碼直接回車的話密碼 就是123456read交互式輸入
| -p | 后面跟提示信息,即在輸入前打印提示信息 |
| -s | 靜默輸入,在輸入字符時(shí)不再屏幕上顯示,一般都是用于輸入密碼 |
| -n | 后跟一個(gè)數(shù)字,指定輸入的字符長(zhǎng)度最大值 |
| -r | 屏蔽\,如果沒(méi)有該選項(xiàng),則\作為一個(gè)轉(zhuǎn)義字符,有的話 \就是個(gè)正常的字符了 |
| -d | 后面跟一個(gè)標(biāo)志符,其實(shí)只有其后的第一個(gè)字符有用,作為結(jié)束的標(biāo)志 |
| -t | 后面跟秒數(shù),定義輸入字符的等待時(shí)間n秒,超出n秒沒(méi)有輸入則自動(dòng)退出 |
小技巧
read A B 111 222 echo $A echo $Bread A B <<< "111 222" echo $A echo $B總結(jié)
以上是生活随笔為你收集整理的shell的基础学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基本进程与服务管理
- 下一篇: Ansible自动化运维基础------