shell腳本編寫-4

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

while read line; do

循環體

done < /PATH/FROM/SOMEFILE

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

練習:掃描/etc/passwd 文件每一行,如發現GECOS 字段為空,則填充用戶名和單位電話為62985600 ,并提示該用戶的GECOS信息修改成功。

#!/bin/bash

while read mline;do

  if [ -z "`echo $mline|cut -d: -f5`" ];then

     username=`echo $mline|cut -d: -f1`

     chfn -f "$username" $username &>/dev/dull

     chfn -p "62895000" $username &>/dev/dull

     echo "finger is changed successfully"

  fi    

done</etc/passwd

或#while read -p “please input the number:”num;do echo the number is $num;done而且這也是個死循環

或# sum=0;while read line;do sum=$[sum+`echo $line|cut -d: -f3`];done</etc/passwd;echo $sum

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

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

例如:

#i=10

#((i++))

 for循環的特殊格式:

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

循環體

done

控制變量初始化:僅在運行到循環代碼段時執行一次

控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而后再做條件判斷

例如:# sum=0;for i in {1..100};do sum=$[sum+i];done;echo $sum

      #sum=0;for ((i=1;i<=100;i++)) ;do sum=$[sum+i];done;echo $sum

      # for ((sum=0,i=1;i<=100;i++)) ;do sum=$[sum+i];done;echo $sum

1、 select循環與菜單

select variable in list

do

循環體命令

done

select循環主要用于創建菜單,按數字順序排列的菜單項將顯示在標準輸出上,并顯示PS3提示符,等待用戶輸入,用戶輸入菜單列表中的某個數字,執行相應的命令,同時用戶輸入的數字被保存在內置變量 REPLY中

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

select經常和 case聯合使用

與for 循環類似,可以省略 in list ,此時使用位置參量,例#select.sh gb yz hos

例如:

#!/bin/bash

select caidan in gb yz hos;do

   case $caidan in

   gb)

     echo 10$

     echo $REPLY

     break

     ;;

   yz)

     echo 20$

     break

;;

   hos)

     echo 30$

     break

;;

   *)

     echo noexist

     break

;;

   esac

done

運行此腳本,其PS3提示符是#?,不過可以定義,例如在腳本中假如代碼PS3=“what do you want?”

2、 函數(shell命令,shell程序,shell可以是一個終端shell、也可以是一個腳本shell)

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

函數和shell程序比較相似,區別在于:

Shell程序在子Shell中運行,而Shell函數在當前Shell中運行,是shell程序的一部分,因此在當前Shell中,函數可以對shell中變量進行修改

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

  語法一:

function f_name {

… 函數體…

}

  語法二:

f_name() {

… 函數體…

}

定義函數f2 () {

a=xixi

}

#!/bin/bash

a=haha

f2

echo $a

腳本的運行結果是輸出xixi

5、函數的定義和使用:

可在交互式環境下定義函數

示例:

$dir() {

> ls -l

> }

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

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

可將函數放在腳本文件中作為它的一部分

可放在只包含函數的單獨文件中

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

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

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

示例:

[root@centos7 bin]# vim functionadd-reduce.sh

#!/bin/bash

add () {

  echo $[$1+$2]

}

reduce () {

  echo $[$1-$2]

}

add $1 $2

reduce $1 $2

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

3、 使用函數文件

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

文件名可任意選取,但最好與相關任務有某種聯系,例如:functions.main

一旦函數文件載入shell ,就可以在命令行或腳本中調用函數

可以使用set 命令顯示查看所有已經載入shell 中的函數

若要改動函數,首先用unset 命令從shell中刪除函數,改動完畢后,再重新載入此文件

 函數文件已創建好后,要將它載入shell

定位函數文件并載入shell 的格式:

. filename 或 source filename

     注意:此即< 點> < 空格> < 文件名>

這里的文件名要帶正確路徑(絕對或者相對路徑)

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

在終端shell中調用函數,如$ . functions.main

或者腳本中調用,例如在腳本中寫入 . /root/funs代碼,其中/root/funs是絕對路徑函數文件,然后就可以使用其中的函數

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

例如“testfunc arg1 arg2 …”

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

#!/bin/bash

. /root/funs

add $1 $2

reduce $1 $2

6、變量作用域:

環境變量:當前shell和子shell有效

本地變量:只在當前shell進程有效,本地變量的作用范圍是當前shell腳本程序文件,包括腳本中的函數

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

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

 在函數中定義局部變量的方法

local NAME=VALUE

7、函數的退出狀態碼:

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

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

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

return 0 無錯誤返回

return 1-255 有錯誤

在函數中遇見return就結束函數執行,此函數中return后面的代碼不再執行

使用#echo $?可以查看函數的退出狀態碼

8、 函數遞歸實例

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

階乘亦可以遞歸方式定義: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 10

另外sumR.sh

#!/bin/bash

fact() {

if [ $1 -eq 1 ]; then

echo 1

else

echo $[$1+$(fact $[$1-1])]

fi

}

fact $1

 

練習題

1、 每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統
#!/bin/bash
while true;do
  who
  who|grep -q "^shanhaibo\>"
  if [ $? -eq 0 ];then
      who>>/var/log/login.log
      write shanhaibo <./hacker.txt
  fi
     sleep 3
done
2、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出
#!/bin/bash
a=$[$RANDOM%11]
read -p "please input the positive integer 0-9:" b
[[ ! $b =~ [0-9] ]] && echo "this input isn't positive integer[0-9]" && exit
until [ $a -eq $b ] && echo "you are good";do
    if [ $b -gt $a ];then
       echo "the positive integer is bigger"
    else
       echo "the positive integer is less"
    fi
    read -p "please input the positive integer 0-9:" b
done
8、打印等腰三角形
第一種方法:
#!/bin/bash
read -p "please input the line:" n
for i in `seq 1 $n`;do
   for j in `seq 1 $[n-i]`;do
     echo -n " "
   done
   b=$[i*2-1]
   for h in `seq 1 $b`;do
   echo -n "#"
   done
echo
done
第二種方法:
#!/bin/bash
read -p "please input the line:" n
for i in `seq 1 $n`;do
   for j in `seq 1 $[n+i]`;do
       if [ $j -le $[n-i] ];then
           echo -n " "
       elif [ $j -lt $[n+i] ];then
           echo -n "#"
       fi
   done
echo
done


 

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

(0)
1861276386318612763863
上一篇 2016-09-01 08:50
下一篇 2016-09-01 08:50

相關推薦

  • 馬哥教育網絡班22期+第一周課程練習

        操作系統:centos 7.2  64位 計算機組成及功能。 計算機組成: 由存儲器、運算器、控制器、輸入設備、輸出設備組成。 功能: 存儲器:用來存放計算程序及參與運算的各種數據;例如:硬盤、內存 運算器:負責數據的算術運算和邏輯運算即數據的加工處理 控制器:負責對程序規定的控制信息進行分析,控制并…

    Linux干貨 2016-08-15
  • linux入門基礎命令總結

    命令基礎

    2017-09-18
  • Bash的&&,||邏輯運算

    Bash的&&,||邏輯運算 bash里的true和false并不是我們通常所認為的0和1。 true和false是shell的內置命令,返回邏輯值。 $?是一個特殊的變量,存放有上一個程序的結束狀態。 在shell里面,把0作為程序是否成功結束的標志。 例如: $ true$ echo$?0$ false$ echo$?1 有時候,下一條命…

    Linux干貨 2016-04-11
  • 第十周 N21 總有刁民想害朕

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)   加電-MBR-GRUB-/sysinit-init X 對應的服務-/etc/rc.d     MBR        讀取分區表     GRUB      &…

    Linux干貨 2016-09-26
  • 系統基礎之文件查找工具find

    文件查找:        在運維人員操作系統時,要接觸大量的文件,為了避免忘記文件存放位置的尷尬,就需要我們有一種文件查找工具的幫忙,下面是兩個文件查找工具的詳解,locate以及find,分別分享給大家. 第一款工具: Locate locate – find files by name loc…

    Linux干貨 2016-08-16
  • 在vsftp中實現基于pam_mysql的虛擬用戶機制

    FTP簡介 在介紹vsftp相關內容前,簡單描述下FTP。FTP全稱File Transfer Protocol,文件傳輸協議。它是一個C/S架構的協議,在Linux中其服務端實現主要有vsftpd,pureftpd,proftpd,Filezilla,本文主要介紹的是vsftp。客戶端實現主要是ftp和lftp兩種工具。其工作方式:主要分為兩個層面的連接:…

    Linux干貨 2017-01-07
欧美性久久久久