Shell版本迴圈語句(if//for/while/case)
if選擇結構
if單分支處理:當“條件成立”時執行命令序列xx,否則,不執行任何操作(只判斷為真)
if [條件測試] ; then
命令序列xx
fi
示例:檢測/media/cdrom目錄,若不存在則建立
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ ! -d $MOUNT_DIR ] ; then
mkdir -p $MOUNT_DIR
fi
示例:每分鐘判斷當前登陸使用者是否超過3人,若超過3人,自動傳送郵件給root,報警!
#!/bin/bash
num=$(who |wc -l)
if [ $num -gt 3 ];then
mail -s Warning [email protected] < /root/mail.txt
mail -s Warning root < /root/mail.txt
fi
思路:1.計算登陸使用者
2.判斷使用者是否大於3,如果大於,則傳送郵件
3.chmod +x test.sh
4.將指令碼放到計劃任務內:crontab -e
* * * * * /root/test.sh
示例:如果是管理員,執行所有命令
#!/bin/bash
if [ $USER == root ];then
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd`
fi
###############################################################################
if 雙分支處理:當“條件成立”時執行命令序列xx,否則,執行命令序列yy(非對即錯)
if [條件測試] ; then
命令序列xx
else
命令序列yy
fi
示例:檢測並判斷指定的主機是否可ping通。使用者輸入IP地址,判斷是否能ping通。能則輸出ip地址up;不能則輸出ip地址down。
為了節省ping測試時間,可以只發送3個測試包(-c 3)、縮短髮送測試包的間隔秒數(-i 0.2)、等待反饋的超時秒數(-W 3)。
#!/bin/bash
read -p '請輸入您要測試的IP地址:' ip
ping -c 2 -i 0.1 -W 2 $ip &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $ip is up."
else
echo "Host $ip is down."
fi
# chmod +x pinghost.sh
# ./pinghost.sh 192.168.4.5
示例:判斷使用者輸入的使用者名稱,該使用者是否存在,存在則輸出使用者id基本資訊,不存在則建立此使用者
#!/bin/bash
read -p '請輸入您的使用者名稱:' user
id $user &> /dev/null 或使用useradd $user
if [ $? -eq 0 ];then
echo 使用者已經建立
else
echo 使用者已存在
id $user
fi
###############################################################################
if 多分支處理:當條件1滿足時,作xx處理;否則繼續檢查
條件2,若成立則作yy處理;否則,作zz處理
相當於多層if語句巢狀,針對多個條件分別執行不同的操作
if [條件測試1] ; then
命令序列xx
elif 條件測試2 ; then
命令序列yy
.. ..
else
命令序列zz
fi
指令碼的退出狀態:取決於退出前最後一條命令的 $? 值,或者“exit 整數值”指定。
示例:猜數字遊戲:
#!/bin/bash
num=$[RANDOM%100]
for i in {1..10}
do
read -p "請輸入一個範圍在「0-99」的數字: " guess
if [ $num -eq $guess ];then
echo "你猜對了,恭喜您!!!"
echo "隨機數為:$num; 您猜的數字為:$guess"
echo "恭喜,猜對了,猜了$i次"
exit
elif [ $num -lt $guess ];then
echo "您猜錯了,您輸入的數字比隨機數大,您猜了$i次"
echo "您猜的數字為:$guess"
else
echo "您猜錯了,您輸入的數字比隨機數小,您猜了$i次"
echo "您猜的數字為:$guess"
fi
done
示例:從鍵盤讀取一個論壇積分,判斷論壇使用者等級
大於等於90 神功絕世
大於等於80,小於90 登峰造極
大於等於70,小於80 爐火純青
大於等於60,小於70 略有小成
大於60 初學乍練
#!/bin/bash
read -p "請輸入積分(0-100):" JF
if [ $JF –ge 90 ] ; then
echo "$JF 分,神功絕世"
elif [ $JF –ge 80 ] ; then
echo "$JF 分,登峰造極"
elif [ $JF –ge 70 ] ; then
echo "$JF 分,爐火純青"
elif [ $JF –ge 60 ] ; then
echo "$JF 分,略有小成"
else
echo "$JF 分,初學乍練"
fi
# chmod +x gradediv.sh
# ./gradediv.sh
示例:輸入一個分數,判斷成績分檔:85-100優秀、70-84良好、低於70分不合格
#!/bin/bash
read -p '請輸入您的分數(0-100):' FS
if [ $FS -ge 85 ] && [ $FS -le 100 ];then
echo “ $FS分!優秀 ”
elif [ $FS -ge 70 ] && [ $FS -le 84 ];then
echo “ $FS分!合格 ”
else
echo “ $FS分!不合格 ”
fi
示例:當執行/root/foo.sh redhat,輸出為fedora;當執行/root/foo.sh fedora,輸出為redhat;當沒有任何引數或者引數不是 redhat 或者 fedora時,其錯誤輸出產生以下資訊: /root/foo.sh redhat|fedora
1)編寫指令碼程式碼# vim /root/foo.sh
#!/bin/bash
if [ "$1" == "redhat" ]
then
echo "fedora"
elif [ "$1" == "fedora" ]
then
echo "redhat"
else
echo "/root/foo.sh redhat|fedora" >&2
fi
另一種寫法:
if [ $# == 0 ];then
echo '/root/foo.sh redhat |fedora' >&2 #為了對錯誤輸出進行收集,可通過2>file檢視
elif [ $1 == redhat ];then
echo fedora
elif [ $1 == fedora ];then
echo redhat
else
echo '/root/foo.sh redhat |fedora' >&2
fi
2)新增x執行許可權# chmod +x /root/foo.sh
3) 測試提供正確引數的情況 # /root/foo.sh redhat
測試提供非預期引數的情況# /root/foo.sh ubuntu
測試不提供引數的情況 # /root/foo.sh
###############################################################################
列表式迴圈——給定一批物件,反覆執行類似的操作(如購票者==>售票)
for迴圈處理
遍歷/列表式迴圈:根據變數的不同取值,重複執行xx處理
列表式for迴圈結構:
for 變數名 in 值1 值2 值3 .. .. (變數名一般習慣用i)
do
命令序列($變數名)
done
造數:{1..50} 例:touch {01..10}.txt
#!/bin/bash
for i in {1..10}
do
useradd stu$i
echo 123456 | passwd --stdin stu$i &> /dev/null
echo stu$i建立成功
id test$a
done
示例:編寫一個批量新增使用者指令碼,此指令碼要求提供使用者名稱列表檔案作為引數,列表測試檔案:http://classroom/pub/materials/userlist。如果沒有提供引數,此指令碼應該給出提示 Usage: /root/batchusers,退出並返回相應值;如果提供一個不存在的檔案,此指令碼應該給出提示 Input file not found,退出並返回相應值
1)編寫指令碼程式碼# vim /root/batchusers
#!/bin/bash
if [ $# -eq 0 ] ; then //判斷位置變數為0個
echo ‘Usage: /root/batchusers’ >&2 //將正確資訊變成錯誤資訊
exit 1 //退出返回值為1
fi
if [ ! -f $1 ] ; then //文字不存在為真
echo ‘Input file not found’ >&2 //將正確資訊變成錯誤資訊
exit 2 //退出返回值為2
fi
for name in $(cat $1)//$1為檔案,cat $1可以顯示為文字引數,$()傳遞引數
do
useradd -s /bin/false $name
done
2)新增x執行許可權# chmod +x /root/batchusers
3)測試batchusers批量新增使用者指令碼
下載使用者列表測試檔案:
# wget http://classroom/pub/materials/userlist -O /root/userlist
# cat /root/userlist //檢查下載檔案
實現批量新增使用者:# /root/batchusers /root/userlist
# id duanwu
測試其他異常處理:
# /root/batchusers //未提供列表檔案, Usage: /root/batchusers <userfile> # echo $? //返回1
# /root/batchusers /root/userlist.txt //提供的列表檔案找不到,Input file not found
# echo $? //返回2
###############################################################################
根據輸入成績的分數 輸出不同的提示資訊
把指定的檔案備份到指定的目錄下
判斷使用者從鍵盤輸入的資料是偶數還是奇數?
計算使用者輸入1-10之間的任意一個數的平方值,不輸入數字的時候給出錯誤提示資訊。
+++++++++++++++++++++++++++++++++
造數:{1..10}、 seq 5 、 seq 5 10
[[email protected] ~]# cat zaoshu.sh
#!/bin/bash
for i in `seq 10000`
do
touch /tmp/$i.txt
done
###############################################################################
迴圈結構
在Shell指令碼應用中,常見的for迴圈採用遍歷式、列表式的執行流程,通過指定變數從值列表中迴圈賦值,每次複製後執行固定的一組操作。
for迴圈的語法(格式1)
for 變數名 in 值列表
do
命令序列
done
示例:批量新增使用者帳號(名稱沒有規律)
素材:/root/users.txt
編寫指令碼:
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
useradd $UNAME 2>/var/err/log
echo "123456" | passwd --stdin $UNAME > /dev/null
done
# chmod +x uaddfor.sh
# ./uaddfor.sh
示例:使用迴圈ping測試網路中所有主機
#!/bin/bash
net=192.168.4.
for i in `seq 1 254` #反引號 //{1..254}
do
ping -c 3 -i 0.2 -w 0.2 $net$i &>/dev/null
if [ $? -eq 0 ];then
echo "該主機$net$i,ping通"
else
echo "該主機$net$i,無法ping通"
fi
done
C語言風格的for迴圈(格式2)
通過變數控制,條件成立時迴圈;步長可控次數
for ((初值;條件;步長控制))
do
命令序列
done
示例:#!/bin/bash
for ((i=1;i<=5;i+=2)) //或for ((i=1;i<=5;i++))
do
echo $i
done
示例:製作9*9乘法表
#!/bin/bash
for ((i=1;i<=9;i++))
do
for ((j=1;j<=$i;j++))
do
echo -n "$i*$j=$((i*j))"
done
echo
done
++++++++++++++++++++++++
字型色:echo -e "\033[34mOK\033[0m"
背景色:echo -e "\033[44mOK\033[0m"
for 第一個人 in 張三 李四 王五 .. ..
do
為第一個人採血
done
for 第一個人 in $(cat 使用者列表檔案)
do
為第一個人採血
done
for 第一個人 in $(cat $1)
do
為第一個人採血
done
for NAME in $(cat $1)
do
useradd -s /bin/false $NAME
done
+++++++++++++++++++++++++++++++++
while迴圈格式
——條件式迴圈:反覆測試條件,只要成立就執行命令序列
while迴圈屬於條件式的執行流程,會反覆判斷指定的測試條件,只要條件成立即執行固定的一組操作,直到條件變化為不成立為止。所以while迴圈的條件一般通過變數來進行控制,在迴圈體內對變數值做相應改變,以便在適當的時候退出,避免陷入死迴圈。
while 條件測試
do
命令序列
done
for迴圈的迴圈次數根據值列表而固定,而while迴圈的迴圈次數不固定
+++++++++++++++++++++++++++++++++
示例:批量新增使用者(名稱有規律)
#!/bin/bash
PREFIX=”stu”; i=1 //定義使用者名稱字首
while [ $i -le 20 ]
do
useradd ${PREFIX}$i //新增的使用者名稱為:字首+編號
echo “123456” | passwd --stdin ${PREFIX}$i &> /dev/null
let i++ //遞增控制,避免死迴圈
done
# chmod +x uaddwhile.sh
# ./uaddwhile.sh
# grep ^stu /etc/passwd //檢查新增的使用者
批量刪除使用者賬號udelwhile.sh
將上一示例的命令改為
userdel -r ${PREFIX}$i &> /dev/null
let i++
# grep ^stu /etc/passwd //再檢查已無相應賬號資訊
示例:檢測192.168.4.0/24網段,列出不線上的主機地址
#!/bin/bash
NET="192.168.4." ; i=1
while [ $i -le 254 ]
do
IP="${NET}$i"
ping -c 3 -i 0.2 -W 1 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
let i++
done
示例:猜數字
#!/bin/bash
#這是一個猜數字的遊戲
biggest=10 #(代表取資料的最大值)
guess=0 #(玩家輸入的數字)
guesses=0 #(輸入數字的次數)
number=$(($$ % $biggest)) #random number, between 1 and $biggest,$$代表當前指令碼執行的PID,可以當作以一個隨機數
while [ $guess -ne $number ]
do
echo -n "Guess?" ; read guess
if [ $guess -lt $number ];then
echo "...猜小了!"
elif [ $guess -gt $number ];then
echo "...猜大了!"
fi
guesses=$(($guesses + 1))
done
echo "猜對了!!!Guessed $number in $guesses guesses."
exit 0
#echo -n 迴避換行
#guess=0,定義一個變數,這裡存在bug,如果guess取值為0,會出錯
+++++++++++++++++++++++++++++
死迴圈
while : while True
do do
命令 命令
done done
+++++++++++++++++++++++++++++
示例:猜數字
#!/bin/bash
num=$[RANDOM%100+1] ;i=0
while :
do
read -p "請輸入一個數字,範圍為[1-100]:" guess
let i++
if [ $guess -eq $num ];then
echo “蒙對了,猜了$i次”
exit
elif [ $guess -gt $num ];then
echo “蒙大了”
else
echo “蒙小了”
fi
done
示例:點名器,螢幕隨機刷人名(1-n行數)
#!/bin/bash
user=/root/users.txt
while :
do
clear
line=`cat $user |wc -l`
num=$[RANDOM%$line+1]
head -$num $user |tail -1
sleep 0.2
done
命令中可以加上sleep 0.2 ,這樣會使cpu的使用不致過高
示例:寫個指令碼,螢幕提示如下
1.檢視IP
2.檢視記憶體
3.檢視CPU資訊
4.檢視硬碟
5.退出
請輸入您的選項[1-5]: abc
#!/bin/bash
while :
do
clear
echo -e "\033[34m 選單\033[0m"
echo "1.檢視IP
2.檢視CPU
3.檢視磁碟
4.檢視記憶體
5.退出"
read -p "請輸入選項[1-5]:" i
if [ $i -eq 1 ];then
ifconfig eth0 |grep "inet"
read -p "按回車鍵繼續..."
elif [ $i -eq 2 ];then
cat /proc/cpuinfo |grep vendor
cat /proc/cpuinfo |grep MH
cat /proc/cpuinfo |grep cache
read -p "按回車鍵繼續..."
elif [ $i -eq 3 ];then
df -h
read -p "按回車鍵繼續..."
elif [ $i -eq 4 ];then
free
read -p "按回車鍵繼續..."
elif [ $i -eq 5 ];then
exit
else
read -p "請輸入選項[1-5]:" i
fi
done
+++++++++++++++++++++++++++
case語句(簡化版if)
——檢查變數的實際取值相匹配,則執行對應的操作
case分支屬於匹配執行的方式,它針對指定的變數預先設定一個可能的取值,判斷該變數的實際取值是否與預設的某一個值相匹配,如果匹配上了,就執行相應的一組操作,如果沒有任何值能夠匹配,就執行預先設定的預設操作。
case 變數值 in
模式1)
命令序列1 ;;
模式2)
命令序列2 ;;
*)
預設命令序列
esac
示例:當用戶輸入引數redhat(fefora),則返回fefora(redaht),其他則提示用法
#!/bin/bash
if [ $1 == "redhat" ];then //$1為指令碼執行時的第一個引數
echo "fedora"
elif [ $1 == "fedora" ];then
echo "redhat"
else
echo "用法: $0 {redhat|fedora}"
fi
或者
#!/bin/bash
case $1 in
redhat)
echo "fedora";;
fedora)
echo "redhat";;
*) //預設輸出指令碼用法
echo "用法: $0 {redhat|fedora}"
esac
示例:判斷使用者輸入的是數字、字母、標點符號(擊鍵型別)
#!/bin/bash
read -p "輸入字元:" key
case $key in
[0-9])
echo 數字;;
[a-Z])
echo "字母";;
*)
echo "空格、功能鍵或其他控制字元"
esac
++++++++++++++++++++++++++++
編寫Apache啟動指令碼:
#yum -y install httpd
#vim test.sh
#!/bin/bash
case $1 in
start)
/usr/sbin/httpd
echo "我已經啟動了";;
stop)
kill `cat /var/run/httpd/httpd.pid`;; #反引號
restart)
kill `cat /var/run/httpd/httpd.pid`
sleep 1
/usr/sbin/httpd;;
status)
if [ -f /var/run/httpd/httpd.pid ];then
echo "httpd is 在執行..."
else
echo "沒有running"
fi;;
*)
echo "用法是$0 {start|stop|restart|status}"
esac
++++++++++++++++++++++++++++++
給Apache啟動指令碼新增開機啟動功能:
#vim test.sh
#!/bin/bash
#chkconfig: - 88 90
case $1 in
start)
/usr/sbin/httpd
echo "我已經啟動了";;
stop)
kill `cat /var/run/httpd/httpd.pid`;; #反引號
restart)
kill `cat /var/run/httpd/httpd.pid`
sleep 1
/usr/sbin/httpd;;
status)
if [ -f /var/run/httpd/httpd.pid ];then
echo "httpd is 在執行..."
else
echo "沒有running"
fi;;
*)
echo "用法是$0 {start|stop|restart|status}"
esac
++++++++++++++++++++++++++++++
#vim myhttp給啟動指令碼新增一行註釋
#chkconfig: - 88 90
#chkconfig --add myhttpd
#chkconfig --list myhttpd
#chkconfig myhttpd on
#chkconfig myhttpd off
++++++++++++++++++++++++++++++++
相關推薦
Shell版本迴圈語句(if//for/while/case)
if選擇結構 if單分支處理:當“條件成立”時執行命令序列xx,否則,不執行任何操作(只判斷為真) if [條件測試] ; then 命令序列xx fi 示例:檢測/media/cdrom目錄,若不存在則建立 #!/bin/bash
shell指令碼---迴圈語句(for,while,until)
1、for迴圈 基本格式: for 變數 in 列表 do command1 command2 … commandN done 示例1: 示例2: 示例3: 2、while迴圈—滿足條件執行 基本格式: while 條件 do command done 示例1: 示例2: 3、un
選擇 | 迴圈 | 語句(if,if……else,switch,while,for)的理解和使用
一、選擇結構語句 選擇結構語句,字面上理解既然含有選擇,就一定得有相應供其選擇的條件才行。 例如現實世界中我們開車遇到紅綠燈會知道紅燈停,綠燈行,Java中也是如此,有些程式碼必須滿足條件才能被執行。 對一些條件進行判斷,從而來確定執行哪些程式碼的語句,就
awk 控制語句(if for do while)
在linux awk的 while、do-while和for語句中允許使用break,continue語句來控制流程走向,也允許使用exit這樣的語句來退出。break中斷當前正在執行的迴圈並跳到迴圈外執行下一條語句。if 是流程選擇用法。 awk中,流程控制語句,語法結
條件語句詳解if,for,while,case,until,shift
if語句 單分支 if 判斷條件;then 條件為真的分支程式碼 fi 雙分支 if 判斷條件; then 條件為真的分支程式碼 else 條件為假的分支程式碼 fi 多分支 if 判斷條件1; then 條件1為真的分支程式碼 elif 判斷條件2; then
shell的基本語句(for迴圈,while迴圈,巢狀迴圈,if 的多重迴圈,case語句)
1.for迴圈(遍歷) for 條件 do 動作 done 練習1:檢測當前172.25.254網段主機的狀態 [[email protected] mnt]# vim test.sh 1 #!/bin/bash 2 for ((IP=1;IP<=10
python筆記5-控制流條件語句和迴圈、遍歷語句(if,for,while)
1.條件語句 語法:if 條件表示式:程式碼塊 elif 條件表示式:程式碼塊 else:程式碼塊 if語句的特點,關鍵字if 滿足條件才執行下面的程式碼塊或者elif模組; 必須是以if開頭,可以沒有elif或者else,但不能沒有if
Python入門筆記—第二章(分支迴圈 if,for,while)
第二章:分支迴圈 1.三大結構 順序(語句一條一條執行下去,則為順序,此處略過) 分支 迴圈 注:Python中沒有switch-case語句 2.分支—if 2.1 if age = 19 if age > 19:
c學習筆記--4 迴圈控制語句 if for while do
好久之前的了,學習c語言的筆記。 依舊是老套路,從基礎的變數型別,到函式定義一步步學起 #include <stdio.h> #include <string.h> //控制語句 這個在不同語言裡幾乎都不變 void test5() {
linux shell 語言基礎(2)流程控制(if while for until case)
一、if 條件語句 方式一: if [ 條件 ] 或 if [ 條件 ];then then &n
Java程式設計_迴圈語句(while語句、do-while語句和for語句)
迴圈語句 迴圈語句在程式設計中用來描述有規則重複的流程。在實際的程式中,存在很多需要重複執行的流程,為了簡化這些重複的執行流程,在程式設計語言中新增了該類語句。 在學習迴圈語句時,最重要的就是發現流程的規律,然後再用程式設計語言將該規律描述出來,從來實
Java 筆記 之 流程控制語句( if & switch & for & while)
概述 在一個程式執行的過程中,各條語句的執行順序對程式的結果是有直接影響的。也就是說程式的流程對執行結果有直接的影響。所以,我們必須清楚每條語句的執行流程。而且,很多時候我們要通過控制語句的執行順序來實現我們要完成的功能。 分類 順序結構
Shell腳本應用(if語句的結構)
返回值 測試 執行 數值 表達 邏輯 下一個 否則 語句 1、測試:檢測表達式是否成立,成立則返回值為0,否則為非0方法:1)test 表達式2)【 表達式 】2、文件測試:-d:是否為目錄-f:是否為文件-e:是否存在-r:是否有讀取權限-w:是否有寫入權限-x:是否有
Python語法之選擇和迴圈(if、while)
前言:在程式開發中,一共有三種流程方式: 順序:從上向下,順序執行程式碼 分支:根據條件判斷,決定執行程式碼的分支 迴圈:讓特定程式碼重複執行(解決程式設計師重複工作) 1.判斷的定義: 如果條件滿足,才能做某件事 如果條件不滿足,就做另外一件事情,或者什麼也不做 正是有了判斷,才使得程式世界豐富多彩,充滿
以猜數字遊戲為例理解C語言while迴圈語句和if條件
迴圈語句和條件語句是程式語言的基礎, 而while迴圈語句與if條件語句是條件語句和迴圈語句的基礎. 因此我們在學習C語言的開始要好好學習與認真思考著兩個語句. 本次將藉助簡單的猜數字遊戲開幫助大家理解. 首先我們會讓系統隨機獲得一個數字,然後讓玩家輸入一個數字,系統會提醒是"高了"
迴圈語句中的 do~while語句 for語句 的練習
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http:/
Python控制結構(If、While、For)
Python控制結構 Python控制結構 條件分支 if語句 迴圈 while迴圈 for 迴圈
Python While迴圈語句(二)
好啦,咋們來了,繼續吧。 本章學習點: while else break 與 continue 上節小作業(模仿銀行輸入的密碼出錯3次,而鎖定賬戶(三次重新輸入密碼的機會)) 一. While else 組合 在我們上節已經說過了whi
for迴圈語句(階乘運算)
#include<stdio.h> main() { int i,j,n; long term, sum=0; printf("Input n:"); while(scanf("%d",&n)!=EOF){
shell條件巢狀(if條件語句)
if condition then command1 command2 ... commandN fi 當然,也可以寫成一行(適用於終端命令提示符),像這樣: if test $[2*3] -eq $[1+5]; then echo 'The two numbers are