天天看點

shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

文章目錄

  • 一、循環語句
    • 1、for循環
      • 示例1、1~100求和
      • 示例 2、1~a,(a<=100)求和
      • 示例 3、1~100求奇偶數和
      • 示例 4、 過濾1~100 所有奇偶數
      • 示例 5、檢測指定範圍主機
      • 示例 6、篩選檔案
      • 示例 7、建立使用者
  • 二、while循環
      • 示例1、1~100求和
      • 示例 2、1~a,(a<=100)求和
      • 示例 3、1~100求奇偶數和
      • 示例 4、 過濾1~100 所有奇偶數
      • 示例 5、檢測指定範圍主機
      • 示例7、猜商品價格
  • 三、until循環語句
  • 四、結束循環----break和continue
  • 五、IFS字段分隔符
  • 六、轉義字元

一、循環語句

1、for循環

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

for 變量名 in 取值清單
do                   
   指令序列
done
           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例1、1~100求和

#!/bin/bash
sum=0
for i in {1..100}
do
    sum=$[$i+$sum]
done
  echo "0-100的和為:" $sum

#如果算的是1~100之間每隔兩位數的和,即{1、3、5、7、...、99},for循環如下: 
for i in {1..100..2}
#其他都是一樣的。

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

也可以使用 i++ 自加的方法:

shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 2、1~a,(a<=100)求和

#!/bin/bash
read -p "請輸入1~100任意一個數:" a
sum=0
for ((i=1;i<=$a;i++))
do
sum=$[ $sum+$i  ]
done        
echo "$sum" 
           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

驗證:

shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 3、1~100求奇偶數和

sum=0
sum1=0
for ((i=1;i<=100;i++))
 do
 a=$[ $i%2 ]
if [ $a = 0 ]
 then
 sum=$[ $sum+$i ]
 else sum1=$[ $sum1+$i  ]
fi
done
echo   "偶數和:"  
echo "$sum" 
echo   "奇數和: " 
echo "$sum1" 
           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

驗證:

shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 4、 過濾1~100 所有奇偶數

#!/bin/bash
echo -n  "偶數 "
for ((i=1;i<=100;i++))
do
 a=$[ $i%2 ]
if [ $a == 0 ]
 then       
 echo -n "$i,"
fi          
done        
echo -n  "奇數 "
for ((i=1;i<=100;i++))
do            
 a=$[ $i%2 ]
if [ $a == 1 ]
 then
 echo -n "$i,"
fi
done

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 5、檢測指定範圍主機

檢測指定範圍主機是否通信,并将通信主機IP輸出到檔案 host_ip.txt 中

touch host_ip.txt
for i in 192.168.1.{1..10}
do

ping -c 1 -i 0.2 -w 1 $i &>/dev/sull
if [ $? = 0  ]
then
echo  $i>>host_ip.txt
fi
done

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 6、篩選檔案

輸出/dev 目錄中所有的可執行檔案

# 篩選可執行檔案
for a in /dev/*
do
  [ -x "$a" ]
if [ $? = 0 ]
 then
 echo "$a"
fi
done

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

驗證:

示例 7、建立使用者

1) 批量添加使用者

使用者名以use開頭,按數字順序進行編号

一共1-20,添加20個使用者

初始密碼均設為123456

#!/bin/bash
i=1
for i in {1..20}
do 
useradd user$i
echo "123456" | passwd --stdin user$i 
i++     
done        
           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
  1. 執行腳本輸入使用者名,若該使用者存在,輸出提示該使用者已存在;若該使用者不存在,提示使用者輸入密碼,建立使用者并設立其密碼
#/bin/bash
a=`awk -F : '{ print $1 }' /etc/passwd`
for i in $a
do
  read -p "請輸入使用者名:" b
  if [ $b = $i ];then
    echo "該使用者已存在"
    exit    
  else      
    useradd $b  
    case $? in 
  0)          
     echo "你将建立此使用者"
     read -p "請輸入密碼:" c
     echo -e "$c\n$c\n" | passwd $b
   ;;
  *)
    esac
  exit
  fi
done

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

二、while循環

  • 根據特定條件反複執行一個指令序列,直到不滿足條件為止。
  • 編寫時可能會出現死循環,要避免這種情況發生
  • true(真)和false(假)為特殊條件測試操作,也可以在if語句的條件測試中使用。
  • true作為條件時,表示條件永遠成立,無限執行,也就是死循環,需要強制終止
  • false作為條件時,表示條件不成立,不執行指令序列
#while語句結構
while 條件測試操作
do
  指令序列
done
           

示例1、1~100求和

#!/bin/bash
#1~100 求和
i=1
sum=0
while [ $i -le 100 ]
 do
  sum=$[$sum+$i]
  let i++
 done
echo "1-100所有整數和:" $sum 

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

執行結果:

shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 2、1~a,(a<=100)求和

#!/bin/bash
#1~a 求和:
i=1
sum=0
read -p "請輸入:(1-100)" a
while [ $i -le $a ]
  do
  sum=$[$sum+$i]
  let i++
  done
echo "1-a所有整數和:" $sum

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

執行結果:

shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 3、1~100求奇偶數和

#!/bin/bash
# 奇偶數和:
sum1=0
sum2=0
i=1
while [ $i -le 100 ]
do
  a=$[$i%2]
  if [ $a = 0 ];then
  sum1=$[$sum1+$i]
  else
  sum2=$[$sum2+$i]
  fi
  let i++
done
echo "偶數和:$sum1"
echo "奇數和:$sum2"

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

驗證結果:

shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 4、 過濾1~100 所有奇偶數

#!/bin/bash
# 過濾1~100 奇偶數
i=1
echo "奇數:"
while
[ $i -lt 100 ]
do
a=$[ $i % 2 ]
if 
[ $a -eq 1 ]
then
echo    "$i " 
fi          
let i++     
done        
           

o=1           
echo "偶數:" 
while
[ $o -le 100 ]
do  
p=$[ $o % 2 ] 
if  
[ $p -eq 0 ]
then
echo   "$o "
fi  
let o++
done

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例 5、檢測指定範圍主機

#!/bin/bash
# 檢測指定範圍主機
i=1

while [ $i -le 254 ]
do


  ping -i 0.5 -c 1 -w 1 192.168.1.$i &>/dev/null
  if [ $? = 0 ]
  then
  echo "192.168.1.$i 線上">>host_ip.txt
  else
  echo "192.168.1.$i 不線上"
  fi
  let i++
done

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

示例7、猜商品價格

#!/bin/bash
#
a=$[$RANDOM % 1000]
i=0
b=0
while [ $b -eq 0 ]
do
  read -p "猜猜是哪個數,範圍在0~999:" shu
  let i++
  if [ $shu -eq $a ];then
          echo "祝賀你,猜了$i 次就猜中了。"
          let b++
  elif [ $shu -gt $a ];then
          echo "你猜大了"
  elif [ $shu -lt $a ];then
         echo "你猜小了"
  fi

done
echo "你總共猜了 $i 次"
~                            
           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

三、until循環語句

  • 與while相反,重複測試某個條件,隻要條件不成立則反複執行
#!/bin/bash
#
a=0
sum=0
until [ $a -gt 100 ]
do
  sum=$[$sum+$a]
  let a++
done
echo "1~100的和:$sum"

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

四、結束循環----break和continue

  • break跳出單個循環
#!/bin/bash
for ((a=1; a<=10; a++))
do
        echo "outer loop: $a"
        for ((b=1; b<=20; b++))
        do
                if [ $b -eq 5 ]
                then
                        break
                fi
                echo "inter loop: $b"
        done
done

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
  • continue中止某次循環中的指令,但不會完全中止整個指令
#!/bin/bash
for ((a=1; a<=15; a++))
do
	if [ $a -gt 5 ] && [ $a -lt 10 ]
	then
		continue
	fi
	echo "current value: $a"
done
           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

五、IFS字段分隔符

預設包含 空格,制表符,換行符
檢視指令:set | grep IFS
IFS=$' \t\n'

修改成隻換行
IFS=$'\n'

IFS=:
IFS=','

IFS.OLD=$IFS
IFS=$'\n'
...
IFS=$IFS.OLD

輸出環境變量PATH所包含的所有目錄以及其中的所有可執行檔案

           
shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元

六、轉義字元

echo -n 表示不換行輸出

echo -e 輸出轉義字元,将轉義後的内容輸出到螢幕上

常用的轉義字元如下:
\b 轉義後相當于按倒退鍵(backspace),但前提是"\b"後面存在字元;"\b"表示删除前一個字元,"\b\b"表示删除前兩個字元。

\c 不換行輸出,在"\c"後面不存在字元的情況下,作用相當于 echo -n; 但是當"\c"後面仍然存在字元時,"\c"後面的字元将不會被輸出。

\n 換行,被輸出的字元從"\n"處開始另起一行。

\f 換行,但是換行後的新行的開頭位置連接配接着上一行的行尾;

\v 與\f相同;

\t 轉以後表示插入tab,即橫向制表符;

\r 光标移至行首,但不換行,相當于使用"\r"以後的字元覆寫"\r"之前同等長度的字元;但是當"\r"後面不存在任何字元時,"\r"前面的字元不會被覆寫

\\ 表示插入"\"本身;

           

-n的示範:

shell腳本之循環語句和轉義字元一、循環語句二、while循環三、until循環語句四、結束循環----break和continue五、IFS字段分隔符六、轉義字元