關于shell腳本基礎第二篇

                      shell腳本編程基礎第二篇
 read命令
 使用read來把輸入的值非配給一個或者多個shell變量,可以提示用戶輸入一些參數等,此時我們可以使用read命令來完成此功能
 read
[選項] [名稱]
 read -p 指定要顯示的提示信息
 read -t 聲明超時
 注意:1
當我們寫完一個腳本后,需要對腳本進行語法檢查,如果發現語法不對,我們可以進行修改,
 語法檢測命令:bash -n
/path/to/some_scripts
     2 
完成語法測試后,還可以進行功能測試,可以說是調試,也可以加上執行權限后運行,可以通過bash所提供的調試功能來進行運行測試
    
運行調試命令:bash -x /path/to/some_scripts
    
 read
從標準輸入中讀取值,給每一個單詞分配一個變量,所有剩余的單詞都被分配給最后一個變量
 read -p "who ar you?:" file

   
 流程控制
 過程式編程語言:
               順序執行  
按照順序一條一條的語句執行
               選擇執行   按照條件進行選擇執行
               循環執行  
按照給定的循環條件進行循環執行
 其中的順序執行不需要特定的控制,只需要按照語句依次執行即可;
 選擇執行,則需要特定的控制語句 例如
if、case 來判斷選擇執行;
 循環執行,則需要特定的循環控制體來控制 例如 for、while
 
 條件選擇if語句    
if語句可以嵌套
        選擇執行:
           單分支:if 判斷條件;then     
語句開頭
                      條件為真的分支代碼
                  
fi                    語句結尾
           雙分支:if 判斷條件;then      語句開頭

                      條件為真的分支代碼
                  
else
                       條件為假的分支代碼
                  
fi                    語句結尾
       多分支結構:if 命令1;then        
語句開頭
                      if-true  
                   elif
命令2;then
                      if-true
                   elif
命令3;then
                      if-true
                  
else
                       all-false
                   
fi                    語句結尾
          
逐條件進行判斷,第一次遇到為真條件時,執其他分支,而后結束真個if語句
 

條件判斷:case語句
           case 變量引用 in
           模式1)
               
分支1 命令1
                ;;
           模式2)
                分支2
命令2
                ;;
           *) 
               
默認分支
                ;;                          從上到下的進行判斷條件
           
esac   
           ease 支持 glob風格的通配符
                 *   
任意長度任意的字符
                 ?   任意單個字符
                 []  
指定范圍內的任意單個字符
                 a|b 
a或b
   
      
                        shell 腳本
循環
                    
 循環執行   for , while , until
       
就是程序按照一定的條件反復進行執行相關操作,知道不在滿足循環條件是結束,這里面的重點就是這個循環體
       
循環體包括兩部分,循環的進入條件和循環的退出條件,兩個部分必須同時存在 否則將無法進入循環內部,或者循環無法結束,導致系統崩潰
       
重復運行多少次:
                      循環次數事先已知
                     
循環次數事先未知
 for循環
        for 變量名 in 列表;do
            循環體
       
done
   例如:
        #!/bin/bash
        #user:Compro
        for i
in 1 2 3 4;do       
           echo "$i"
        done
       
編輯腳本,i是定義的變量名稱,1234 是變量的值,然后循環打印輸出                       

                                         

執行機制:一次將列表中的元素賦值給“變量名”;每次賦值后即執行一次循環體;知道列表中的元素好近,循環才結束。
列表生成的方式:
             
1直接給出列表
              2整數列表:
                       {start…end} 
例如:{1..10}
                        seq start step end 例如:$(seq 1 2
10)
              3返回列表的命令:
                            $(命令) 例如:$(ls
/var)
位置變量參數:在腳本中用于引用傳遞給腳本的參數
             $1,$2,,${10},,
   
特殊變量:
            $? 保存上一條命令的執行結果成功與否的狀態,用數字來表示,0-255;
0表示成功,其他則為失敗
            $0 在腳本中用于引用傳遞腳本名稱本身
      $#
保存傳遞給當前腳本的參數的個數
            $* 保存傳遞給當前腳本的所有參數
            $@
保存傳遞給當前腳本的所有參數    兩個在不同的地方用會產生不同的效果
           
 練習
[root@localhost
~]# vim forrc.d.sh
#!/bin/bash
#user:Compro
#  /etc/rc.d/rc3.d
目錄下分別有多個以 K 開頭和以 S 開頭的
# 文件;分別讀取每個文件,以 K 開頭的文件輸出為文件加 stop
# ,以 S
開頭的文件輸出為文件名加 start ;
for i in `ls /etc/rc.d/rc3.d`    
循環定義i為變量名,in之后跟變量的值,也就是ls /etc/rc.d/rc3.d  查看目錄的命令
do
        filef1=`echo
$i |cut -c1`       定義變量名= 引用上面的變量名i 抽取內容開頭第1列
        case $filef1
in                      條件判斷,case語句,調用上面的變量filef1
       
K)                                          匹配大寫K 然后才執行引用的變量值
        echo -e
"$i\tstop"                輸出引用變量后的結果 后綴加上tstop
        ;;  
       
S)                                         匹配大寫S 然后才執行引用的變量值
        echo -e
"$i\tstart"               輸出引用變量后的結果 后綴加上tstart
        ;;
       
*)                                         任意長度任意字符
        echo "unkown
file"             
        ;;
        esac
done
         

 

[root@localhost ~]# vim
shuzizonghe.sh
#!/bin/bash
#user:Compro
#提示輸入正整數n的值,計算1+2+3+4+…n的總和
read
-p 'please input the number:' n    說明信息,提示信息, 請輸入數字
num=`echo $n |grep
"^[[:digit:]]\+$"`    定義變量名num = 調用$n的變量,查詢開頭是數字, \+匹配前面字符至少一次$行尾錨定
if
"$num";then                                        判斷條件調用上面變量
        if [
$num -eq 0 ];then                     變量值是否等于0
        echo "the umber is 0" 
                 輸入數字為0 則提示這數字為0
       
exit                                                  并且退出,不再往下面條件判斷
       
fi
else
        echo "the number is negative"      
如果輸入的是負數就提示這條信息
fi
string=0                 
                               字符串=0
for i in `seq
$n`;do                                定義變量名i 后面列表的seq調后$n的值
       
sum=$[$sum+$i]                           定義變量名sum =調后變量 總計 + $i 的數值
       
string=$string+$1                         字符串 = 輸入的字符串 + 變量1
done
echo
"$string=$sum"                           輸出結果 為 輸出的變量字符串=數值在原有的基礎上相加

 

[root@localhost ~]# vim forip.sh
#!/bin/bash
#user:Compro
#
寫一個腳本,提示請輸入網絡地址,如 192.168.0.0 ,判斷輸入的網段中主機在>線狀態
#255.255.255.0
echo -n
"IP:"    提示輸入IP
read IP          說明信息IP
ipdizi=`echo $IP | cut -d. -f1-3
`.      定義變量名稱=調用$IP獲取的值 抽取 以.為分隔符 1-3的字符
#
if echo $IP | egrep
'\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
&>/dev/null
then                                                  
ip地址擴展表達式
    for i in `seq 200 210`                                   
定義變量名i 列表內容為 seq 200 100 之間的數字
    do
        if ping -c 1 -W 1 $ipdizi$i
&> /dev/null    調用$ipdizi $i 的值 重定向到文件 不顯示出來
       
then
            echo -e "$ipdizi$i\tonline"                    顯示在線的IP

        else
            echo -e
"$ipdizi$i\toffline"                    顯示不在線的IP
        fi

[root@localhost ~]# vim
for99.sh
#!/bin/bash
#uesr:Compro
#打印99乘法表
for i in `seq
9`              定義變量名i 列表內容為seq 9  生成1-9的數字的行
do
        for o in `seq 1
$i`   定義變量名o 列表內容為 seq 1 $i   1循環到 $i變量值  第1行就打印1遍,第2行就打印2遍,,,
       
do
                echo -ne "$i*$o=$(($i*$o))\t"     $i的值*$o的值= $變量中的結果   ~]#
echo -ne "5*5=$((5*5))\t"   結果是25   \t 是在每一行 空白符隔開
        done
       
echo
done

 

while 循環          
while CONDITION;do   
condition狀態就是判斷式
     循環體          do是循環的開始
done                 
done是循環的結束

~]# i=1;while [ $i -le 9 ];do echo $i;let i++;done
當變量i的值1于等于9 
循環打印,在原有的1上面做運算++。直到9為止
condition
循環控制條件;進入循環之前,先做一次判斷,每一次循環之后會再次做判斷;條件為‘true’  (真)則執行一次循環,知道條件測試狀態為‘false’
(假)終止循環
因此:condition 一般應該有循環控制變量,而此變量的值會在循環體不斷的被修正
進入條件 condition 為true 真
。  退出條件:condition為false 假  

[root@localhost ~]# vim
while100.sh
#!/bin/bash
#
#user:Compro
#求100以內所有正整數之和
i=1                                                    定義變量i的值=1   

sum=0                                              sum=0
while [ $i -le
100 ];do                      $i 小于等于 100 就執行循環,
        sum=$(expr $sum +
$i)          $ 運算$sum + $i的值  定義為變量sum
        let i++                   
                   i++ 遞增運算         然后循環判斷,直到判斷i是否小于至等于100
done
       
echo $sum

[root@localhost ~]# vim
whileping.sh
#!/bin/bash
#
#user:Compro
#ping范圍內的所有主機在線狀態,統計在線主機和離線主機個多少個
a="10.1.252."                       
        定義變量值,ip范圍
b=1                                                
最小1開始的值
c=0
d=0
while [ $b -le 10 ];do                    判斷循環條件 $b
是否小于等于 10 從1循環到10
        ping -c1 -W1 $a$b &> /dev/null       
 ping的結果導入到別的文件中 不顯示出來
        if [ $? -eq 0 ];then                 調用上面的值
判斷是否等于0
        echo "$a$b is yes"              如果成功,則打印yes
        let
c++                                   c++  遞增運算  判斷上面的結果隨之遞增
       
else
        echo "$a$b is no"               如果上面的失敗,判斷為no
        let
d++                                 d++ 遞增運算  判斷上面的結果隨之遞增
        fi

        let b++                                  遞增運算循環 ,
不加這個就了死循環,
done
echo "yes users is $c"              調用c的變量結果
統計了yes的次數
echo "no users is $d"               調用d的變量結果 統計了no的次數
    

    

[root@localhost ~]# vim whil99.sh 

#!/bin/bash
#
#uesr:Compro
#打印99乘法表
s=1                                          
   定義變量s=1 s可以理解豎
while [ $s -le 9 ];do                     判斷條件循環,$s 小于等9

        h=1                                      定義變量名h=1 可以理解行
       
while [ $h -le $s ];do           判斷條i安,$h小于等于#s
       
shuzi=$[$s*$h]                    數值=$s*$h的結果
        echo -ne
"$s*$h=$shuzi\t"      輸出顯示上面的結果 \t 空格隔開
        let
h++                                遞增運算 $h 的結果 執行9遍
        done
       
echo
        let s++                                遞增運算 $s 的結果
執行9遍
done
    
    

 
    
[root@localhost ~]# vim xiangqi.sh
#!/bin/bash 

#
#Compro
#打印國際象棋棋盤
i=1                                               
  定義變量值
while [ $i -le 8 ];do                         判斷循環,$i 小于等于8

        j=1
        while [ $j -le 8 ];do                 判斷循環,$j 小于等于8

                sum=`expr $i + $j`        定義變量=運算 $i + $j
               
z=`expr $sum % 2`         上面結果的取模,取余,  每一行每一列進行相加1+1=2 %2=0 1+2=3
%2=1
                [ $z -eq 0 ] && echo -ne "\033[41;1m 
\033[0m"||echo -ne "\033[43;1m  \033[0m"   變量z 小于等于0 就打印紅色,
其它則打印黃色
                let j++                                遞增運算 
循環
        done
        echo
        let
i++                                         遞增運算  循環
done
  

 
 
until 循環
until codition;do    
       循環體
done
    

這種方式,跟while循環 恰恰相反,這個說的是當condition 條件成立時,就終止循環,
進入條件: codition 為 false
(假)    退出條件:condition 為 frue (真)

    
    
循環控制語句 continue ; break
 用于循環體中    
退出當此的循環
例如
#/bin/bash
i=1
unntil [ $i -gt 10 ];do      條件判斷循環 變量i
是否大于 10    
        echo $i
        let i++             
在原有的值上面遞增運算
        [ $i -eq 5 ] && continue         條件判斷,$i 是否等于5  ,
執行退出此次循環命令  ,而不是全部退出循環,只是退出匹配條件的循環
         echo sss               
顯示sss分隔符。  當循環到5的時候停止。 在次從5開始又一次的循環
done

             
例如
#/bin/bash        打斷,中斷,停止此次循環。
i=1
unntil [ $i
-gt 10 ];do       條件判斷循環 變量i 是否大于 10 
        echo $i
        let
i++                在原有的值上面遞增運算
        [ $i -eq 5 ] && break       
條件判斷,$i 是否等于5 ,當等于5的時候 ,停止退出此次循環。
         echo sss               顯示sss分隔符。 
當循環到5的時候停止。
done
     echo sss   這個不再循環體之內的字符, 是可以輸出顯示出來的。             

             
             
 
             
[root@localhost
~]# vim
caicai.sh
#!/bin/bash
#
#user:Compro
#隨機生成10以內的數字,實現猜數字游戲,提示提大會或者小,相等則退出
sj=$[$RANDOM%10+1]                
定義變量名稱=取模隨機數10之內的
read -p "請輸入數字:" sr                交互提示用戶信息,
sr是下面準備用的變量
until [ $sj -eq $sr ];do                      判斷循環,$sj隨機變量 等于
輸入$sr變量, until條件成立時,就終止循環
#結果提示
 [ $sr -lt $sj ] && echo
"x"                輸入的小于隨機  則提示小。
 [ $sr -gt $sj ] && echo
"d"             輸入的大于隨機  則提示大。
read -p "請輸入數字:" sr              
只要是沒輸入跟隨機相等的數字,則一直提示輸入
done
echo "game over!"                        
當上面條件結束時 ,則提示游戲結束
             
運行腳本  [root@localhost ~]# bash caicai.sh

請輸入數字:1          輸入1
x                     提示小
請輸入數字:5         
輸入5
d                     提示大
請輸入數字:3          輸入3
game
over!            游戲結束   證明腳本生成的隨機數是3,相等則退出

原創文章,作者:小馬哥,如若轉載,請注明出處:http://www.www58058.com/37488

(0)
小馬哥小馬哥
上一篇 2016-08-18
下一篇 2016-08-19

相關推薦

  • Linux運維利器之ClusterShell

    Via:http://blogread.cn/it/article/4573?f=wb 如果你有若干臺數據庫服務器,突然你想知道它們當前的即時負載情況,你會怎么辦?挨個登錄上去uptime一下?感覺有點傻,寫個shell?浪費時間,直接用ClusterShell吧! ClusterShell的安裝與配置     Clu…

    Linux干貨 2015-05-12
  • Linux 環境 SSD(固態硬盤)使用指南

    原文鏈接:http://www.jinbuguo.com/storage/ssd_usage.html 前言 因為SSD有著諸多與傳統機械式硬盤不同的特點,而且這些特點導致了SSD在實際使用中的性能和壽命與其使用方法緊密相關。所以并不是說買來一塊非常牛X的SSD就萬事大吉了。另一方面,SSD的性能并不像機械式硬盤那樣比較穩定(浮動范圍小),而是呈現出一種離散…

    Linux干貨 2015-04-08
  • 淺談DNS基本原理以及實現方法(一)

     DNS(Domain Name System,域名系統),是目前互聯網上最不可或缺的服務器之一,我們在互聯網從訪問一個網站,到發送一封電子郵件,再到定位域中的域控制器,無時無刻不再使用著DNS為我們提供的服務,那為什么我們會需要這樣一個服務那?帶著這樣一個疑問讓我們先來認識一下什么是DNS吧  DNS最核心的工作就是域名解析,也就是把計…

    Linux干貨 2015-12-15
  • 接51CTO:13 用戶組和權限管理3

    用戶組和權限管理3 一、雜項知識整理 1、硬鏈接:寫源文件可以是相對地址,相對于鏈接文件。例如 [root@localhost testdir]# ln ../etc/fstab aaa ln: 無法創建硬鏈接"aaa" => "../etc/fstab…

    Linux干貨 2016-08-04
  • PHP數組實際占用內存大小的分析

    我們在前面的php高效寫法提到,盡量不要復制變量,特別是數組。一般來說,PHP數組的內存利用率只有 1/10, 也就是說,一個在C語言里面100M 內存的數組,在PHP里面就要1G。下面我們可以粗略的估算PHP數組占用內存的大小,首先我們測試1000個元素的整數占用的內存: <?php      &nb…

    系統運維 2015-05-28
  • Jumpserver 3.0 全新改版 更輕、更快、更便捷

               Jumpserver Wiki                       &…

    系統運維 2016-01-05
欧美性久久久久