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