日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

shell的基础学习

發(fā)布時(shí)間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell的基础学习 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

提示:本人才疏學(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 + $a

2,使用$[? ] 或者 $((? ))

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乘以10

4,使用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是否不等于變量b

4.文件(當(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 "你是管理員~" fi

2.雙分支

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 "你不是管理員~" fi

3.多分支

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 done

while循環(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" esac

echo命令

\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位

x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRST UVWXYZ0123456789 //創(chuàng)建一個(gè)變量x,里面有26個(gè) 小寫(xiě)字母26個(gè)大寫(xiě)字母和10個(gè)數(shù)字 #!/bin/bash x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV WXYZ0123456789 //先定義變量x,里面有62個(gè)字符 for i in {1..8} //循環(huán)8次 do n=$[RANDOM%62] //得到0~61隨機(jī)數(shù) y=${x:n:1} //得到1個(gè)隨機(jī)字符 a=$a$y //不斷往變量a中追加 done echo $a //最后喊出結(jié)果

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è)b

4.定義變量初值(備用值)

${變量名:-初值}

#!/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)有輸入密碼直接回車的話密碼 就是123456

read交互式輸入

-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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。