天天看點

shell——循環語句(for循環、while循環、until循環)一、使用for循環語句二、使用while循環語句三、雙重循環四、使用until循環語句

循環語句

  • 一、使用for循環語句
    • 1.1 for語句結構
    • 實驗:
      • 1、輸出10個數
      • 2、批量添加使用者,使用者名存放在users.txt檔案中,每行一個,初始密碼為123456,驗證腳本
      • 3、根據ip位址檢查主機狀态,ip位址存放在ipadds.txt檔案中,每行一個,使用ping指令檢測各主機的連通性
      • 4、1到100的偶數和
      • 5、1到100的奇數和
  • 二、使用while循環語句
    • 實驗
      • 1、輸出1到20的數
      • 2、添加使用者,使用者名以stu開頭,按數字編号
      • 2、輸出不能被三整除的數
  • 三、雙重循環
      • 1、九九乘法表
      • 2、直角三角形
      • 3、等腰三角形
  • 四、使用until循環語句
    • 實驗
      • 1、計算1~50的和值
      • 2、為指定使用者發送線上消息

一、使用for循環語句

1.1 for語句結構

讀取不同的變量值,用來逐個執行同一組指令

for語句結構

for 變量名 in 取值清單
do
 指令序列
done
           
shell——循環語句(for循環、while循環、until循環)一、使用for循環語句二、使用while循環語句三、雙重循環四、使用until循環語句

++ 自身變量+1

– 自身變量-1

+=5 自身變量+5

-=5 自身變量-5

*=5 自身變量*5

/=5 自身變量/5

%=5 自身變量%5

Let sum+=$1 兩個用法一樣 ((sum+=$1))

$()與``都是運算,指令替換

${}跟變量

$[]與(())整數運算

[]判斷

實驗:

1、輸出10個數

#!/bin/bash
for ((i=1;i<=10;))
do
  echo $i
  let i++
done
           

#!/bin/bash
for ((;;))
do
  if [ $i -le 10 ];then 
  echo $i
  let i++
  else
     break  //退出目前循環
  fi 
done
           
#!/bin/bash
for ((;;))
do
 if [ $i -le 10 ];then 
  echo $i
  let i++
  else
  exit 0/1  //退出應用程式      0正常退出,1異常退出,傳回的狀态值
  fi 
done

echo $?
           

2、批量添加使用者,使用者名存放在users.txt檔案中,每行一個,初始密碼為123456,驗證腳本

#!/bin/bash
list=$(cat /opt/users.txt)  //定義集合
for user in $list   //周遊建立使用者
do
    useradd $user      //添加使用者
    echo "123456" | passwd --stdin $user
    echo "建立$user成功"
done   
           

3、根據ip位址檢查主機狀态,ip位址存放在ipadds.txt檔案中,每行一個,使用ping指令檢測各主機的連通性

#!/bin/bash
list=$(cat /opt/ipaddr.txt)
for IP in $list
do
  ping -c 3 -i 0.2 -W 3 $IP > /dev/null
  if [ $i -eq 0 ];then
    echo "${IP} is up"
  else
    echo "${IP} is down"
  fi
done
echo “最終i的值是:$i”
           

4、1到100的偶數和

#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do 
if [ `expr $i % 2` -eq 0 ];then
 let sum=$sum+$i
fi
done
echo "$sum"
或
#!/bin/bash
sum=0
for ((i=0;i<=100;i+=2))
do
 let sum+=$i
done
echo "$sum"
           

5、1到100的奇數和

#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do 
if [ `expr $i % 2` -eq 1 ];then
 let sum+=$i(或者let sum=$sum+$i)
fi
done
echo "$sum"
或者
#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
 let sum+=$i
done
echo "$sum"
           

二、使用while循環語句

重複測試某個條件,隻要條件成立則反複執行

while語句結構

while 條件測試操作
do
	指令序列
done
           
shell——循環語句(for循環、while循環、until循環)一、使用for循環語句二、使用while循環語句三、雙重循環四、使用until循環語句

break 退出本層循環

continue 跳過continue以下語句直接進入下一次循環

實驗

1、輸出1到20的數

#!/bin/bash
while [ $i -le 20 ]
do
    echo $i
    let i++
done 
           

2、添加使用者,使用者名以stu開頭,按數字編号

一共添加20個使用者,stu1,stu2…stu20

初始密碼123456

#!/bin/bash
name="stu"
i=1
while [ $i -le 20 ]
do
useradd ${name}${i}
echo "123456" | passwd --stdin ${name}${i}
let i++
done 
           

2、輸出不能被三整除的數

#!/bin/bash
i=1
while [ $i - le 100 ]
do 
 if [ `expr $i % 3`  != 0 ];then
 echo $i
 fi
let i++
done
           

三、雙重循環

外層循環執行一次,内層循環執行一遍

1、九九乘法表

#!/bin/shell
for ((i=1;i<=9;i++))
do
    for((j=1;j<=i;j++))
    do
      echo  -n  "$i*$j= `echo $(($i*$j))` "
    done
    echo " "
don
           

2、直角三角形

#!/bin/bash
read -p "Please input the length: " len
for i in `seq 1 $len`
do
    for((j=1;j<=$i;j++))
    do
       echo -n "* "
      done
    echo
done
           
shell——循環語句(for循環、while循環、until循環)一、使用for循環語句二、使用while循環語句三、雙重循環四、使用until循環語句

3、等腰三角形

#!/bin/bash
for ((i=1;i<=5;i++))
do
  for ((j=5;j>=i;j--))  //倒直角三角形
  do
     echo -n " "
  done
  for((k=1;k<=2*i-1;k++)) //等腰三角形
  do
     echo -n "*"
  done
  echo ""
done
           
shell——循環語句(for循環、while循環、until循環)一、使用for循環語句二、使用while循環語句三、雙重循環四、使用until循環語句

四、使用until循環語句

重複測試某個條件,隻要條件不成立則反複執行

until 條件測試操作
do
   指令序列
done
           
shell——循環語句(for循環、while循環、until循環)一、使用for循環語句二、使用while循環語句三、雙重循環四、使用until循環語句

實驗

1、計算1~50的和值

#!/bin/bash
i=1
until [ $i -eq 51 ]
do 
    echo $i
    sum=$sum+$i
    let i++
done
echo $sum
           

2、為指定使用者發送線上消息

若使用者不線上,則每10分鐘試一次,直至使用者登入系統後在發送資訊

使用者名與消息通過位置參數傳遞給腳本

1:位置參數個數大于1
2:姓名屬于系統使用者 /etc/passwd
3:使用者是否線上 until who 
4:發送消息echo “消息” | write 使用者名
#!/bin/bash
username=$1
#格式參數不能為空
if [ $# -lt 1 ];then
    echo "Usage:`basename $0` <username> [<message>]"
    exit 1
fi
#驗證是否屬于系統使用者
if grep "^$username" /etc/passwd > /dev/null;then :
else
    echo "not user"
    exit 2
fi
#測試使用者是否線上,如果不線上,每5s聯系一次
until who | grep "$username" > /dev/null;do
    echo "user not login"
    sleep 5
done
#發送消息
echo "$2" | write "$username"
echo "${username}發送成功"