我的自學(xué)shell過(guò)程,中間參考過(guò)鳥(niǎo)哥,馬哥,老男孩等各方的學(xué)習(xí)方法和過(guò)程! shell shell編程之變量 語(yǔ)言轉(zhuǎn)換的設(shè)備或軟件:編譯器,解釋器 編程語(yǔ)言:機(jī)器語(yǔ)言、匯編語(yǔ)言、高級(jí)語(yǔ)言 高級(jí)語(yǔ)言: 靜態(tài)語(yǔ)言:編譯型語(yǔ)言 有開(kāi)發(fā)環(huán)境,不需要借助額外的二進(jìn)制程序,寫(xiě)完代碼后,通過(guò)編譯器直接轉(zhuǎn)換成二進(jìn)制后再獨(dú)立執(zhí)行 特征:強(qiáng)類(lèi)型(變量) 事先轉(zhuǎn)換成可執(zhí)行格式 語(yǔ)言類(lèi)型:C、C++、JAVA、C# 動(dòng)態(tài)語(yǔ)言:解釋型語(yǔ)言 特征:弱類(lèi)型 邊解釋邊執(zhí)行 語(yǔ)言類(lèi)型:PHP、SHELL、Python、perl 編程模型 面向過(guò)程:SEHLL,C 編程重點(diǎn)在問(wèn)題解決過(guò)程本身 適合開(kāi)發(fā)小型 面向?qū)ο螅篔AVA,Python 把要實(shí)現(xiàn)的項(xiàng)目抽象成一個(gè)個(gè)對(duì)象,定義對(duì)象之間的動(dòng)作 適合開(kāi)發(fā)大型應(yīng)用程序 變量:內(nèi)存空間,命名的內(nèi)存空間 內(nèi)存:編址的存儲(chǔ)單元 變量類(lèi)型(定義存儲(chǔ)數(shù)據(jù)的格式和長(zhǎng)度): 字符 數(shù)值 整型 浮點(diǎn)型 時(shí)間 布爾型(邏輯型、真假型) 邏輯運(yùn)算:與,或,非,異或 與 運(yùn)算:兩者為真才為真,只要有一個(gè)假就是假 或 運(yùn)算:只要有一個(gè)為真,結(jié)果即為真 非 運(yùn)算:取反 異或 運(yùn)算:操作數(shù)相反為真,相同為假 強(qiáng)類(lèi)型變量:變量在使用前,必須事先聲明,甚至還需要初始化 初始化:數(shù)值初始化默認(rèn)為0,字符默認(rèn)初始化為空(NULL) 弱類(lèi)型變量:變量使用時(shí)聲明,不區(qū)分類(lèi)型,默認(rèn)為字符串 變量賦值: VAR_NAME=VALUE說(shuō)明:變量名(VAR_NAME)=值(VALUE) bash變量類(lèi)型: 環(huán)境變量: 本地變量:(局部變量) 位置變量: 特殊變量: 本地變量: VARNAME(變量名)=VALUE(值)作用域整個(gè)bash進(jìn)程 局部變量 local VARNAME(變量名)=VALUE(值)作用域當(dāng)前代碼段 環(huán)境變量:作用域?yàn)楫?dāng)前shell進(jìn)程及其子進(jìn)程 export VARNAME(變量名)=VALUE(值)export 意為”導(dǎo)出“,即為導(dǎo)出一個(gè)環(huán)境變量 腳本在執(zhí)行時(shí)會(huì)啟動(dòng)一個(gè)子shell進(jìn)程 命令行中啟動(dòng)的腳本會(huì)繼承當(dāng)前shell環(huán)境變量 系統(tǒng)自動(dòng)執(zhí)行的腳本(非命令行啟動(dòng)),就需要自我定義需要各環(huán)境變量 位置變量: $n 第n個(gè)位置變量 特殊變量: $?上一個(gè)命令的執(zhí)行狀態(tài)返回值 示例:echo $? 程序執(zhí)行,兩類(lèi)返回值 程序執(zhí)行結(jié)果 程序狀態(tài)返回代碼(0-255) 0:正確執(zhí)行 1-255:錯(cuò)誤執(zhí)行 撤銷(xiāo)變量 unset VARNAME(變量名) 查看當(dāng)前shell中的變量 set 查看當(dāng)前shell中的環(huán)境變量 printenv env export 腳本:命令的堆砌,按實(shí)際需要,結(jié)合命令流程控制機(jī)制實(shí)現(xiàn)的源程序 第一個(gè)腳本 cat fisrt.sh #!/bin/bash # 注釋行,不執(zhí)行 cat /etc/fstab la /var 保存退出 chmod +x fisrt.sh /dev/null軟件設(shè)備,bit bucket數(shù)據(jù)黑洞 引用變量:${VARNAME},括號(hào)可以省略 單引號(hào),強(qiáng)引用,不作變量替換 雙引號(hào):弱引用,內(nèi)部變量做替換 變量名規(guī)則 字母、數(shù)字、下劃線,不能以數(shù)字開(kāi)頭 不能同系統(tǒng)中已有的變量名重名 最好見(jiàn)名知意 練習(xí) 練習(xí)1:寫(xiě)一個(gè)腳本 1、條件5個(gè)用戶,user1....user5 2、每個(gè)用戶的密碼同用戶名,而且要求,添加密碼完成后不顯示passwd命令的執(zhí)行結(jié)果信息 3、每個(gè)用戶添加完成后,顯示用戶某某已經(jīng)完成添加 #!/bin/bash # 說(shuō)明:鍵盤(pán)輸入需創(chuàng)建的用戶名,執(zhí)行時(shí)自動(dòng)生成與用戶名相同的密碼,但不顯示passwd的執(zhí)行過(guò)程信息 # 說(shuō)明:添加完成后,顯示用戶某某已經(jīng)完成添加 # read命令讀取鍵盤(pán)輸入 # 驗(yàn)證密碼是否創(chuàng)建成功,用 su - read -p "input a user:" val useradd $val echo "$val" | passwd --stdin $val &> /dev/null echo "Add $val successfully!~" id $val 練習(xí)2:寫(xiě)一個(gè)腳本 1、使用一個(gè)變量保存一個(gè)用戶名 2、刪除此變量中的用戶,并且一并刪除其家目錄 3、顯示”用戶刪除完成“信息 #!/bin/bash #echo "查看有哪些用戶: 'cat /etc/passwd |cut -f1 -d:'" echo -e "查看有哪些用戶: \n$(cat /etc/passwd |cut -f1 -d:)" read -p "Delete a user:" val userdel -r $val echo "Del $val successfully!~" shell編程之條件判斷 shell -n檢查shell語(yǔ)法是否錯(cuò)誤 shell -x檢查shell執(zhí)行過(guò)程 實(shí)現(xiàn)條件判斷 條件測(cè)試類(lèi)型 整數(shù)測(cè)試:等于不等于 字符測(cè)試:是不是 文件測(cè)試:存不存在 條件測(cè)試的表達(dá)式(expression指表達(dá)式) [ expression ]中括號(hào)兩端必須有空格 [[ expression ]] test expression 整數(shù)比較(整數(shù)測(cè)試) -eq測(cè)試兩個(gè)整數(shù)是否相等,比如:$A -eq $B -ne測(cè)試連個(gè)整數(shù)是否不等,不等為真,相等為假 -gt測(cè)試一個(gè)數(shù)是否大于另一個(gè)數(shù):大于為真,否則為假 -lt測(cè)試一個(gè)數(shù)是否小于另一個(gè)數(shù):小于為真,否則為假 -ge大于或等于 -le小于或等于 命令間的邏輯關(guān)系 邏輯與:&& 第一條件為真時(shí),第二條件不用再判斷,最終結(jié)果已經(jīng)有 第一條件為真時(shí),第二條件必須判斷 示例:! id user6 && useradd user6 說(shuō)明:如果 ! id user6 為真,就執(zhí)行 useradd user6 如果 ! id user6 為假,就不執(zhí)行 useradd user6 示例:! id user6 && useradd user6說(shuō)明:用戶存在就不創(chuàng)建,用戶不存在就創(chuàng)建 邏輯或:|| 示例:id user6 || useradd user6說(shuō)明:用戶存在就不創(chuàng)建,用戶不存在就創(chuàng)建 條件判斷,控制結(jié)構(gòu) 但分支if語(yǔ)句 if 判斷條件;then statement1(語(yǔ)句1) statement2(語(yǔ)句2) ... fi 雙分支if語(yǔ)句 if 判斷條件;then statement1(語(yǔ)句1) statement2(語(yǔ)句2) ... else statement3(語(yǔ)句3) statement4(語(yǔ)句4) ... fi exit n 表示退出 (n) 示例: 判斷用戶是否存在,如果不存在就創(chuàng)建用戶和密碼,并提示創(chuàng)建成功! #!/bin/bash # read -p "please input:" NAME if id $NAME &> /dev/null;then echo "$NAME 用戶已經(jīng)存在" else useradd $NAME echo $NAME | passwd --stdin $NAME &> /dev/null echo "用戶 $NAME 添加成功。" fi 示例:如果/etc/passwd 文件的行數(shù)大于100,就顯示好大的文件 #!/bin/bash LINES=`wc -l /etc/passwd` FINLINES=`echo $LINES | cut -d' ' -f1` [ $FINLINES -gt 50 ] && echo "/etc/passwd is a big file." || echo "/etc/passwd is a small file." 示例:用戶存在,就顯示用戶已存在,否則,就添加此用戶 id user1 && echo "user1 exists" || useradd user1 示例:如果用戶不存在,就添加;否則,顯示其已經(jīng)存在 ! id user1 && useradd user1 || echo "user1 exists." 示例:如果用戶不存在,添加并且給密碼;否則,表示其以已經(jīng)存在 ! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists" 練習(xí): 寫(xiě)一個(gè)腳本 1、添加3個(gè)用戶user1,user2,user3.但要先判斷用戶是否存在,不存在而后添加 2、添加完成后,顯示一共添加了幾個(gè)用戶,當(dāng)然,不能包括因?yàn)槭孪却嬖诙鴽](méi)有添加的 3、最后顯示當(dāng)前系統(tǒng)上共有多少個(gè)用戶 #!/bin/bash # 創(chuàng)建用戶 ! id user1 &> /dev/null && useradd user1 && echo "user1" | passwd --stdin user1 &> /dev/null || echo "user1 exists" ! id user2 &> /dev/null && useradd user2 && echo "user2" | passwd --stdin user2 &> /dev/null || echo "user2 exists" ! id user3 &> /dev/null && useradd user3 && echo "user3" | passwd --stdin user3 &> /dev/null || echo "user3 exists" # 顯示當(dāng)前用戶數(shù) USERS=`wc -l /etc/passwd | cut -d: -f1` echo "$USERS users." 練習(xí): 添加用戶,并判斷是否存在,存在就顯示”已經(jīng)存在“,不存在就創(chuàng)建,并創(chuàng)建與用戶同名的密碼,并在創(chuàng)建成功后顯示”Add $val successfully!~“ #!/bin/bash read -p "input a user:" val ! id $val && useradd $val && echo "$val" | passwd --stdin $val && echo "Add $val successfully!~" || echo "$val 已經(jīng)存在" 練習(xí): 寫(xiě)一個(gè)腳本,給定一個(gè)用戶 1、如果其UID為0,就顯示此為管理員 2、否則,就顯示其為普通用戶 第一種方法 #!/bin/bash read -p "請(qǐng)輸入用戶名: " NAME USERID=`id -u $NAME` if ! id $NAME &> /dev/null ;then echo "................ " else if [ $USERID -eq 0 ];then echo "................ " echo "$NAME為管理員." else echo "................ " echo "$NAME為普通用戶" fi echo "................ " fi 第二種方法: #!/bin/bash # 需完善 read -p "請(qǐng)輸入用戶名:" NAME #NAME=fan USERID=`id -u $NAME` ! id $NAME && echo "用戶不存在!" || [ $USERID -eq 0 ] && echo "admin" || echo "Common user." 練習(xí): 判斷當(dāng)前系統(tǒng)是否有用戶的默認(rèn)shell為bash,如果有,就顯示有多少個(gè)這類(lèi)用戶,否則,就顯示沒(méi)這類(lèi)用戶 #!/bin/bash # grep "\<bash$" /etc/passwd &> /dev/null RETVAL=$? if [ $RETVAL -eq 0 ];then USERS=`grep "\<bash$" /etc/passwd | wc -l` echo "使用bash的用戶有 $USERS 個(gè)! " else echo "No have!~" fi 練習(xí): 判斷當(dāng)前系統(tǒng)是否有用戶的默認(rèn)shell為bash,如果有,就顯示其中一個(gè)這類(lèi)用戶,否則,就顯示沒(méi)這類(lèi)用戶 #!/bin/bash # grep "\<bash$" /etc/passwd &> /dev/null RETVAL=$? if [ $RETVAL -eq 0 ];then USERS=`grep "\<bash$" /etc/passwd | head -1 | cut -d: -f1` echo "$USERS 就是一個(gè)使用bash的用戶!! " else echo "沒(méi)有該用戶!~" fi 練習(xí): 給定一個(gè)文件,判斷文件中是否有空白行,如果有,顯示空白行數(shù),如果沒(méi)有就顯示沒(méi)有空白行 自己的方法: #!/bin/bash read -p "please iuput file: " NAME if [ -e $NAME ];then Number=`grep '^$' $NAME | wc -l` if [ $Number -eq 0 ];then echo "文件沒(méi)有空白行!" else echo "文件有 $Number 行空白行!" fi else echo "該文件不存在!~" fi 參考馬哥的方法: #!/bin/bash read -p "please iuput file: " FILE if [ ! -e $FILE ];then echo "該文件不存在!~" exit 1 fi if grep "^$" $FILE &> /dev/null;then echo "文件有 `grep '^$' $FILE | wc -l` 行空白行!" else echo "文件沒(méi)有空白行!" fi 練習(xí): 寫(xiě)一個(gè)腳本,判斷其UID和GID是否一樣,如果一樣,此用戶為”good“;否則,為”bad” 第一種方法: #!/bin/bash read -p "請(qǐng)輸入用戶:" ID Uid=`id -u $ID` Gid=`id -g $ID` if [ $Uid -eq $Gid ];then echo "good!~" else echo "bad!~" fi 第二種方法: #!/bin/bash read -p "請(qǐng)輸入用戶:" ID if ! grep "^$ID\>" /etc/passwd $> /dev/null;then echo "用戶不存在" exit 1 fi UserID=`grep "^$ID\>" /etc/passwd | cut -d: -f3` GroupID=`grep "^$ID\>" /etc/passwd | cut -d: -f4` if [ $UserID -eq $GroupID ];then echo "good!~(UID和GID相同)" else echo "bad!~(UID和GID不同)" fi shell條件判斷和算術(shù)運(yùn)算 1、let 算術(shù)運(yùn)算表達(dá)式 let C=$A+$B 2、$[算術(shù)運(yùn)算表達(dá)式] C=$[$A+$B] 3、$((算術(shù)運(yùn)算表達(dá)式)) C=$(($A+$B)) 4、expr C=`EXPR $A + $B` 練習(xí): 給定一個(gè)用戶,獲取其密碼警告期限,而后判斷用戶最近一次修改時(shí)間距是否已經(jīng)小于警告期限 小于,則顯示“warning”,否則,顯示“find” 一方法: #!/bin/bash read -p "請(qǐng)輸入用戶:" ID TIMESTAMP=`date +%s` TODAY=`let today=$TIMESTAMP/86400` UserID=`grep "^$ID\>" /etc/passwd | cut -d: -f3` ti2=`let Ti1=$TODAY-$UserID` ti3=`grep "^$ID\>" /etc/passwd | cut -d: -f6` if [ $ti2 < $ti3 ];then echo " warning!!! " else echo "find!!! " fi 二方法: #!/bin/bash read -p "請(qǐng)輸入用戶:" ID W=`grep "^$ID\>" /etc/passwd | cut -d: -f6` S=`date +%s` T=`expr $s/86400` L=`grep "^$ID\>" /etc/passwd | cut -d: -f5` N=`grep "^$ID\>" /etc/passwd | cut -d: -f3` SY=$[$L-$[$T-$N]] if [ $SY-lt $W ];then echo " warning!!! " else echo "find!!! " fi shell 整數(shù)測(cè)試和特殊變量 整數(shù)測(cè)試 -eq測(cè)試兩個(gè)整數(shù)是否相等,比如:$A -eq $B -ne測(cè)試連個(gè)整數(shù)是否不等,不等為真,相等為假 -gt測(cè)試一個(gè)數(shù)是否大于另一個(gè)數(shù):大于為真,否則為假 -lt測(cè)試一個(gè)數(shù)是否小于另一個(gè)數(shù):小于為真,否則為假 -ge大于或等于 -le小于或等于 整數(shù)測(cè)試方法: [ expression ]命令測(cè)試法 [[ expression ]]關(guān)鍵字測(cè)試法 test expression 示例:比較兩個(gè)數(shù)值 [ $Num1 -eq $Num2 ] [[ $Num1 -eq $Num2 ]] test $Num1 -eq $Num2 文件測(cè)試: -e file測(cè)試文件是否存在 -f file測(cè)試文件是否為普通文件 -d file測(cè)試指定路徑是否為目錄 -r file測(cè)試當(dāng)前用戶對(duì)指定文件是否有讀權(quán)限 -w file測(cè)試當(dāng)前用戶對(duì)指定文件是否有寫(xiě)權(quán)限 -x file測(cè)試當(dāng)前用戶對(duì)指定文件是否有執(zhí)行權(quán)限 示例: 測(cè)試文件是否存在 [ -e filename ] 多分支if語(yǔ)句 if 判斷條件1;then statement1 ... elif 判斷條件2;then statement2 ... elif 判斷條件3;then statement3 ... else statement4 ... fi 定義腳本退出碼: exit 退出腳本 exit # 測(cè)試腳本是否有語(yǔ)法錯(cuò)誤 bash -n 腳本 腳本單步執(zhí)行 bash -x 腳本 bash變量類(lèi)型: 環(huán)境變量: 本地變量:(局部變量) 位置變量: 特殊變量: 位置變量: $1,$2,... shift輪替(默認(rèn)為1) 特殊變量: $?上一條命令的退出狀態(tài)碼 $#參數(shù)的個(gè)數(shù) $*參數(shù)列表 $@參數(shù)列表 練習(xí): vim shift.sh #!/bin/bash echo $1 shift 2 echo $1 shift 2 echo $1 練習(xí): 寫(xiě)腳本,給腳本傳遞兩個(gè)參數(shù)(整數(shù));顯示兩者之和,之積 #!/bin/bash if [ $# -lt 2 ];then echo "Usge: ./.sh ARG1,ARG2." exit 8 fi echo "The sum is: $[$1+$2]." echo "the pro is: $[$1*$2]." 練習(xí): 寫(xiě)一個(gè)腳本,接受參數(shù),判定,此參數(shù)如果是一個(gè)存在的文件,就顯示“OK”,否則就顯示“No such file。” #!/bin/bash #說(shuō)明:參數(shù)不能為空,否則會(huì)顯示幫助"Usge: ./fan3.sh ARG1...[ARG2,ARG3,...]" if [ $# -lt 1 ];then echo "Usge: ./fan3.sh ARG1...[ARG2,ARG3,...]" exit 7 fi if [ -e $1 ];then echo "OK" else echo "No such file." fi shell字符串測(cè)試和for循環(huán) 字符串比較 == 等值比較,等則為真,不等為假(等號(hào)兩端必須是空格) !=不等比較,不等為真,等則為假 -n string測(cè)試字符串是否為空,空為真,不空為假 -z string測(cè)試字符串是否為不空,不空為真,空為假 循環(huán):進(jìn)入條件,退出條件 for while until for循環(huán) for 變量 in 列表;do 循環(huán)體 done 遍歷完成后,退出 生成列表 {1..100}表示起始為1,結(jié)束為100 `seq [起始數(shù)[步進(jìn)長(zhǎng)度]] 結(jié)束數(shù)` 循環(huán)示例: 示例: 1加到100 #!/bin/bash # declare -i SUM=0 for I in {1..100};do let SUM=$[$SUM+$I] done echo "sum is :$SUM" 字符串比較示例: 示例: 傳遞一個(gè)用戶名參數(shù)給腳本,判斷此用戶名跟基本組的組名是否一致 #!/bin/bash # if ! id $1 &> /dev/null;then echo "No such user." exit 10 fi if [ $1 == 'id -n -g $1' ];then echo "ok" else echo "No" fi 示例: 傳一個(gè)參數(shù)(單字符),參數(shù)為q,就退出腳本,否則顯示用戶的參數(shù) 示例: 傳一個(gè)參數(shù)(單字符),參數(shù)為q、Q、quit,就退出腳本,否則顯示用戶的參數(shù) #!/bin/bash # if [ $1 = 'q' ];then echo "Quiting..." exit 1 elif [ $1 = 'Q' ];then echo "Quiting..." exit 2 elif [ $1 = 'quit' ];then echo "Quiting..." exit 3 elif [ $1 = 'Quit' ];then echo "Quiting..." exit 4 else echo $1 fi 字符串練習(xí): 傳遞三個(gè)參數(shù),第一個(gè)為整數(shù),第二個(gè)為運(yùn)算符,第三個(gè)為整數(shù),顯示計(jì)算結(jié)果,要求保留兩位精度 bc用法 echo " scale=2;a/b" | bs bc <<< "scale=2;a/b" 字符串練習(xí): 比較三個(gè)整數(shù)的大小 練習(xí): 判斷當(dāng)前主機(jī)的CPU生產(chǎn)商,其信息在/proc/cpuinfo文件中vendor id 一行中 如果其生產(chǎn)商為AuthenticAMD,就顯示其為AMD公司 如果其生產(chǎn)商為GenuineIntel,就顯示其為Intel公司 否則,就為非主流公司 #!/bin/bash # I=vendor_id N=`grep $I /proc/cpuinfo | sed -r 's#[[:space:]]+##g' | cut -d: -f2` if [ $N == GenuineIntel ];then echo "該CPU生產(chǎn)商為:Intel 公司" elif [ $N == AuthenticAMD ];then echo "該CPU生產(chǎn)商為 AMD 公司" else echo "該CPU生產(chǎn)商為非主流公司!" fi 字符串練習(xí): 傳遞3個(gè)參數(shù),參數(shù)均為用戶名。將此用戶的賬號(hào)信息提取出來(lái)后放置于filename 中,行號(hào)一行首有行號(hào) #!/bin/bash # A=root B=mail C=ntp echo `grep -n ^$A /etc/passwd` >>file.txt echo `grep -n ^$B /etc/passwd` >>file.txt echo `grep -n ^$C /etc/passwd` >>file.txt for循環(huán)練習(xí)題 遍歷/etc/passwd中的用戶,并問(wèn)好!并顯示對(duì)方的shell 提示: LINES=`wc -l /etc/passwd | cut -d' ' -f1` for I in `seq 1 $LINES`;do echo "hello,`head -n $I /etc/passwd | tail -l | cut -d: -f1`";done #!/bin/bash # LI=`wc -l /etc/passwd | cut -d' ' -f1` #echo "$LI" for I in `seq 1 $LI`;do echo "hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`, 該用戶對(duì)于的shell是:`head -n $I /etc/passwd | tail -1 | cut -d: -f7`"; done for循環(huán)練習(xí)題 添加10個(gè)用戶user1到user10,密碼同用戶名;但要求只有用戶不存在才能創(chuàng)建 #!/bin/bash for I in {1..10};do let N=$I U=user$N if id $U &>/dev/null;then echo "$U 已經(jīng)存在!~" else useradd $U echo $U | passwd --stdin $U &> /dev/null echo "$U 已經(jīng)添加成功!~" fi done 擴(kuò)展: 刪除用戶user1...user10 #!/bin/bash for I in {1..10};do let N=$I U=user$N if id $U &>/dev/null;then userdel -r $U echo "$U 已經(jīng)刪除成功!~" else echo "$U 不存在!~" fi done 擴(kuò)展:接受參數(shù): add:添加用戶user1...user10 del:刪除用戶user1...user10 #!/bin/bash if [ $# -lt 1 ];then echo "input add or del:" exit 7 fi if [ $1 == 'add' ];then for I in {1..10};do if id user$I &> /dev/null;then echo "user$I 已存在" else useradd user$I echo user$I | passwd --stdin user$I &> /dev/null echo "user$I 添加成功!~" fi done elif [ $1 == 'del' ];then for I in {1..10};do if id user$I &> /dev/null;then userdel -r user$I echo "user$I 刪除成功" else echo "user$I 不存在" fi done else echo “Unknown ARG” exit 8 fi 執(zhí)行:.sh add 添加用戶 .sh del 刪除用戶 擴(kuò)展: 輸入 .sh user1,user2,user3 添加 #!/bin/bash echo $1 for I in `echo $1 | sed 's/,/ /g'`;do if id $I &>/dev/null;then echo "$I 存在" else useradd $I echo $I | passwd --stdin $I >/dev/null echo "$I 添加成功" fi done 擴(kuò)展: 輸入 .sh --add user1,user2,user3 .sh --del user1,user2,user3 #!/bin/bash if [ $1 == '--add' ];then for I in `echo $2 | sed 's/,/ /g'`;do if id $I &>/dev/null;then echo "$I 存在" else useradd $I echo $I | passwd --stdin $I >/dev/null echo "$I 添加成功" fi done elif [ $1 == '--del' ];then for I in `echo $2 | sed 's/,/ /g'`;do if id $I &>/dev/null;then userdel -r $I echo "$I 刪除成功" else echo "$I 不存在" fi done elif [ $1 == '--help' ];then echo "(1).命令格式:./ sh --[options] username!~" echo "(2).--add username | --del username | --help 不能同時(shí)出現(xiàn)" else echo “Unknown options” fi 缺點(diǎn)(待完善): 無(wú)法判斷參數(shù)數(shù) 無(wú)法判斷沒(méi)有參數(shù)(忘記給參數(shù)) 無(wú)法判斷參數(shù)錯(cuò)誤(--add和--del同時(shí)使用) for循環(huán)練習(xí)題 計(jì)算100以內(nèi)所有能被3整除的正整數(shù) 提示:取模,取余 #!/bin/bash let "sum=0" for i in {1..10} do let "m=i%3" if [ "$m" -eq 0 ] then let "sum=sum+i" fi done echo "the sum is :$sum" for循環(huán)練習(xí)題 計(jì)算100以內(nèi)所有奇數(shù)的和以及所有偶數(shù)的和,分別顯示之 #!/bin/bash declare "sum1=0" declare "sum2=0" for i in {1..100} do let "m=i%2" if [ "$m" -eq 0 ];then let "sum1=sum1+i" elif [ "$m" -eq 1 ];then let "sum2=sum2+i" fi done echo " 1-100以內(nèi)的偶數(shù)和為: $sum1" echo " 1-100以內(nèi)的奇數(shù)和為: $sum2" 練習(xí)題 分別顯示默認(rèn)shell為bash的用戶和/sbin/nologin的用戶,并統(tǒng)計(jì)各類(lèi)shell下的用戶總數(shù) #!/bin/bash # FILE=/etc/passwd echo "默認(rèn)shell為bash的用戶有: `grep 'bash' $FILE | wc -l` 個(gè)!分別為:" B=`sed -n '/bash/p' $FILE | cut -d: -f1` BB=`echo $B|sed 's@[[:spqce:]]@,@g'` echo "$BB" echo "默認(rèn)shell為nologin的用戶有 `grep 'nologin' $FILE | wc -l` 個(gè)!分別為:" A=`sed -n '/nologin/p' $FILE | cut -d: -f1` AA=`echo $A|sed 's@[[:spqce:]]@,@g'` echo "$AA" 腳本選項(xiàng)·和組合條件測(cè)試 回顧: 整數(shù)測(cè)試: -eq測(cè)試兩個(gè)整數(shù)是否相等,比如:$A -eq $B -ne測(cè)試連個(gè)整數(shù)是否不等,不等為真,相等為假 -gt測(cè)試一個(gè)數(shù)是否大于另一個(gè)數(shù):大于為真,否則為假 -lt測(cè)試一個(gè)數(shù)是否小于另一個(gè)數(shù):小于為真,否則為假 -ge大于或等于 -le小于或等于 字符測(cè)試 ==等于 !=不等于 >大于 <小于 -n字符串是否為空 -z字符串是否為不空 文件測(cè)試 -e file測(cè)試文件是否存在 -f file測(cè)試文件是否為普通文件 -d file測(cè)試指定路徑是否為目錄 -r file測(cè)試當(dāng)前用戶對(duì)指定文件是否有讀權(quán)限 -w file測(cè)試當(dāng)前用戶對(duì)指定文件是否有寫(xiě)權(quán)限 -x file測(cè)試當(dāng)前用戶對(duì)指定文件是否有執(zhí)行權(quán)限 組合測(cè)試 -o邏輯或 -a邏輯與 !邏輯非 添加10個(gè)用戶user1到user10,密碼同用戶名;但要求只有用戶不存在才能創(chuàng)建 #!/bin/bash for I in {1..10};do let N=$I U=user$N if id $U &>/dev/null;then echo "$U 已經(jīng)存在!~" else useradd $U echo $U | passwd --stdin $U &> /dev/null echo "$U 已經(jīng)添加成功!~" fi done 擴(kuò)展: 刪除用戶user1...user10 #!/bin/bash for I in {1..10};do let N=$I U=user$N if id $U &>/dev/null;then userdel -r $U echo "$U 已經(jīng)刪除成功!~" else echo "$U 不存在!~" fi done 擴(kuò)展:接受參數(shù): add:添加用戶user1...user10 del:刪除用戶user1...user10 #!/bin/bash if [ $# -lt 1 ];then echo "input add or del:" exit 7 fi if [ $1 == 'add' ];then for I in {1..10};do if id user$I &> /dev/null;then echo "user$I 已存在" else useradd user$I echo user$I | passwd --stdin user$I &> /dev/null echo "user$I 添加成功!~" fi done elif [ $1 == 'del' ];then for I in {1..10};do if id user$I &> /dev/null;then userdel -r user$I echo "user$I 刪除成功" else echo "user$I 不存在" fi done else echo “Unknown ARG” exit 8 fi 執(zhí)行:.sh add 添加用戶 .sh del 刪除用戶 擴(kuò)展: 輸入 .sh user1,user2,user3 添加 #!/bin/bash echo $1 for I in `echo $1 | sed 's/,/ /g'`;do if id $I &>/dev/null;then echo "$I 存在" else useradd $I echo $I | passwd --stdin $I >/dev/null echo "$I 添加成功" fi done 擴(kuò)展: 輸入 .sh --add user1,user2,user3 .sh --del user1,user2,user3 #!/bin/bash if [ $1 == '--add' ];then for I in `echo $2 | sed 's/,/ /g'`;do if id $I &>/dev/null;then echo "$I 存在" else useradd $I echo $I | passwd --stdin $I >/dev/null echo "$I 添加成功" fi done elif [ $1 == '--del' ];then for I in `echo $2 | sed 's/,/ /g'`;do if id $I &>/dev/null;then userdel -r $I echo "$I 刪除成功" else echo "$I 不存在" fi done elif [ $1 == '--help' ];then echo "(1).命令格式:./ sh --[options] username!~" echo "(2).--add username | --del username | --help 不能同時(shí)出現(xiàn)" else echo “Unknown options” fi 缺點(diǎn)(待完善): 無(wú)法判斷參數(shù)數(shù) 無(wú)法判斷沒(méi)有參數(shù)(忘記給參數(shù)) 無(wú)法判斷參數(shù)錯(cuò)誤(--add和--del同時(shí)使用) shell編程case語(yǔ)句和腳本選項(xiàng)進(jìn)階 面向過(guò)程 控制接口 順序結(jié)構(gòu) 選擇結(jié)構(gòu) if..slif..else..fi 循環(huán)結(jié)構(gòu) case語(yǔ)句:選擇結(jié)構(gòu) case SWITCH in value1) statement ... ;;#每一個(gè)選擇條件必須兩個(gè);結(jié)束 value2) statement ... ;; *) statement ... ;; esac#case字母反過(guò)來(lái)寫(xiě)表示結(jié)尾 示例: 寫(xiě)一個(gè)腳本,只接受參數(shù)start,stop,restart,status其中之一 #!/bin/bash # read -p "iuput:" N case $N in 'start') echo "start server...";; 'stop') echo "stop server...";; 'restaer') echo "restart server...";; 'status') echo "Running..." *) echo "`basename $0` {start|stop|restart|status}";; esac 示例: 寫(xiě)一個(gè)腳本,可以接受選項(xiàng)及參數(shù),而后獲取每一個(gè)選項(xiàng)及參數(shù),并能根據(jù)選項(xiàng)及參數(shù)作出特定的操作 比如:admin.sh --add tom,jer --del tom,jer --v|--verbose --h|--helo 選項(xiàng)可同時(shí)使用 例如:./test.sh -v --add tom,jer #!/bin/bash # DEBUG=0 ADD=0 DEL=0 for I in `seq 1 $#`;do if [ $# -gt 0 ]; then case $1 in -v|--verbose) DEBUG=1 shift ;; -h|--help) echo "Usage:`basename $0` --add UAERNAM --del USERNAME -v|--verbose -h|--help" exit 0 ;; --add) ADD=1 ADDUSERS=$2 shift 2 ;; --del) DEL=1 DELUSERS=$2 shift 2 ;; *) echo "Usage:`basename $0` --add UAERNAM --del USERNAME -v|--verbose -h|--help" exit 7 ;; esac fi done if [ $ADD -eq 1 ]; then for USER in `echo $ADDUSERS | sed 's@,@ @g'`; do if id $USER &> /dev/null; then [ $DEBUG -eq 1 ] && echo "$USER exists." else useradd $USER [ $DEBUG -eq 1 ] && echo "Add user $USER finished." fi done fi if [ $DEL -eq 1 ]; then for USER in `echo $DELUSERS | sed 's@,@ @g'`; do if id $USER &> /dev/null; then userdel -r $USER [ $DEBUG -eq 1 ] && echo "Delete $USER finished." else [ $DEBUG -eq 1 ] && echo "$USER not exist." fi done fi 寫(xiě)一個(gè)腳本 利用RANDOM生成10個(gè)隨機(jī)數(shù),并找出其中的最大值和最小值 #!/bin/bash declare -i MAX=0 declare -i MIN=0 for I in {1..10};do myrand=$RANDOM [ $I -eq 1 ] && MIN=$myrand if [ $I -le 9 ];then echo -n "$myrand," else echo "$myrand" fi [ $myrand -gt $MAX ] && MAX=$myrand [ $myrand -lt $MIN ] && MIN=$myrand done echo "max = $MAX" echo "min = $MIN" 示例: 寫(xiě)一個(gè)腳本:showlog.sh 用法為: showlog.sh -v -c -h|--help 其中:-h選項(xiàng)單獨(dú)使用,用于顯示幫助信息,-c顯示當(dāng)前登陸的所有用戶,如果同時(shí)使用-v,極限是同時(shí)登陸的用戶數(shù),又顯示登陸用戶的相關(guān)信息 #!/bin/bash # declare -i SHOWNUM=0 declare -i SHOWUSERS=0 for I in `seq 1 $#`;do if [ $# -gt 0 ]; then case $1 in -h|--help) echo "Usage:`basename $0` -h|--help -c|-counts -v|--verbose" exit 0 ;; -v|--verbose) let SHOWUSERS=1 shift ;; -c|--count) let SHOWNUM=1 shift ;; *) echo "Usage:`basename $0` -h|--help -c|-counts -v|--verbose" exit 8 ;; esac fi done if [ $SHOWNUM -eq 1 ];then echo "log users:`who | wc -l`." if [ $SHOWUSERS -eq 1 ];then echo "They are:" who fi fi shell編程 while循環(huán) while循環(huán) 適用于循環(huán)次數(shù)未知的場(chǎng)景 必須要有退出條件 語(yǔ)法格式 while CONDITON;do statement ... done 進(jìn)入循環(huán),條件滿足 退出循環(huán),條件不滿足 循環(huán)的控制方法 break提前退出循環(huán) continue提前進(jìn)入下一循環(huán) while特殊用法之一:死循環(huán) while :;do done while特殊用法之二: while read LINE;do done < FILENAME 說(shuō)明:whlie 循環(huán)讀取FILENAME中的每一行,放在變量LINE中,然后再循環(huán)中處理LINE中的行 示例:(待完善) 判斷/etc/passwd中的那個(gè)用戶的shell是bash,如果是bash就顯示用戶名,否則不顯示名字 #!/bin/bash # FILE=/etc/passwd let I=0 while read LINE;do [ `echo $LINE | awk -F : '{prinf $3}'` -le 505 ] && continue #用戶ID大于505就不在判斷,提前進(jìn)入下一循環(huán) [ `echo $LINE | awk -F : '{prinf $7}'` == '/bin/bash' ] && echo $LINE | awk -F : '{print $1}' && let I++ [ $I -eq 6 ] && break #只讀取前6個(gè)用戶 done < $FILE continue示例: 計(jì)算100以內(nèi)所有偶數(shù)和 #!/bin/bash # let SUM=0 let I=0 while [ $I -lt 100 ];do let I++ if [ $[$I%2] -eq 0 ];then continue fi let SUM+=$I done echo $SUM break示例: 從1加到1000,知道和為5000就退出循環(huán)不再相加 #!/bin/bash # declare -i SUM=0 for I in {1..1000};do let SUM+=$I if [ $SUM -gt 5000 ];then break fi done echo "I=$I" echo "SUM=$SUM" break示例: 判斷一個(gè)文件是否存在,用戶輸入quit就退出 #!/bin/bash # while :;do read -p "input filename:"FILENAME [ $FILENAME=='quit' ] && break if [ -e $FILENAME ];then echo "$FILENAME exists." else echo "No $FILENAME" fi done echo "Quit." 寫(xiě)一個(gè)腳本: 說(shuō)明:此腳本能于同一個(gè)repo文件中創(chuàng)建多個(gè)yum源的指向 1、接受一個(gè)文件名作為參數(shù),此文件存放至/etc/yum.repos.d目錄中,且文件名以.repo為后綴,要求此文件不能事先存,否則,報(bào)錯(cuò) 2、在腳本中,提醒用戶輸出repo id ,如果為quit,則退出腳本,否則,繼續(xù)完成下面的步驟 3、repo name以及baseurl的路徑,而后以repo文件的格式將其保存到指定的文件中 4、enabled默認(rèn)為1,而gpgcheck默認(rèn)為0 5、此腳本會(huì)循環(huán)多次,除非用戶為repo id指定為quit #!/bin/bash # REPOFILE=/etc/yum.repos.d/$1 if [ -e $REPODILE ];then echo "$1 exists." exit 3 fi read -p "input ID:" REPOID until [ $REPOID == 'quit' ];do echo "[$REPOID]" >> $REPOFILE read -p "input name: " REPONAME echo "name=$REPONAME" >> $REPOFILE read -p "input Baseurl:" REPOURL echo -e 'enabled-1\ngpgcheck=0' >> $REPOFILE read -p "input ID:" REPOID done 示例: 計(jì)算100以內(nèi)所有正整數(shù)的和 #!/bin/bash # declare -i I=1 declare -i SUM=0 while [ $I -le 100 ];do let SUM+=$I let I++ done echo "$SUM" 示例: 用戶輸入字符串,就轉(zhuǎn)換成大寫(xiě),輸入‘quit’就退出 #!/bin/bash # read -p "input something:" STRING while [ $STRING != 'quit' ];do echo $STRING | tr 'a-z' 'A-Z' read -p "input something:" STRING done 示例: 練習(xí): 每隔5秒就來(lái)查看hadoop是否已經(jīng)登陸,如登陸,顯示其已經(jīng)登陸,就退出 提示:sleep sleep 3 延遲3秒 #!/bin/bash # who | grep "hadoop" &> /dev/null RETVAL=$? while [ $RETVAL -ne 0 ];do echo "`date`,hadoop not is log!" sleep 5 who | grep "hadoop" &> /dev/null RETVAL=$? done echo "`date` hadoop is logged!" 示例: 1.顯示一個(gè)菜單給用戶 d|D) show disk usages m|M) show menory usages s|S) show swap usages *) quit 2.當(dāng)用戶給定選項(xiàng)后顯示響應(yīng)的內(nèi)容 #!/bin/bash cat << EOF d|D) show disk usages m|M) show menory usages s|S) show swap usages *) quit EOF read -p "Your choice:" CH case $CH in d|D) echo "Disk usages:" df -h ;; m|M) echo "Memory usages;" free -m | grep "Mem" ;; s|S) echo "Swap usages:" free -m | grep "Swap" ;; *) echo "Unknow.." exit 9 ;; esac ~ 擴(kuò)展: 當(dāng)用戶選擇完成,顯示響應(yīng)信息后,不退出,而讓用戶再一次選擇,再次顯示響應(yīng)內(nèi)容,除了用戶使用quit #!/bin/bash cat << EOF d|D) show disk usages m|M) show menory usages s|S) show swap usages *) quit EOF read -p "Your choice:" CH while [ $CH != 'quit' ];do case $CH in d|D) echo "Disk usages:" df -h ;; m|M) echo "Memory usages;" free -m | grep "Mem" ;; s|S) echo "Swap usages:" free -m | grep "Swap" ;; *) echo "Unknow.." ;; esac read -p "Again,your choice:" CH done 寫(xiě)一個(gè)腳本: 1、提示用戶輸入一個(gè)用戶名 2、顯示一個(gè)菜單給用戶。形如 U|u show UID G|g show GID S|s show SHELL Q|q quit 3、提醒用戶選擇一個(gè)選項(xiàng),并顯示其所有選擇的內(nèi)容 如果用戶給一個(gè)錯(cuò)誤的選項(xiàng),則提醒用戶選項(xiàng)錯(cuò)誤,請(qǐng)其重新選擇 #!/bin/bash # echo "* * * * * * * * * * * * *" read -p "Please enter your user name: " US until [ $US == 'quit' ];do if id -u $US &> /dev/null;then echo "$US is OK!Please select" echo "=======options=======" cat << EOF U|u) show UID G|g) show GID S|s) show SHELL q|Q) quit EOF echo "=====================" read -p "Please select options: " SH echo "=====================" while : ;do case $SH in U|u) echo "$US uid=`grep "^$US" /etc/passwd | cut -d: -f4`" ;; G|g) echo "$US gid=`grep "^$US" /etc/passwd | cut -d: -f3`" ;; S|s) echo "$US shell=`grep "^$US" /etc/passwd | cut -d: -f7`" ;; Q|q) echo "******quiting...******" exit ;; *) echo "Wrong option.Please again" echo "=======options=======" cat << EOF U|u) show UID G|g) show GID S|s) show SHELL q|Q) quit EOF echo "=====================" ;; esac read -p "Please choose again: " SH done else echo "-------------------------------------" echo "The user name wrong.." echo "* * * * * * * * * * * * *" read -p "Please enter the username again : " US fi done shell編程until循環(huán) until CONDITION; 進(jìn)入循環(huán),條件不滿足 退出循環(huán),條件滿足 for循環(huán) for ((expr1 ; expr2 ; expr3)); do 循環(huán)體 done 示例: 100以內(nèi)的正整數(shù)相加 #!/bin/bash # declare -i SUM2=0 for ((J=1;J<=100;J++));do let SUM2+=$J done echo $SUM2 until循環(huán)示例: 示例: #!/bin/bash # read -p "input something:" ST until [ $ST== 'quit' ];do echo $ST | tr 'a-z' 'A-Z' read -p "input something:" ST done 示例: 練習(xí): 每隔5秒就來(lái)查看hadoop是否已經(jīng)登陸,如登陸,顯示其已經(jīng)登陸,就退出 第一種方法 #!/bin/bash # who | grep "hadoop" &> /dev/null RETVAL=$? until [ $RETVAL -eq 0 ];do echo "hadoop is not come." sleep 5 who | grep "hadoop" &> /dev/null RETVAL=$? done echo "hadoop is logged in." 第二種方法 #!/bin/bash # until who | grep "hadoop" &> /dev/null;do echo "hadoop is not come." sleep 5 done echo "hadoop is logged in." 測(cè)試: 通過(guò)ping命令測(cè)試192.168.0.151到192.168.0.254直接所有主機(jī)是否在線 如果在線,就顯示ip is up,其ip要換為真正的IP動(dòng)作,且顯示為綠色 如果不在線,就顯示“ip is down”,其中的IP換為真正的IP地址,且紅色顯示 分別用while,until for(兩種形式)循環(huán)實(shí)現(xiàn) for循環(huán)第一種方法: for ((i=99;i<=120;i++));do if ping -c 1 -W 1 192.168.0.$i &> /dev/null;then echo "192.168.0.$i 在線" else echo "192.168.0.$i 不在線" fi done for循環(huán)第二種方法: for i in {99..120};do if ping -c 1 -W 1 192.168.0.$i &> /dev/null;then echo "192.168.0.$i 在線" else echo "192.168.0.$i 不在線" fi done while循環(huán) #!/bin/bash # declare -i I=151 while [ $I -le 254 ];do let I++ if ping -c 1 -W 1 192.168.3.$I &> /dev/null;then echo "192.168.3.$I 在線" else echo "192.168.3.$I 不在線" fi done until循環(huán) #!/bin/bash # declare -i I=191 until [ $I -gt 254 ];do let I++ if ping -c 1 -W 1 192.168.3.$I &> /dev/null;then echo "192.168.3.$I 在線" else echo "192.168.3.$I 不在線" fi done shell編程之:函數(shù)、功能 function 代碼重用,結(jié)構(gòu)化編程,不能獨(dú)立運(yùn)行,需要調(diào)用時(shí)執(zhí)行,可以多次被調(diào)用 定義函數(shù)方法一 function FUNCNAME { command } 定義函數(shù)方法二 FUNCNAME() { command } 自定義執(zhí)行狀態(tài)返回值 return # #的值:0-255 接受參數(shù)的函數(shù) FUNCNAM n1 n2 $1 n1 $2 n2 示例: 多次顯示菜單 #!/bin/bash # function SHOWM {#定義函數(shù)SHOWM cat << EOF d|D) show disk usages m|M) show menory usages s|S) show swap usages *) quit EOF } SHOWM#調(diào)用函數(shù) return示例 添加用戶test #!/bin/bash # ADDUSER() { USERNAME=test if ! id -u $USERNAME &> /dev/null;then useradd $USERNAME echo $USERNAME | passwd --stdin $USERNAME &> /dev/null return 0 else return 1 fi } ADDUSER echo $? if [ $? -eq 0 ];then echo "add user finished." else echo "Failuer." fi 擴(kuò)展: 添加多個(gè)用戶 #!/bin/bash # ADDUSER() { USERNAME=$1 if ! id -u $USERNAME &> /dev/null;then useradd $USERNAME echo $USERNAME | passwd --stdin $USERNAME &> /dev/null return 0 else return 1 fi } for I in {1..10};do ADDUSER user$I if [ $? -eq 0 ];then echo "add user$I finished." else echo "add user$I Failuer." fi done 函數(shù)接受參數(shù)示例 #!/bin/bash # TWOSUM() { echo $[$1+$2] } TWOSUM 5 6 SUM=`TWOSUM 5 6`#保存函數(shù)的執(zhí)行結(jié)果至一個(gè)變量,可做進(jìn)一步操作 echo $SUM 示例: 10以內(nèi)相鄰兩個(gè)數(shù)相加 #!/bin/bash # TWOSUM() { echo $[$1+$2] } for I in {1..10};do let J=$[$I+1] TWOSUM $I $J echo "$I + $J = `TWOSUM $I $J`" done 示例: 寫(xiě)一個(gè)腳本,判定192.168.0.200-192.168.0.254之間的主機(jī)哪些在線。要求: 1、使用函數(shù)來(lái)實(shí)現(xiàn)一臺(tái)主機(jī)的判定過(guò)程 2、在主程序中來(lái)調(diào)用此函數(shù)判定指定范圍內(nèi)的所有主機(jī)的在線情況 第一種方法: #!/bin/bash # PING() { if ping -c 1 -W 1 $1 &> /dev/null;then echo "$1 在線" else echo "$1 不在線" fi } for I in {200..254};do PING 192.168.0.$I done #for I in{200..254};do#ping另一個(gè)網(wǎng)段 # PING 192.168.2.$I #done 第二種方法: #!/bin/bash # PING() { if ping -c 1 -W 1 $1 &> /dev/null;then return 0 else return 1 fi } for I in {200..254};do PING 192.168.0.$I if [ $? -eq 0 ];then echo "192.168.0.$I 在線" else echo "192.168.0.$I 不在線" fi done 寫(xiě)一個(gè)腳本 1、函數(shù)接受一個(gè)參數(shù),參數(shù)為用戶名 判定一個(gè)用戶是否存在 如果存在,就返回此用戶的shell和UID,并返回正常狀態(tài)值 如果不存在,就說(shuō)此用戶不存在,并返回錯(cuò)誤狀態(tài)值 2、在主程序中調(diào)用函數(shù) 擴(kuò)展1:在主程序中,讓用戶自己輸入用戶名后,傳遞給函數(shù)來(lái)進(jìn)行判斷 擴(kuò)展2:在主程序中輸入用戶名判斷后不退出腳本,而是提示用戶繼續(xù)輸入下一個(gè)用戶名,但如果用戶輸入的是q或Q就退出 #!/bin/bash # ADDUSER() { USERNAME=$1 if id -u $USERNAME &> /dev/null;then return 0 else return 1 fi } read -p "input : " U echo "===================================" until [ $U == q -o $U == Q ];do ADDUSER $U if [ $? == 0 ];then # echo "$U 存在" sh=`grep "^$U" /etc/passwd | awk -F : '{print $7}'` ui=`grep "^$U" /etc/passwd | awk -F : '{print $4}'` echo "$U 的 shell = $sh, UID = $ui" echo "===================================" read -p "input again: " U echo "===================================" else echo "$U 不存在" echo "===================================" read -p "input again: " U echo "===================================" fi done echo "quit..." echo "==================================="
本文名稱(chēng):shell學(xué)習(xí)
新聞來(lái)源:http://www.rwnh.cn/article2/pgssoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、企業(yè)建站、App設(shè)計(jì)、定制網(wǎng)站、建站公司、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)