您好,登錄后才能下訂單哦!
1.什么是shell腳本
shell是一個(gè)命令行解釋器,它的作用就是遵循一定的語(yǔ)法將輸入的命令加以解釋并傳給系統(tǒng)。它為用戶提供了一個(gè)向Linux發(fā)送請(qǐng)求以便運(yùn)行程序的接口系統(tǒng)級(jí)程序,shell本身是一個(gè)用C語(yǔ)言編寫的程序,他是用戶使用Linux的橋梁。
簡(jiǎn)單來(lái)說(shuō),shell腳本就是命令的堆積。
2.shell腳本之基本格式
腳本開頭:第一行,頂格寫
#!/bin/bash
注釋信息:shell腳本中會(huì)忽略"#"開頭的行,所以為了方便自己和他人的查看,那么我們一般都會(huì)在腳本中添加注釋信息方便以后觀看。古人云:不添加注釋的腳本都是耍流氓。通常的注釋信息可以這樣寫:
#!/bin/bash # application # versions # date # name # email
3.shell腳本之變量
局部變量:
普通變量,僅在創(chuàng)建它的shell中有效
本地變量:
當(dāng)前shell中的變量,本地變量包含環(huán)境變量,本地變量的非環(huán)境變量不具備繼承性
環(huán)境變量:
對(duì)創(chuàng)建它的shell及其派生出來(lái)的子進(jìn)程都有效
位置參數(shù)變量:
$1,$2,$3...
特殊變量:
$0:腳本文件路徑本身
$#:腳本參數(shù)的個(gè)數(shù)
$*:所有參數(shù)(后面參數(shù)以多個(gè)字符串表示)
$@:所有參數(shù)(后面參數(shù)以一個(gè)字符串表示)
4.shell腳本之基本運(yùn)算
在shell腳本基本的運(yùn)算符號(hào)有:
+ - * / % **
由于shell是弱類型的編程語(yǔ)言,所以我們?cè)谧鏊阈g(shù)運(yùn)算的時(shí)候需要這樣寫:
let VAR=$num1 op $num2 VAR=$[expression] VAR=$((expression)) VAR=$(expr argu1 argu2 argu3)
例:計(jì)算6+8
let VAR=6+8 VAR=$[6+8]
增強(qiáng)型賦值:
變量做某種算術(shù)運(yùn)算后回存至此變量中
例:
自增: let VAR+=1 自減: let VAR-=1 ......
5.shell腳本之條件測(cè)試
通常情況下判斷某需求是否滿足,需要由測(cè)試機(jī)制來(lái)實(shí)現(xiàn)
可以用 "$?" 來(lái)判斷上一條命令正確與否
如何編寫測(cè)試表達(dá)式以實(shí)現(xiàn)所需的測(cè)試:
執(zhí)行命令,并利用命令的狀態(tài)返回值來(lái)判斷:
0:成功
1-255:失敗
測(cè)試表達(dá)式:
test EXPRESSION
[ EXPRESSION ]
` EXPRESSION `
那么bash的測(cè)試類型基本分為三類:
(1)數(shù)值測(cè)試:數(shù)值比較
-eq:是否等于
-ne:是否不等于
-gt:是否大于
-ge:是否大于等于
-lt:是否小于
-le:是否小于等于
例:判斷2是否大于3
(2)字符串測(cè)試:字符比較
==:是否等于
> :是否大于
< :是否小于
!=:是否不等于
=~:左側(cè)字符串是否能被右側(cè)的PATTERN所匹配
例:判斷主機(jī)名為空,或者為localhost.locadomain,或者包含localhost,或者包含linux,則通通將其設(shè)為 www.magedu.com
#!/bin/bash # H=$(hostname) [[ "$H" == " " || "$H" =~ "localhost.locadomain" || "$H" =~ "localhost" || "$H"=~"linux" ]] && hostname www.magedu.com
(3)文件測(cè)試:
存在性測(cè)試:
-a FILE
-e FILE
文件的存在性測(cè)試,存在則為真,否則則為假
存在性及類型測(cè)試:
-b FILE:是否存在為塊設(shè)備文件,是則為真,否則為假
-c FILE:是否存在為字符設(shè)備文件
-d FILE:是否存在為目錄文件
-f FILE:是否存在為普通文件
-h FILE或 -L FILE :是否存在為符號(hào)鏈接文件
-p FILE :是否存在為命令管道文件
-S FILE:是否存在為套接字文件
文件權(quán)限測(cè)試:
-r FILE :是否存在并且對(duì)當(dāng)前用戶可讀
-w FILE :是否存在并且對(duì)當(dāng)前用戶可寫
-x FILE :是否存在并且對(duì)當(dāng)前用戶可執(zhí)行
特殊權(quán)限測(cè)試:
-u FILE :是否存在并且擁有SUID權(quán)限
-g FILE :是否存在并且擁有SGID權(quán)限
-k FILE :是否存在并且擁有sticky權(quán)限
文件是否有內(nèi)容:
-s FILE :文件是否存在并且非空,有則為真,沒(méi)有則為假
時(shí)間戳:
-N FILE:文件自從上一次讀操作后是否被修改過(guò)
從屬關(guān)系測(cè)試:
-O FILE :當(dāng)前用戶是否為文件的屬主
-G FILE :當(dāng)前用戶是否為文件的屬組
雙目測(cè)試:
FILE1 -ef FILE2 :FILE1與FILE2是否指向同一個(gè)文件系統(tǒng)的相同inode的硬鏈接
FILE1 -nt FILE2 :FILE1是否新于FILE2
FILE1 -ot FILE2 :FILE1 是否舊于FILE2
例:通過(guò)命令行參數(shù),給定兩個(gè)文本文件名,如果某文件不存在,則結(jié)束腳本執(zhí)行,若都存在時(shí),返回每個(gè)文件的行數(shù),并echo出其中行數(shù)較多的文件名
#!/bin/bash # [ $# -ne 2 ] && echo "請(qǐng)給定兩個(gè)文本文件名" && exit 2 [ -e "$1" ] && file1=$(cat "$1" | wc -l) || exit 3 [ -e "$2" ] && file2=$(cat "$2" | wc -l) || exit 4 [ "$file1" -gt "$file2" ] && echo "$1的行數(shù)為$file1" || echo "$2的行數(shù)為$file2"
6.shell腳本之選擇執(zhí)行
過(guò)程式編程語(yǔ)言的代碼執(zhí)行順序:
順序執(zhí)行:逐條執(zhí)行
選擇執(zhí)行:
代碼有一個(gè)分子:條件滿足時(shí)才會(huì)執(zhí)行
兩個(gè)或以上的分支:只會(huì)執(zhí)行其中一個(gè)滿足條件的分支
循環(huán)執(zhí)行:
代碼片段(循環(huán)體) 要執(zhí)行0、1或多個(gè)來(lái)回
shell腳本中的選擇執(zhí)行:
單分支的if語(yǔ)句:
if 測(cè)試條件;then
代碼分支
fi
或者:
if 測(cè)試條件
then
代碼分支
fi
雙分支的if語(yǔ)句:
if 測(cè)試條件;then
條件為真時(shí)執(zhí)行的分支
else
條件為假時(shí)執(zhí)行的分支
fi
多分支的if語(yǔ)句:
if 測(cè)試條件;then
條件為真時(shí)執(zhí)行的分支
elif 測(cè)試條件;then
elif 測(cè)試條件;then
elif 測(cè)試條件;then
......
else
條件為假時(shí)執(zhí)行的分支
fi
例:
1.通過(guò)參數(shù)傳遞一個(gè)用戶名給腳本,此用戶名如果不存在的話,則進(jìn)行添加
#!/bin/bash # if [ "$#" -ne 1 ];then echo "請(qǐng)輸入一個(gè)用戶名" exit 2 fi user=$(grep "^$1\>" /etc/passwd) if ! [ -s "$user" ];then useradd "$1" echo "用戶$1已添加" fi
2.通過(guò)命令參數(shù),給定兩個(gè)數(shù)字,輸出其中較大的數(shù)值
#!/bin/bash # if [ "$#" -ne 2 ];then echo "請(qǐng)給定兩個(gè)數(shù)字" exit 2 fi if [ "$1" -gt "$2" ];then echo "$1" elif [ "$1" -eq "$2" ];then echo "$1=$2" else echo "$2" fi
7.shell腳本之命令交互
read [OPTIONS]...
-p'PROMPT'提示符
-t TIMEOUT
例:
1.寫一個(gè)腳本,提示用戶輸入一個(gè)字符串,如果輸入的是quit,則退出,否則,顯示其輸入的字符串腳本內(nèi)容
#!/bin/bash # read -p "請(qǐng)輸入一個(gè)字符串:" A if [ "$A" == quit ];then exit 2 else echo "$A" fi
2.背景:公司來(lái)了個(gè)新員工,需要給新員工開通系統(tǒng)帳號(hào)和統(tǒng)計(jì)出新員工的信息。(通過(guò)交互的方式)
讓用戶指定一個(gè)用戶名和密碼,若用戶名之前存在,先進(jìn)行刪除。之后則為用戶添加系統(tǒng)帳號(hào)。
完成后,需要統(tǒng)計(jì)員工的:手機(jī)號(hào),email,QQ號(hào),年齡信息,收集后存儲(chǔ)到該用戶的家目錄中。
完成以上操作,詢問(wèn)該用戶,是否需要給用戶單獨(dú)建立一個(gè)工作目錄為/data/username,默認(rèn)是需要,如果不需要,則需輸入n或者N
#!/bin/bash # read -p "請(qǐng)輸入用戶名:" user grep "^$user\>" /etc/passwd > /dev/null && userdel -r $user useradd $user read -p "請(qǐng)輸入用戶密碼:" pswd echo $pswd | passwd --stdin $user > /dev/null read -p "請(qǐng)輸入手機(jī)號(hào)碼:" number read -p "請(qǐng)輸入email:" mail read -p "請(qǐng)輸入QQ號(hào)碼:" qq read -p "請(qǐng)輸入年齡信息:" age echo "手機(jī)號(hào)碼:$number,email:$mail,QQ:$qq,年齡:$age" > /home/$user/xinxi.txt read -p "是否需要建立一個(gè)工作目錄[Y/N]" A if [ "$A" == Y ];then mkdir -p /date/$user echo "用戶已創(chuàng)建,工作目錄已創(chuàng)建" else echo $A echo "用戶已創(chuàng)建" fi
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。