十三.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 10:12
下一篇 2016-08-24 10:13

相關推薦

  • 馬哥教育網絡第21期-第六周課程練習

    請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; [root@6 ~]# cp /etc/rc.d/rc.sysinit /tmp [root@6 ~]# …

    Linux干貨 2016-08-15
  • 數組

    一.數組 變量:存儲單個元素的內存空間 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。 索引:編號從0 開始,屬于數值索引  注:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0 版本之后開始支持,bash 的數組支持稀疏格式(索引不連續) 二.數組的聲明 declare -a ARRAY_NAME decla…

    Linux干貨 2016-11-23
  • N28-第三周博客作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。
    2、取出最后登錄到當前系統的用戶的相關信息。
    3、取出當前系統上被用戶當作其默認shell的最多的那個shell。
    4、將/etc/passwd中的第三個字段數值最大的后10個用戶的信息全部改為大寫后保存至/tmp/maxusers.txt文件中。
    5、取出當前主機的IP地址,提示:對ifconfig命令的結果進行切分。
    6、列出/etc目錄下所有以.conf結尾的文件的文件名,并將其名字轉換為大寫后保存至/tmp/etc.conf文件中。
    7、顯示/var目錄下一級子目錄或文件的總個數。
    8、取出/etc/group文件中第三個字段數值最小的10個組的名字。
    9、將/etc/fstab和/etc/issue文件的內容合并為同一個內容后保存至/tmp/etc.test文件中。
    10、請總結描述用戶和組管理類命令的使用方法并完成以下練習:
    (1)、創建組distro,其GID為2016;
    (2)、創建用戶mandriva, 其ID號為1005;基本組為distro;
    (3)、創建用戶mageia,其ID號為1100,家目錄為/home/linux;
    (4)、給用戶mageia添加密碼,密碼為mageedu;
    (5)、刪除mandriva,但保留其家目錄;
    (6)、創建用戶slackware,其ID號為2002,基本組為distro,附加組peguin;
    (7)、修改slackware的默認shell為/bin/tcsh;
    (8)、為用戶slackware新增附加組admins;

    Linux干貨 2017-12-19
  • KVM部署及簡單使用

    KVM特點 KVM必須在具備Intel VT或AMD-V功能的x86平臺上運行。KVM包含一個為處理器提供底層虛擬化,可加載的核心模塊kvm.ko(kvm-intel.ko或kvm-AMD.ko)。使用一個經過修改的QEMU(qemu-kvm),作為虛擬機上層控制和界面。 由于KVM僅是一個簡單的虛擬化模塊,所以它的內存管理沒有自我實現,需借助于Linux內…

    Linux干貨 2016-02-14
  • bash腳本函數和數組

        函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。    函數和shell程序比較相似,區別在于:  &nbsp…

    Linux干貨 2016-08-24
  • Linux終端類型

        終端(Terminal)也稱終端設備,是計算機網絡中處于網絡最外圍的設備,主要用于用戶信息的輸入以及處理結果的輸出等。在早期計算機系統中,由于計算機主機昂貴,因此一個主機(IBM大型計算機)一般會配置多個終端,這些終端本身不具備計算能力,僅僅承擔信息輸入輸出的工作,運算和處理均由主機來完成。在個人計算機時代,個人計算機可以運行稱為…

    Linux干貨 2016-10-13
欧美性久久久久