溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

shell學(xué)習(xí)

發(fā)布時(shí)間:2020-06-15 17:45:46 來(lái)源:網(wǎng)絡(luò) 閱讀:486 作者:fanzh565656 欄目:大數(shù)據(jù)
我的自學(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)制程序,寫完代碼后,通過(guò)編譯器直接轉(zhuǎn)換成二進(jìn)制后再獨(dú)立執(zhí)行
特征:強(qiáng)類型(變量)
事先轉(zhuǎn)換成可執(zhí)行格式
語(yǔ)言類型:C、C++、JAVA、C#
動(dòng)態(tài)語(yǔ)言:解釋型語(yǔ)言
特征:弱類型
邊解釋邊執(zhí)行
語(yǔ)言類型: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ǔ)單元
變量類型(定義存儲(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)類型變量:變量在使用前,必須事先聲明,甚至還需要初始化
初始化:數(shù)值初始化默認(rèn)為0,字符默認(rèn)初始化為空(NULL)
弱類型變量:變量使用時(shí)聲明,不區(qū)分類型,默認(rèn)為字符串
變量賦值:
VAR_NAME=VALUE說(shuō)明:變量名(VAR_NAME)=值(VALUE)
bash變量類型:
環(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í)行,兩類返回值
程序執(zhí)行結(jié)果
程序狀態(tài)返回代碼(0-255)
0:正確執(zhí)行
1-255:錯(cuò)誤執(zhí)行
撤銷變量
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:寫一個(gè)腳本
1、條件5個(gè)用戶,user1....user5
2、每個(gè)用戶的密碼同用戶名,而且要求,添加密碼完成后不顯示passwd命令的執(zhí)行結(jié)果信息
3、每個(gè)用戶添加完成后,顯示用戶某某已經(jīng)完成添加
#!/bin/bash
# 說(shuō)明:鍵盤輸入需創(chuàng)建的用戶名,執(zhí)行時(shí)自動(dòng)生成與用戶名相同的密碼,但不顯示passwd的執(zhí)行過(guò)程信息
# 說(shuō)明:添加完成后,顯示用戶某某已經(jīng)完成添加
# read命令讀取鍵盤輸入
# 驗(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:寫一個(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è)試類型
整數(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í):
寫一個(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í):
寫一個(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è)這類用戶,否則,就顯示沒(mé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è)這類用戶,否則,就顯示沒(mé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í):
寫一個(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ì)指定文件是否有寫權(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變量類型:
環(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í):
寫腳本,給腳本傳遞兩個(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í):
寫一個(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ì)各類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ì)指定文件是否有寫權(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)寫表示結(jié)尾
示例:
寫一個(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
示例:
寫一個(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
寫一個(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"
示例:
寫一個(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."  
寫一個(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)換成大寫,輸入‘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
寫一個(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
示例:
寫一個(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
寫一個(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 "==================================="
向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI