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
下一篇 2016-09-01

相關推薦

  • linux文件目錄詳解

    linux目錄結構   (且看且不看) 歷史上 /usr和 /etc文件夾下既保存靜態文件,也保存可變文件,后來有了/var層次結構,/usr下面的可變文件被轉移到/var下面。因而/usr現在可以只讀的方式掛載(如果它在單獨的文件系統上)。 /etc下的可變文件早已轉移到/var,因為技術上允許/ 根是系統內核啟動后掛載的第一個分區,掛載到根上的…

    Linux干貨 2017-05-31
  • Linux基本知識之echo命令詳解

    該博文以CentOS6.8_x86_64系統為基礎,Xshell使用pts/X終端登錄CentOS6.8系統,以root身份登錄系統。 為什么學習echo命令?     echo是一種最常用的與廣泛使用的內置于Linux的bash和C shell的命令,通常用在腳本語言和批處理文件中來在標準輸出或者文件中顯示一行文本或者字符串?!?/p>

    Linux干貨 2016-07-29
  • 文本處理工具及grep

    在日常的linux運維工作當中,我們經常要在一些文本當中抽取過濾出我們所需要的信息,從而達到我們的需求,需要特定的文本處理工具來幫我們完成此類操作 本章節主要講解的內容有: 文件查看:cat 分頁查看文本:less、more 抽取文件特定行數:head、tail 抽取文本特定列:cut 合并文本:paste 文本統計:wc 文本排序并統計:sort、uniq…

    Linux干貨 2016-08-08
  • Kickstart

    1、安裝所需軟件包? yum -y install createrepo mkisofs isomd5sum 上傳centos6.9原始鏡像內容 mkdir /mnt/centos?? 創建掛載目錄 mount -o loop centos6.9 /mnt/centos?? 上傳centos6.9鏡像并且掛載至centos目錄 mkdir /tmp/iso?…

    2018-03-26
  • 磁盤管理、文件系統、掛載

    磁盤管理 一磁盤分區 磁盤分區有兩種方式:MBR和GPT MBR:1)按照柱面進行分區;分區不超過2T 2)關于0磁道0扇區的前512bytes;其中的446bytes為boot loader;中間的64bytes裝有分區表;2bytes為55AA 3)可分4個分區;3個主分區+1擴展(N個邏輯分區)擴展分區最多一個。 GPT分區:1)GUID patiti…

    Linux干貨 2016-08-29
  • ?文件服務器 – vsftpd

    文件服務器 – vsftpd 概述 FTP協議 vsftpd的配置文件 vsftpd + pam + file_db + virtual_vsftp_user vsftpd + pam + mysql + virtual_vsftp_user 登錄時錯誤類型 總結 文件服務器是一種專供其他電腦訪問文件和存儲的程序。文件服務器通常比一般的個人電腦擁…

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