循環 函數 軟件包 【中】

循環 函數 軟件包  【中】

 創建無限循環

while true; do 

   循環體 ?

done

?

until false; do 

   循環體 ?

Done

特殊用法

?while循環的特殊用法(遍歷文件的每一行): 

      while read line; do 

        循環體 

     done < /PATH/FROM/SOMEFILE ? 

依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將 行賦值給變量line 

示例

[root@localhost bin]# bash wenben.sh

#!

#

read -p "please input [yesno]:" a

case $a in

[yY]|[yY][eE][sS])

echo "the user input $a"

;;

[nN]|[nN][oO])

echo "the user input $a"

;;

*)

echo "eht user innput other"

;;

esac

[root@localhost bin]# cat wenben.sh

#/bin/bash

while read line

do

    echo $line

    done < uu.sh

[root@localhost bin]# 

特殊用法之小括號

雙小括號方法,即((…))格式,也可以用于算術運算 ? 

雙小括號方法也可以使bash Shell實現C語言風格的變量操作 

   #I=10 

   #((I++)) 

for循環的特殊格式: 

for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式)) 

do 

    循環體 

done ? 

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

select 循環與菜單 

select variable in list 

do 

   循環體命令 

done ?

select 循環主要用于創建菜單,按數字順序排列的 菜單項將顯示在標準錯誤上,并顯示 PS3 提示符, 等待用戶輸入 ? 用戶輸入菜單列表中的某個數字,執行相應的命令 ? 

用戶輸入被保存在內置變量 REPLY 中。

select 與 case 一般是一起用的?

select 是個無限循環,因此要記住用 break 命令退 出循環,或用 exit 命令終止腳本。也可以按 ctrl+c 退出循環。 ?

select 經常和 case 聯合使用 ?

與 for 循環類似,可以省略 in list ,此時使用位置 參量

函數介紹

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

  2  它與shell程序形式上是相似的,不同的是它不是一個單獨的 進程,不能獨立運行,而是shell程序的一部分。 ? 3  函數和shell程序比較相似,區別在于: ? 

  4  Shell程序在子Shell中運行 ? 

  5  而Shell函數在當前Shell中運行。因此在當前Shell中,函數可以 對shell中變量進行修改

  函數由兩部分組成:函數名和函數體。 ? 

  語法一: 

  

  function f_name { 

  

  …函數體… 

  } ? 

  語法二: 

  

  function f_name () { 

  …函數體… 

  } ? 

  語法三: 

  f_name (){ 

  …函數體… 

  }

   函數的定義和使用: 可在交互式環境下定義函數 可將函數放在腳本文件中作為它的一部分 可放在只包含函數的單獨文件中 ? 

   調用:函數只有被調用才會執行; 

   調用:給定函數名 函數名出現的地方,會被自動替換為函數代碼 ? 

   函數的生命周期:被調用時創建,返回時終止

   函數返回值

函數有兩種返回值: ? 函數的執行結果返回值: 

  (1) 使用echo或printf命令進行輸出 

  (2) 函數體中調用命令的輸出結果 ? 

函數的退出狀態碼: 

  (1) 默認取決于函數中執行的最后一條命令的退出狀態碼 

  (2) 自定義退出狀態碼,其格式為: 

  return  從函數中返回,用最后狀態命令決定返回值 

  return 0  無錯誤返回。 

  return 1-255  有錯誤返回

交互式環境下定義和使用函數

? 例如: 

$dir() { 

> ls -l 

> } ? 

定義該函數后,若在$后面鍵入dir,其顯示結果同ls -l的 作用相同。 

$dir ? 

該dir函數將一直保留到用戶從系統退出,或執行了如下 所示的unset命令: 

$ unset dir

在腳本中定義及使用函數

? 函數在使用前必須定義,因此應將函數定義放在腳本開始部分,直至 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"   

 使用函數文件

 

 1 可以將經常使用的函數存入函數文件,然后將函 數文件載入shell。 ?

 2 文件名可任意選取,但最好與相關任務有某種聯 

 3 一旦函數文件載入shell,就可以在命令行或腳本 中調用函數??梢允褂胹et命令查看所有定義的函 數,其輸出列表包括已經載入shell的所有函數。    ?

 4 若要改動函數,首先用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

檢查載入函數

? 使用set命令檢查函數是否已載入。set命令將在shell中顯示 所有的載入函數。 ? 

示例: 

$set findit=( ) { 

if [ $# -lt 1 ]; then 

    echo "usage :findit file"; 

    return 1 

    fi 

    find / -name $1 -print 

} … 

執行shell函數

? 要執行函數,簡單地鍵入函數名即可: ? 

示例: 

$findit groups 

/usr/bin/groups 

/usr/local/backups/groups.bak

刪除shell函數 ? 現在對函數做一些改動。首先刪除函數,使其對shell不可用 。使用unset命令完成此功能. ? 命令格式為: ?

  unset  function_name

實例: 

    $unset findit 

    再鍵入set命令,函數將不再顯示

函數參數

? 函數可以接受參數: 

    傳遞參數給函數:調用函數時,在函數名后面以空白分隔 給定參數列表即可;

    例如“testfunc arg1 arg2 …” 

在函數體中當中,可使用$1, $2, …調用這些參數;還 可以使用$@, $*, $#等特殊變量

函數變量

? 變量作用域: 

  

  環境變量:當前shell和子shell有效 本地變量:只在當前shell進程有效,為執行腳本會啟動 專用子shell進程;因此,本地變量的作用范圍是當前shell腳本 程序文件,包括腳本中的函數。 

  局部變量:函數的生命周期;函數結束時變量被自動銷毀 ? 

注意:如果函數中有局部變量,如果其名稱同本地變量,使 用局部變量。 ? 

  在函數中定義局部變量的方法 local NAME=VALUE

  函數遞歸實例

? 函數遞歸: 

    函數直接或間接調用自身 

    注意遞歸層數 ? 

    遞歸實例: 階乘是基斯頓·卡曼于 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

軟件包管理

包查詢

?rpm {-q|–query} [select-options] [query-options] ?

  [select-options] -a: 所有包 

  -f: 查看指定的文件由哪個程序包安裝生成 

  -p rpmfile:針對尚未安裝的程序包文件做查詢操作; 

  –whatprovides CAPABILITY:查詢指定的CAPABILITY 由哪個包所提供 

  –whatrequires CAPABILITY:查詢指定的CAPABILITY被 哪個包所依賴 ?

  rpm2cpio 包文件|cpio –itv 預覽包內文件 ?

  rpm2cpio 包文件|cpio –id  “*.conf” 釋放包內文件

  [query-options] 

  –changelog:查詢rpm包的changelog 

  -c: 查詢程序的配置文件 

  -d: 查詢程序的文檔 

  -i: information -l: 查看指定的程序包安裝后生成的所有文件; 

  –scripts:程序包自帶的腳本片斷 

  -R: 查詢指定的程序包所依賴的CAPABILITY; 

  –provides: 列出指定程序包所提供的CAPABILITY

  查詢用法: 

  -qi PACKAGE, 

  -qf FILE, 

  -qc PACKAGE, 

  -ql PACKAGE, 

  -qd PACKAGE 

  -qpi PACKAGE_FILE, 

  -qpl PACKAGE_FILE, … 

  -qa ? 

  卸載: 

  rpm {-e|–erase} 

      [–allmatches] 

      [–nodeps] 

      [-noscripts] 

      [–notriggers] 

      [–test] 

                    PACKAGE_NAME …

包校驗

?rpm {-V|–verify} [select-options] [verify-options] 

      S file Size differs 

      M Mode differs (includes permissions and file type) 

      5 digest (formerly MD5 sum) differs 

      D Device major/minor number mismatch 

      L readLink(2) path mismatch 

      U User ownership differs 

      G Group ownership differs 

      T mTime differs 

      P capabilities differ

  包來源合法性驗正及完整性驗正: 

      完整性驗正:SHA256 

      來源合法性驗正:RSA ? 

  公鑰加密: 

      對稱加密:加密、解密使用同一密鑰; 

      非對稱加密:密鑰是成對兒的 

          public key: 公鑰,公開所有人 

          secret key: 私鑰, 不能公開 ? 

  導入所需要公鑰: 

          rpm  -K|checksig rpmfile 檢查包的完整性和簽名 

          rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 

          CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7 

          rpm -qa gpg-pubkey*

rpm數據庫

數據庫重建: /var/lib/rpm ?rpm {–initdb|–rebuilddb} 

          initdb: 初始化 

                  如果事先不存在數據庫,則新建之 否則,不執行任何操作 

          rebuilddb:重建 

                  無論當前存在與否,直接重新創建數據庫

yum

?

CentOS: yum, dnf ?

      YUM: Yellowdog Update 

      1 Modifier,rpm的前端程序,用來解決軟件包相關依賴性,可以在多個庫之間定位軟件包, 

      2 up2date的替代工具 yum repository: yum repo,存儲了眾多rpm包,以及 包的相關的元數據文件(放置于特定目錄repodata下) 

      文件服務器: 

         ftp:// 

         http:// 

         file:///

yum配置文件 ?

    yum客戶端配置文件: 

      /etc/yum.conf:為所有倉庫提供公共配置 

      /etc/yum.repos.d/*.repo:為倉庫的指向提供配置 

      倉庫指向的定義: 

      [repositoryID] 

      name=Some name for this repository 

      baseurl=url://path/to/repository/ 

      enabled={1|0} 

      gpgcheck={1|0} 

      gpgkey=URL 

      enablegroups={1|0} 

      failovermethod={roundrobin|priority} 

      默認為:roundrobin,意為隨機挑選; 

      cost=    默認為1000

用循環 顯示一個等腰三角形

root@localhost bin]# chmod a+x sanjiaooo.sh

[root@localhost bin]# sanjiaooo.sh

please enter a number:10

         #

        ###

       #####

      #######

     #########

    ###########

   #############

  ###############

 #################

###################

[root@localhost bin]# cat sanjiaooo.sh

#!/bin/bash

#

read -p "please enter a number:" n

for k in `seq  $n`;do

    for j in `seq $[$n-$k]`;do

    echo -n " "

done

    i=$[$k*2-1]

for l in `seq $i`;do

    echo -n "#"

done

    echo

done    

[root@localhost bin]# 

用select和case 做個簡易菜單

[root@localhost bin]# caidan.sh

1) gongbaojiding  3) baoyu    5) xie

2) hongshaorou  4) dayu    6) xia

how do you like?1

10 yuan

[root@localhost bin]# caidan.sh

1) gongbaojiding  3) baoyu    5) xie

2) hongshaorou  4) dayu    6) xia

how do you like?3

100yuan

[root@localhost bin]# cat caidan.sh

#!/bin/bash

#

PS3="how do you like?"

select caidan in gongbaojiding hongshaorou baoyu dayu xie xia

do

    case $caidan in

    gongbaojiding)

    echo "10 yuan"

    break

    ;;

    hongshaorou)

    echo "20 yuan"

    break

    ;;

    baoyu)

    echo "100yuan"

    break

    ;;

    dayu)

    echo "40 yuan"

    break

    ;;

    xie)

    echo "88 yuan "

    break

    ;;

    xia)

    echo "99 yuan "

    break

    ;;

    *)

    echo "no exist"

    break

    esac

done    

[root@localhost bin]# 

漢諾塔 游戲

[root@localhost bin]# hannuotao.sh

please input the number you want:3

move 1: A–>C

move 2: A–>B

move 1: C–>B

move 3: A–>C

move 1: B–>A

move 2: B–>C

move 1: A–>C

[root@localhost bin]# cat hannuotao.sh

 #!/bin/bash

 read -p "please input the number you want:" n

 a="A"

 b="B"

 c="C"

 game(){

 if [ $1 -eq 1 ];then

 echo "move $1: $2–>$4"

 else

 game $[$1-1] $2 $4 $3

 echo "move $1: $2–>$4"

 game $[$1-1] $3 $2 $4

 fi

 }

 game $n $a $b $c

原創文章,作者:a1215276209,如若轉載,請注明出處:http://www.www58058.com/37646

(0)
a1215276209a1215276209
上一篇 2016-08-21
下一篇 2016-08-22

相關推薦

  • 數據庫的備份和恢復

    數據庫的備份和恢復 一 (理論篇)、數據庫備份與恢復基礎 1、數據庫的備份與恢復 備份:存儲的數據副本; 原始數據:持續改變; 恢復:把副本應用到線上系統; 僅能恢復至備份操作時刻的數據狀態; 時間點恢復: binary logs; 2、為什么備份? 災難恢復: 硬件故障(冗余)、軟件故障(bug)、自然災害、黑客攻擊、誤操作、…&nb…

    2016-11-22
  • Linux進程篇16.4top命令:進程管理工具

    top命令:進程管理工具

    2017-12-18
  • N22+張zhangzhang+第5周練習作業

    1、顯示當前系統上root、fedora或user1用戶的默認shell; [root@zxn ~]# cat /etc/passwd | grep -E "^root\>" | cut -d: -f7 /bin/bash …

    Linux干貨 2016-09-15
  • 運維面試題, 不知是否正確的答案

    1、簡述TCP三次握手四次揮手過程及各過程中客戶端和服務器端的狀態。 握手: client 發送請求SYN到 server; 狀態:server;初始狀態為LISTEN,client 發送SYN后變為SYN_SENT server 發送ACK回應,并發送SYN請求到 client;狀態:服務器收到SYN后,變為SYN_RCVD,發送ACK+SYN后,變為ES…

    Linux干貨 2016-06-23
  • 公鑰和私鑰的原理

          今天上課老師講到公鑰和秘鑰,模模糊糊聽了個大概,始終還是不能夠詳細的理解公鑰怎么會事?私鑰怎么會事?工作原理是怎么的?今天在網上找了半天,通過查看大家對這個密鑰對的理解,總算弄清楚了,咱就把我的心得寫出來給大家對密鑰對有疑問的同志們看看。      公鑰和私鑰就是俗稱…

    Linux干貨 2016-11-30
  • 【招聘】天津/贊普科技股份有限公司/Linux系統運維工程師/6-7k/五險一金

    天津贊普科技股份有限公司——簡稱贊普科技,成立于2003年,坐落于天津市濱海高新區,是一家專業的互聯網綜合服務商,主營數字網絡建設、數據接入及增值服務和智能化網絡產品及服務。歷經11年的發展,贊普科技已成長為高新區科技型小巨人企業、國家高新技術企業,專注于移動互聯與大數據、云計算、商業WIFI行業的領軍者。     贊普科技計劃…

    Linux干貨 2015-12-03
欧美性久久久久