日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux Shell编程之一循环结构

發布時間:2024/4/14 linux 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux Shell编程之一循环结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Shell編程學習之一

一、腳本的書寫和執行

????腳本第一行,頂格:#!/bin/bash

????其中 #!稱之為shebang,LinuxOS會的程序載入器會分析shebang后的內容,將這些內容作為解釋器的指令。常見的有:#!/bin/bash,#!/usr/bin/python等。

????以#開頭的行都是注釋的行,會被解釋器忽略。

????其他就是腳本的主要內容了,主要是由許多命令組成的。


????腳本語法檢查:bash -n 腳本名 ?例如:bash -n httpd

????執行: bash 腳本名 或者 給腳本x權限;寫出腳本的路徑執行?

????bash -n 單步執行,可以看到腳本執行過程中的每一步


二、shell腳本執行過程

????順序執行:從上到下依次執行

????選擇執行:根據測試條件執行,滿足某個測試條件是,執行對應的分支

????循環執行:將一段代碼反復執行多次。根據循環退出條件退出。


三、shell的變量類別

????本地變量,環境變量,局部變量,位置變量,特殊變量。這里可能位置變量和特殊變量使用較多一些。例如:S#(參數個數),$@ $*(參數列表)。具體代表的意義請參照http://guoting.blog.51cto.com/8886857/1433602里面所說明的。


四、循環語句

????常見的循環語句有for,while,until。循環的主要意義在于,重復執行近似的代碼,提高代碼利用率。

1)for循環:遍歷有限個元素列表


????for語句的語法格式:

????for VAR_NAME in LIST

????do

????????do something

????done

????退出條件:遍歷完LIST中的所有元素


如何生成數值列表

? ? 1、{start..end} 例如{100..120}代表初始值是100,步長是1,最大值是120的整數。

????2、命令引用 `seq [start [increment]] end`

????????seq 12 :表示初始值是1,步長是1,最大值是12的整數

????????seq 12,24?:表示初始值是12,步長是1,最大值是34的整數

????????seq 12,3,24?:表示初始值是12,步長是3,最大值是34的整數


生成列表的方式:

????1、手動給個列表:

????????for i in 1 2 3 4 5

????2、數值列表:

????????{start..end}

????????`seq [start [increment]] end`

????3、$*, $@ :調用腳本參數的列表

????4、命令生成列表 例如:`ls /path/to/where`

????

for的另一種格式,此種格式更接近C語言的for語句,格式如下:

????for(( 初始條件;測試條件;修改表達式));do

????????循環體

????done

例如:求1到100的整數之和

1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash #?description:sum?1..100 #?version:0.0.0 #?date:2014-07-14 #?author:?Alex #?license:?GPL let?sum=0 for?((i=0;$i?<=?100;i++));do ????let?sum+=$i done echo?$sum



bash如何實現算術運算:

? ? 1、定義整形變量的方法:

????????????let VAR_NAME=VALUE 例如: let sum=0

????????????declare -i VAR_NAME=VALUE 例如:declare -i sum=0

????注意:即使沒有定義為整型變量,字符型的數字依然可以參與算術運算;bash會執行變量類型的隱式類型轉換;

????2、實現算術運算的方式:

????????let VAR_NAME=ARITHMATIC_EXPRESSION

????????VAR_NAME=$[ARITHMATIC_EXRESSION]

????????VAR_NAME=$((EXPRESSION))

????????VAR_NAME=$(expr $num1 + $num2)

????例如:實現算術3+2

????????let sum=3+2

????????sum=$[3+2]

????????sum=$((3+2))

????????sum=$(expr 3 + 2) 注意:這里的空格

????3、常見的算術運算符

????? ? 一般的算術運算符:+ - * / % **(乘方)

?????????增強型的算術運算符:++ += *= /= %=?

????這些都是雙目運算符。 ??


練習:寫一個腳本,滿足以下要求:

1、創建用戶tuser501-tuser510;?

2、創建目錄/tmp/dir-當前日期時間;

3、在/tmp/dir-當前日期時間 目錄中創建9個空文件file101-file110

4、將file101的屬主改為tuser501,依次類推,一直將file110的屬主改為tuser510;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #!/bin/bash #?Name:tuser501-510.sh #?Description:?testing #?Version:?0.0.1 #?Author:?Alex #?Date:?2014-07-08 dir_name="/tmp/dir-`date?+%Y%m%d-%H%M%S`" /bin/mkdir?$dir_name for?num?in?{101..110};do ????/bin/touch?$dir_name/file$num ????user_num=$[$num+400] ????/usr/sbin/useradd?tuser$user_num?&>/dev/null ????/bin/chown?tuser$user_num?$dir_name/file$num done? echo?"The?result:" /bin/ls?-l??$dir_name??? [root@server?scripts]#?chmod?+x?tuser501-510.sh [root@server?scripts]#?bash?-n?tuser501-510.sh [root@server?scripts]#?./tuser501-510.sh The?result: total?0 -rw-r--r--?1?tuser501?root?0?Jul??9?11:33?file101 -rw-r--r--?1?tuser502?root?0?Jul??9?11:33?file102 -rw-r--r--?1?tuser503?root?0?Jul??9?11:33?file103 -rw-r--r--?1?tuser504?root?0?Jul??9?11:33?file104 -rw-r--r--?1?tuser505?root?0?Jul??9?11:33?file105 -rw-r--r--?1?tuser506?root?0?Jul??9?11:33?file106 -rw-r--r--?1?tuser507?root?0?Jul??9?11:33?file107 -rw-r--r--?1?tuser508?root?0?Jul??9?11:33?file108 -rw-r--r--?1?tuser509?root?0?Jul??9?11:33?file109 -rw-r--r--?1?tuser510?root?0?Jul??9?11:33?file110 [root@server?scripts]#

2)while,until語句

????while語句的語法格式:

????while 測試條件 ;do

????????循環體

????done

????until語句的語法格式:

????until 測試條件 ;do

????????循環體

????done

????while的執行過程是當測試條件為真,執行循環體語句,執行完成以后再判斷測試條件,直到測試條件為假的時候退出。until的執行過程與while執行過程類似,主要區別是測試條件為假的時候執行循環體,測試條件為真的時候退出循環體。

????while可以直接遍歷文件,這在我們以后寫腳本的過程中可能隨時會用到。

????????格式:

????????while read VAR_NAME ;do

????????????循環體

????????done < /path/to/somefile


練習:求100以內所有偶數整數之和

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #!/bin/bash #?description:?the?sum?even?of?1?to?100 #?version:0.0.1 #?date:2014-07-10 #?author:?Alex #定義求和存儲變量 declare?-i?sum=0 #定義計數器變量,一般whlie或者是until都會引入像計數器這種機制,這樣是為了更好的實現退出 let?count=0 while?[?$count?-le?100?];do???#循環測試條件 ????????let?rst=$count%2??????#判斷是否為偶數?也可以這樣?res=$[$count%2] ????????#如果是偶數,則求和。這是一種短路運算,等價于if語句 ????????#?if?[?$rst?-eq?0?];then ????????#????let?sum+=$count ????????#fi ????????[?$rst?-eq?0?]?&&?let?sum+=$count ????????let?count++??#實現計數 done #輸出求和結果 echo?"The?sum?is?$sum." ##until語句只需要將測試條件變為?[?$count?-gt?100?]?即可

練習:顯示磁盤使用超過10%的磁盤設備和具體使用率。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/bin/bash #?version:0.0.0 #?date:2014-07-14 #?author:?Alex #?license:?GPL df?|?sed?1d?>?/tmp/res.txt #df?|?grep?-v?"Use"?>?/tmp/res.txt echo?-e?"\033[31mDisk?Usage(Use?>?10%):\033[0m" while?read?loop?;do ????[?`echo?$loop?|?tr?-s?'?'|?cut?-d?'?'?-f5?|?tr?-d?'%'?|?grep?-v?"Use"`?-gt?10?]?&&?\ ????echo?$loop?|?tr?-s?'?'|?cut?-d?'?'?-f1,5?? done?<?/tmp/res.txt rm?-f?/tmp/res.txt #此腳本還有缺陷(像?df?命令的結果有時一個設備的信息分布在2行的情況下,此腳本還不能處理),目的是說明while是如何遍歷文件的。

????腳本執行結果:


補充:

????有時候我們需要執行一個死循環,這就要用到 true 和 : 命令。true 命令的作用是只返回命令狀態值 0 。與之對應的是 false,它的作用只返回命令狀態值 1。:命令的作用是什么都不干的命令。

????在循環中,有時可能會用到以下命令:

  • trap 'CMD1;CMD2' 信號量

  • break 在腳本中一般與循環一起使用,用于跳出本層循環

  • continue 在腳本中的作用是跳過本次循環循環,直接進入到下次循環。


具體示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #!/bin/bash echo?"###########?test?break?and?trap?##################"???????? read?-p?"Plz?enter?a?username:?"?userName #?捕獲?Ctrl?+?C?信號 trap?'echo?"quit";exit?3'?INT? #?while?:?;do while?true;?do if?who?|?grep?"\<$userName\>"?&>?/dev/null;?then ????break fi ????echo?"wait..." ????sleep?5 done echo?"$userName?is?logged." #?求?100?以內的所有奇數之和 echo?"###########?continue?##################" for?loop?in?{1..100};do ????if?[?$[$loop%2]?-eq?0?]?;then ????????continue ????else ????????let?sum+=$loop ????fi done echo?"The?sum?is?$sum."









本文轉自 羊木狼 51CTO博客,原文鏈接:http://blog.51cto.com/guoting/1436392,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的Linux Shell编程之一循环结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。