1. 程式人生 > >shell中的for迴圈用法詳解

shell中的for迴圈用法詳解

for 命令:
for i in 的各種用法 :

  • for i in “file1” “file2” “file3”
  • for i in /boot/*
  • for i in /etc/*.conf
  • for i in $(seq -w 10) –》等寬的01-10
  • for i in {1..10}
  • for i in $( ls )
  • for I in $(< file)
  • for i in “[email protected]” –》取所有位置引數,可簡寫為for i
    注意:bash shell支援C式for迴圈
#!/bin/bash
j=$1
for ((i=1; i<=j; i++))
do
touch file$i && echo file $i is ok done

複習

  • [email protected]: 所有位置變數的內容
  • $#: 位置變數的個數
  • $0: 檔名
  • $*: 所有位置變數的內容

編寫指令碼應該注意的事項:

  1. 開頭指定使用什麼shell,例如:bash,ksh,csh等
  2. 指令碼功能描述,使用方法,作者,版本,日期等
  3. 變數名,函式名要有實際意義,函式名以動名詞形式,第二個單詞首字母要大寫。例如:updateConfig()
  4. 縮排統一用4個空格,不用TAB
  5. 取變數值使用大括號,如${varname}
  6. 刪除檔案時,如果路徑有變數的,要判斷變數有值,如rm -f ${abc}/*
    如果變數abc沒有值,則會把根目錄下的檔案刪除
  7. 指令碼中儘量不要使用cd變換目錄
  8. 函式中也要有功能描述,使用依法,版本,日期等
  9. 函式的功能要單一,不要太複雜
  10. $()比` `更好
  11. 儘量不要使用多層if語句,而應該以case語句替代
  12. 如果需要執行確定次數的迴圈,應該用for語句替代while語句
  13. 輸入的引數要有正確性判斷
  14. 多加註釋,方便自己或他人閱讀。

練習1:編寫指令碼清空所有arp快取記錄:

#!/bin/bash
for i in $(arp | tail -n +2|tr -s ' ' |cut -d' ' -f1)
do
    arp -d $i
done

練習2:產生十個隨機數:
方法1:

#for i in {0..9
};do echo $RANDOM;done

方法2:

#for i in $(seq 10);do echo $RANDOM;done

練習3:倒數五秒:

#!/bin/bash
echo "準備倒數5秒:"
for i in $(seq 5 -1 1)
do
    echo -en "$i";sleep 1
done
echo -e "開始"

方法2:

#!/bin/bash
echo "準備倒數5秒:"
for i in $(seq 5 -1 1)
do
    echo -en "\b$i";sleep 1
done
echo -e "\b開始"

練習4:批量新增使用者:

#!/bin/bash
for i in $(cat /root/users.txt)        --》從列表檔案讀取檔名
do
    useradd $i
    echo "123456" | passwd --stdin $i --》通過管道指定密碼字串
done

練習:
查找出uid大於10000的使用者,然後刪除,必須使用for迴圈。

#/bin/bash
u_uid=(`cat /etc/passwd | awk -F: '{print $3}'`)
u_name=(`cat /etc/passwd | awk -F: '{print $1}'`)
for i in  `seq ${#u_uid[@] }`
do
    if ((  ${u_uid[i-1]} > 10000  ))
    then
           userdel -r  ${u_name[i-1]}&&echo "${u_name[i-1]} delete ok"
    fi
done

方法2:用正則找出大於10000的使用者:

#cat /etc/passwd | egrep “1[0-9]{4} | [2-9]{5,}

例子:根據ip地址檢查網路中存活的主機ip。

這裡寫圖片描述

break語句:(跳出迴圈)

  • 在for、while、until等迴圈語句中,用於跳出當前所在的迴圈體,執行迴圈體後的語句

continue語句:(跳出本次迴圈)

  • 在for、while、until等迴圈語句中,用於跳出迴圈體內餘下的語句,重新判斷條件以便執行下一次迴圈。

練習:使用for迴圈實現批量新增使用者

#!/bin/bash
for i in $(cat /root/users.txt) --》從列表檔案讀取檔名
do   
    useradd $i
    echo123456”| passwd $i --stdin   --》通過管道指定密碼UNAME
done

(ps:判斷使用者是否存在:id命令)

位置變數

  • 位置變數:$n ,但是大於9的位置引數要用{}括起來:${10}
  • 位置變數的作用:其實就是傳遞引數到腳本里
  • $0 –》代表的是指令碼自己的名字

(位置變數的最常用用法:bash 1.sh 變數1 變數2…)

預定義變數:

  • $#:命令列中位置變數的個數
  • $*:所有位置變數的內容(較少使用)
  • [email protected]:所有位置變數的內容
  • $0:當前執行的程序/程式名
  • $$ :當前shell的PID值, echo $$; ps $$, 常用作臨時變數的字尾
  • $?:上一條命令執行後返回的狀態,當返回狀態值為0時表示執行正常,非0值表示執行異常或出錯
  • $RANDOM :隨機數,可以作為臨時檔名

例:輸出0-9以內的隨機數–》echo $((RANDOM%10))
輸出1-10以內的隨機數–》echo $((RANDOM%10+1))

  • !$:代表上一條命令的引數
  • !!:執行上一條命令

練習: 輸出
$1 is aa,
$2 is bb,
$3 is cc,
$4 is dd,
$5 is ee
答案:

#!/bin/bash

echo "there are $# arguments in this scripts"
N=1  --》變數N用來計數  
for i in [email protected]
do
    echo "\$$N is $i"
    ((N++))
done

PS:
ping 命令

  • -c 1 —》只ping一次。
  • -i 0.2–》第一個包和第二個包之間間隔0.2s
  • -w 2 –》只等待2s

例:
ping 172.30.132.123 &>/dev/null
重定向對於ping命令無用,執行成功$?就返回0,不成功則返回1

根據IP地址檢查網路中存活的主機IP(大範圍的掃描)

#!/bin/bash
for r in 192.168.1.{1..254}
do
    ping -c1 -w1 "${ip}" &>/dev/null
done
arp -n|grep ether|tr -s ' '|cut -d' ' -f1

關於ping命令的一個最經典的指令碼:

for i in {1..193}
do
    ( ping -c1 -i0.2 -w1 172.16.30.$i &>/dev/null
    if ((  $?==0  ))
    then
            echo "172.16.30.$i up"    >>2.txt
    else
            echo "172.16.30.$i down"    >>3.txt
    fi )&    --》這樣就把這一段放到後臺去執行了,大大加快了速度。
done
sleep 2
live_pc_num=`cat 2.txt|wc -l`
down_pc_num=`cat 3.txt|wc -l`
echo "there are $down_pc_num is down"
echo "there are $live_pc_num is up"
echo "list:"
cat 2.txt
rm -rf 2.txt 3.txt

break語句

典型的while迴圈:

#!/bin/bash
i=1
while :    --》:等價為true
do
        echo "$i"
        ((i++))
        sleep 0.3
done
注:這是個死迴圈,會一直執行下去

加上break,可以跳出迴圈

#!/bin/bash
i=1
while :
do
        echo "$i"
        ((  i++  ))
        if ((   i==20000  ))  --》輸出的只有1-19999
        then
                break
        fi
done

小結

  • break:跳出整個迴圈
  • exit:跳出指令碼
  • continue:跳出本次迴圈,接著執行下一次迴圈

案例練習9:
批量新增使用者並且滿足以下要求:

這裡寫圖片描述

答案:

#!/bin/bash
read -p "請輸入使用者名稱的字首:" a 
read -p "請輸入使用者的數目:" num
if (( $num<=10 ))
then
        n=0
        for i in `seq $num`
        do
               if useradd $a$i &>/dev/null
                then
                        echo "使用者$a$i建立成功!"
                        (( n++ ))
                        echo "123456"|passwd $a$i --stdin &>/dev/null
                fi
        done
        echo "一共建立的使用者數:$n個"
else
        echo "最多隻能建立10個使用者啦!"
fi

相關推薦

shellfor迴圈用法

for 命令: for i in 的各種用法 : for i in “file1” “file2” “file3” for i in /boot/* for i in /etc/*.conf for i in $(seq -w 10)

Windows bat指令碼——for迴圈用法(一)

Windows bat指令碼的for語句基本形態如下:在cmd視窗中:for %I in (command1) do command2 在批處理檔案中:for %%I in (command1) do command2之所以要區分cmd視窗和批處理檔案兩種環境,是因為在這兩

深入瞭解JavaScript For迴圈

轉載地址:https://segmentfault.com/a/1190000017569850 尊重原創 正文: ​ 在程式碼示例中我會用到es6中的語言,如果你還不是很瞭解,你可以看看阮老師的es6.(= =我也是一點一點跟著看的。) 1.map ​ 先說一下最常用的map.利用ma

Delphifor迴圈本質

num := 0; count := 5; for i:=0 to count do begin     num := num + 1;     if count <10 then         count := count + 1; end; 如上例所示

JavaScriptreturn的用法

style 返回 www log tle blog 意思 charset fun 1、定義:return 從字面上的看就是返回,官方定義return語句將終止當前函數並返回當前函數的值,可以看下下面的示例代碼: <!DOCTYPE html><html l

java的instanceof用法

定義 xtend print 繼承 interface 參數 保留 如果 ack   instanceof是Java的一個二元操作符(運算符),也是Java的保留關鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回的是boolean類型的數據。用它來判斷某個對象是否是

linux bash shellfor用法and示例

bash shell腳本中for的用法關於linux bash shell中的for語句 在linux中shell是必不可少的一部分,但是在bash shell中有while,for,until等循環命令,今天就介紹一下關於for的一些用法。文中任何錯誤希望大佬們一一指出,不勝感激。bash sh

(轉)shelltest命令方法

目的 判斷字符串 演示 警告 gic 一個數 平臺 oracl 差異 test命令用法。功能:檢查文件和比較值 原文:https://www.cnblogs.com/guanyf/p/7553940.html    1)判斷表達式   if test (表達式為真)

C#HttpWebRequest的用法

網站 default 編碼方式 對數 c# toarray collect acc like 本文實例講述了C#中HttpWebRequest的用法。分享給大家供大家參考。具體如下: HttpWebRequest類主要利用HTTP 協議和服務器交互,通常是通過 GET 和

C++的map用法

時間 占用 sort函數 數組 例程 通道 組織 sso 查找 Map是 STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據 處理能力,由 於這個特性,它完成有可能在我們處理一對一數據的

【轉載】 c++static的用法

ostream 並不會 style 轉載 程序員 都是 note 每次 reference 出處: http://blog.csdn.net/majianfei1023/article/details/45290467 C 語言的 static 關鍵字有三種(具體來說是

mysql where in 用法

MySQL這裏分兩種情況來介紹 1、in 後面是記錄集,如: select * from table where uname in(select uname from user); 2、in 後面是字符串,如: select * from table where uname

linux 特殊符號用法

引號 zabbix 目錄 sele cond 特殊符號 zab set speed 星號(*) 當用於shell變量時, [root@zabbix_nuc ~]# sql=‘select * from mysql.user‘ [root@zabbix_nuc ~]# ech

C#string.format用法

個數 date 其中 位置 tr1 bsp 位數 數值 日期格式化 tring.Format 方法的幾種定義: String.Format (String, Object) 將指定的 String 中的格式項替換為指定的 Object 實例的值的文本等效項。String.F

DOS 批處理命令For迴圈命令

轉載:https://www.jb51.net/article/93171.htm for命令是一種對一系列物件依次迴圈執行同一個或多個命令的在命令列或批處理中執行的命令,結合一些Windows管理中的程式後,其處理功能強大、應用靈活方便程度令人刮目相看。但是,其幫助資訊也因此複雜往往令初學者望

linuxmariadb基本用法(企業級)

資料庫 表的每一個列名字的頭   叫做欄位 是高階的exel表格軟體 資料庫種類 sqlserver  sqllite  db2   oracle  > mysql   比較多   其中my

php 的closure用法

php 中的closure用法詳解 Closure,匿名函式,是php5.3的時候引入的,又稱為Anonymous functions。字面意思也就是沒有定義名字的函式。比如以

linux sed的用法

sed 是操作,過濾和轉換文字內容的強大工具,sed可以從檔案和管道中讀取輸入。 sed 命令語法 sed [ option ] {sed -commands} {input -file} -e :執行多個sed命令 -n :只顯示操作行 -i

c++static的用法

C 語言的 static 關鍵字有三種(具體來說是兩種)用途: 1. 靜態區域性變數:用於函式體內部修飾變數,這種變數的生存期長於該函式。 int foo(){ static int i = 1; // note:1 //int i = 1; // not

C語言for語句用法

在C語言中,for語句使用最為靈活,它完全可以取代 while 語句。它的一般形式為: for(表示式1; 表示式2; 表示式3) 語句 它的執行過程如下:先求解表示式1。 求解表示式2,若其值為真(非0),則執行for語句中指定的內嵌語句,然後執行下面第3)步;若其值