十三.Linux博客-2016年8月18日while、for特殊用法、selet循環與菜單、函數

格式說明:

操作

概念

命令

說明及舉例


十三.while、for特殊用法、selet循環與菜單、函數


while特殊用法

while循環的特殊用法(遍歷文件的每一行):
while read line; do
循環體
done < /PATH/FROM/SOMEFILE

依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line
練習 
掃描/etc/passwd文件每一行,如發現GECOS字段為空,則填充用戶名和單位電話為62985600,并提示該用戶的GECOS信息修改成功。

十三.Linux博客-2016年8月18日while、for特殊用法、selet循環與菜單、函數

以wang用戶身份登陸并傳送文件到wang的家目錄十三.Linux博客-2016年8月18日while、for特殊用法、selet循環與菜單、函數

for特殊用法

雙小括號方法,即((…))格式,也可以用于算術運算 雙小括號方法也可以使bash Shell實現C語言風格的變量操作

 \#I=10  
 \#((I++))  

for循環的特殊格式:
for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式))
do
循環體
done

控制變量初始化:僅在運行到循環代碼段時執行一次
控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而后再做條件判斷

練習
打印9*9
十三.Linux博客-2016年8月18日while、for特殊用法、selet循環與菜單、函數

selet 循環與菜單

select variable in list
do
循環體命令
done

select 循環主要用于創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,并顯示PS3 提示符,等待用戶輸入

用戶輸入菜單列表中的某個數字,執行相應的命令 用戶輸入被保存在內置變量REPLY 中。

select 是個無限循環,因此要記住用break 命令退出循環,或用exit 命令終止腳本。也可以按ctrl+c 退出循環。
select 經常和case 聯合使用
與for 循環類似,可以省略in list ,此時使用位置參量

舉例: (PS3=""定義selet命令提示符)

 十三.Linux博客-2016年8月18日while、for特殊用法、selet循環與菜單、函數

函數

函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。

它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。

函數和shell程序比較相似,區別在于:
– Shell程序在子Shell中運行
– 而Shell函數在當前Shell中運行。因此在當前Shell中,函數可以對shell中變量進行修改

定義函數

語法一:

function f_name{
...函數體...
}

語法二:

function f_name(){
...函數體...
}

語法三:

f_name(){
...函數體...
}

函數使用

函數的定義和使用:
可在交互式環境下定義函數
可將函數放在腳本文件中作為它的一部分
可放在只包含函數的單獨文件中
調用:函數只有被調用才會執行; 
調用:給定函數名
函數名出現的地方,會被自動替換為函數代碼
函數的生命周期:被調用時創建,返回時終止

unset +函數名  刪除函數

函數的優先級比別名高

函數在使用前必須定義,因此應將函數定義放在腳本開始部分,直至shell首次發現它后才能使用
調用函數僅使用其函數名即可。

.示例:

$cat func1
\#!/bin/bash
\# func1
hello()
{
echo "Hello there today's date is `date +%F`"
}
echo "now going to the function hello"
hello
echo "back from the function"

可以將經常使用的函數存入函數文件,然后將函數文件載入shell。
文件名可任意選取,但最好與相關任務有某種聯系。
例如:functions.main
一旦函數文件載入shell,就可以在命令行或腳本中調用函數。
可以使用set命令查看所有定義的函數,其輸出列表包括已經載入shell的所有函數。
若要改動函數,首先用unset命令從shell中刪除函數。改動完畢后,再重新載入此文件。

函數文件示例:

$cat functions.main
\#!/bin/bash
\#functions.main
findit()
{
if [ $# -lt 1 ] ; then
echo "Usage:findit file"
return 1
fi
find / -name $1 –print
}

載入函數

函數文件已創建好后,要將它載入shell
定位函數文件并載入shell的格式:
filename 或source filename
注意:此即<點> <空格> <文件名>
這里的文件名要帶正確路徑

示例:上例中的函數,可使用如下命令:

$ . functions.main

函數變量

變量作用域:
環境變量:當前shell和子shell有效
本地變量:只在當前shell進程有效,為執行腳本會啟動專用子shell進程;因此,本地變量的作用范圍是當前shell腳本程序文件,包括腳本中的函數。
局部變量:函數的生命周期;函數結束時變量被自動銷毀
注意:如果函數中有局部變量,如果其名稱同本地變量,使用局部變量。

在函數中定義局部變量的方法(此變量只作用于函數體本身)

local NAME=VALUE

函數返回值

函數有兩種返回值:
函數的執行結果返回值:
(1) 使用echo或printf命令進行輸出
(2) 函數體中調用命令的輸出結果
函數的退出狀態碼:
(1) 默認取決于函數中執行的最后一條命令的退出狀態碼
(2) 自定義退出狀態碼,其格式為:
return 從函數中返回,用最后狀態命令決定返回值
return 0 無錯誤返回。
return 1-255 有錯誤返回

函數遞歸實例

函數遞歸:
函數直接或間接調用自身
注意遞歸層數

遞歸實例:
階乘是基斯頓·卡曼于1808 年發明的運算符號,是數學術語
一個正整數的階乘(factorial)是所有小于及等于該數的正整數的積,并且有0的階乘為1。自然數n的階乘寫作n!。
n!=1×2×3×…×n。
階乘亦可以遞歸方式定義:0!=1,n!=(n-1)!×n。
n!=n(n-1)(n-2)…1
n(n-1)! = n(n-1)(n-2)!

示例:fact.sh
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]; then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact $1

練習
5.斐波那契數列又稱黃金分割數列,因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2) 寫一個函數,求n階斐波那契數列
十三.Linux博客-2016年8月18日while、for特殊用法、selet循環與菜單、函數
6.漢諾塔
十三.Linux博客-2016年8月18日while、for特殊用法、selet循環與菜單、函數

十三.Linux博客-2016年8月18日while、for特殊用法、selet循環與菜單、函數

原創文章,作者:自己泡面,如若轉載,請注明出處:http://www.www58058.com/39205

(0)
自己泡面自己泡面
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • Find命令的使用

    Find命令的基本用法 在Linux系統中find命令是一個強大文件查找類工具,它支持根據文件名,權限,文件大小,訪問以及修改時間查找,使用方法如下: find [option] [查找起始路徑] [查找條件] [處理動作] 起始路徑:指定查找文件或目錄的路徑,默認為當前目錄 查找條件:可根據文件名,權限,文件大小以及從屬關系查找文件 處理動作:動查找到的文…

    Linux干貨 2017-08-28
  • Nginx

        Nginx(發音同engine x)是一個 Web服務器,也可以用作反向代理,負載平衡器和 HTTP緩存。Nginx 可以部署在網絡上使用 FastCGI,腳本,SCGI 處理程序,WSGI 應用服務器或 Phusion 乘客模塊的動態 HTTP 內容,并可作為軟件負載均衡器。Nginx 使…

    Linux干貨 2017-08-29
  • N25-第七周作業

    第七周作業 — 1、創建一個10G分區,并格式為ext4文件系統; fdisk /dev/sdanp2enter+10Gwpartx -a /dev/sda(1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;mke2fs -t ext4 -b 2018 -m 2 -L “MYDATA” /…

    Linux干貨 2017-02-25
  • http

    練習:分別使用CentOS 7和CentOS 6實現以下任務 一、配置三個基于名稱的虛擬主機          (a) discuzX          (b) wordpress  &nb…

    Linux干貨 2016-10-09
  • 計算機的組成及其功能簡述

    1、計算機的組成 (1)運算器、控制器、寄存器、緩存 –> CPU,Central Processing Unit (2)存儲器 –> Memory (3)輸入設備 –> Keyboard、Mouse and so on (4)輸出設備 –> Displayer and so on (5…

    Linux干貨 2016-09-19
  • 馬哥教育網絡班22期+第11周課程練習

    1、詳細描述一次加密通訊的過程,結合圖示最佳。 Bob先利用單向加密算法提取當前數據的指紋(特征碼),再用自己的私鑰加密數據指紋并附加于數據尾部, 然后利用對稱加密將整個文件加密,之后用Alice的公鑰加密對稱加密密鑰附加于尾部。 Alice收到數據后,先用自己的私鑰解密,得到對稱加密密鑰,之后用對稱加密密鑰解密,然后用Bob的公鑰 解密得到數據指紋,并且驗…

    Linux干貨 2016-11-14
欧美性久久久久