一、循環語句:for, while, until

循環執行:
將某代碼段重復運行多次
重復運行多少次:
循環次數事先已知
循環次數事先未知
有進入條件和退出條件

1.for……do……done

for 變量 in 列表 ; do
    循環體
done

執行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束

列表生成方式:
(1) 直接給出列表
(2) 整數列表
(a) {start..end}
(b) $(seq[start [step]] end)
(3) 返回列表的命令:$(COMMAND)
(4) 使用glob,如:*.sh
(5) 變量引用:$@, $*

2.while……do……done

while CONDITION ; do
    循環體
done

CONDITION:循環控制條件
進入循環之前,先做一次判斷;
每一次循環之后會再次做判斷;
條件為“true”,則執行一次循環;
直到條件測試狀態為“false”終止循環.

因此:
CONDTION一般應該有循環控制變量;
而此變量的值會在循環體不斷地被修正;
進入條件:CONDITION為true;
退出條件:CONDITION為false.

3.until……do……done

until CONDITION ; do
    循環體
done

CONDITION:循環控制條件
進入循環之前,先做一次判斷;
每一次循環之后會再次做判斷;
條件為“false”,則執行一次循環;
直到條件測試狀態為“true”終止循環.

因此:
CONDTION一般應該有循環控制變量;
而此變量的值會在循環體不斷地被修正;

進入條件:CONDITION 為false
退出條件:CONDITION 為true

4.循環控制語句:continue, break

(1).continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

while CONDTIITON1 ; do
    CMD1
    …
    if CONDITION2 ; then
        continue
    fi
    CMDn
    …
done

(2).break [N]:提前結束第N層循環,最內層為第1層

while CONDTIITON1; do
    CMD1
    …
    if CONDITION2; then
        break
    fi
    CMDn
    …
done

5.創建無限循環

while true ; do
    循環體
done

until false ; do
    循環體
Done

二、程序包管理:rpm

1.程序基礎

API:Application Programming Interface
POSIX:Portable OS
源代碼編譯:程序源代碼–> 預處理–> 編譯–> 匯編–> 鏈接
靜態編譯:.a
共享編譯:.so

ABI:Application Binary Interface
Windows與Linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
庫級別的虛擬化:
Linux: WINE
Windows: Cywin

系統級開發:C, C++
應用級開發:java, delphi, Python, go, php, perl, ruby

2.包管理器

二進制應用程序的組成部分:二進制文件、庫文件、配置文件、幫助文件

程序包管理器分類:
debian:deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: RPM Package Manager (Redhat Package Manager)

3.程序包命名

源代碼:name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release

rpm包命名方式:
name-VERSION-release.arch.rpm
例:bash-4.2.46-19.el7.x86_64.rpm
VERSION: major.minor.release
release:release.OS
常見的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64powerpc: ppc
跟平臺無關:noarch

4.程序包:分類和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm開發子包
Application-utils-VERSION-ARHC.rpm其它子包
Application-libs-VERSION-ARHC.rpm其它子包
程序包之間:可能存在依賴關系,甚至循環依賴

解決依賴包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具

5.庫文件
ldd /PATH/TO/BINARY_FILE :查看二進制程序所依賴的庫文件:
ldconfig -p : 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件:/etc/ld.so.cache

6.程序包管理器:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作

包文件組成(每個包獨有):RPM包內的文件;RPM的元數據,如名稱,版本,依賴性,描述等;安裝或卸載時運行的腳本
數據庫(公共):程序包名稱及版本;依賴關系;功能說明;包安裝后生成的各文件路徑及校驗碼信息

管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf

獲取程序包的途徑:

(1) 系統發版的光盤或官方的服務器;
CentOS鏡像:https://www.centos.org/download/
國內鏡像站點:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com

(2) 項目官方站點

(3) 第三方組織:
Fedora-EPEL: Extra Packages for Enterprise Linux
Rpmforge:RHEL推薦,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/

(4) 自己制作
注意:檢查其合法性:來源合法性,程序包的完整性

7.rpm包管理

CentOS系統上使用rpm命令管理程序包:安裝、卸載、升級、查詢、校驗、數據庫維護

(1).安裝:
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: 查看安裝過程中的詳細信息
-vv:查看安裝過程中更詳細信息
-h: 以#顯示程序包管理執行進度
常用選項:rpm -ivh PACKAGE_FILE …

–test: 測試安裝,但不真正執行安裝;dry run模式
–nodeps:忽略依賴關系
–replacepkgs| replacefiles
–nosignature: 不檢查來源合法性
–nodigest:不檢查包完整性

–noscipts:不執行程序包腳本片斷
%pre: 安裝前腳本;–nopre
%post: 安裝后腳本;–nopost
%preun: 卸載前腳本;–nopreun
%postun: 卸載后腳本;–nopostun

(2).升級:
rpm {-U|–upgrade} [install-options] PACKAGE_FILE…
rpm {-F|–freshen} [install-options] PACKAGE_FILE…
–upgrade:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則“安裝”
–freshen:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則不執行升級操作
–oldpackage:降級
–force: 強行升級
常用選項:rpm -Uvh PACKAGE_FILE …
常用選項:rpm -Fvh PACKAGE_FILE …

注意:
(1)不要對內核做升級操作;Linux支持多內核版本并存,因此,對直接安裝新版本內核
(2)果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

用for實現
1、判斷/var/目錄下所有文件的類型

     #!/bin/bash
     #date:08/16/16
     read -p "Please input a directory:" dir
     test ! -d $dir && echo "Sorry,it is not a directory" && exit
     echo "$dir" | grep -o "\/$" > /dev/null || dir=$dir/
     echo
     for file in `ls -A $dir` ; do
         file $dir$file
     done

2、添加10個用戶user1-user10,密碼同用戶名

     #!/bin/bash
     #date:08/16/16
     for id in `echo {1..10}` ; do
         useradd user$id ; echo "user$id:user$id" | chpasswd
     done

3、/etc/rc.d/rc3.d目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以K開頭的文件輸出為文件加stop,以S開頭
     的文件輸出為文件名加start;“K34filename stop”,“S66filename start”

     #!/bin/bash
     #date:08/16/16
     for file in `ls -A /etc/rc.d/rc3.d` ; do
         case $file in 
         K*)
             echo "$file stop"
             ;;
         S*)
             echo "$file start"
             ;;
         *)
             echo "$file is not begin with K or S"
         esac
     done

4、寫一個腳本,提示輸入正整數n的值,計算1+2+3+…n的總和     #!/bin/bash

     #date:08/16/16    
     read -p "Please input a integer:" int
     if expr $int + 0 > /dev/null ; then
         
         for num in  `seq $int` ; do
             num=$[num+int]
         done
         echo "The sum is $num"
     else
         echo "$int is not a integer"
     fi

5、寫一個腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態     #!/bin/bash

     #date:08/17/16
     read -p "Please input a IP addr:" netip
     if echo "$netip" | egrep -q '\<(1?[0-9]{0,2}|2[0-4][0-9]|25[0-5])(\.(1?[0-9]{0,2}|2[0-4][0-9]|25[0-5])){3}\>' ; then
        firstnum=`echo "netip" | cut -d "." -f 1`
         if [ $firstnum -gt 0 -a $firstnum -lt 127 ] ; then
             for tail in {0..255}.{0..255}.{0..255} ; do
                 ping -c 1 -W 1 $firstnum.$tail &> /dev/null && echo "$firstnum.$tail is up" || echo "$firstnum.$tail is down"
             done
         elif [ $firstnum -ge 128 -a $firstnum -le 191 ] ; then
             head=`echo "$netip" | cut -d "." -f 1,2`
             for tail in {0..255}.{0..255} ; do
                 ping -c 1 -W 1 $head.$tail &> /dev/null && echo "$head.$tail is up" || echo "$head.$tail is down"
             done
         elif [ $firstnum -ge 192 -a $firstnum -le 233 ] ; then
             head=`echo "$netip" | cut -d "." -f 1,2,3`
             for tail in {0..255} ; do
                 ping -c 1 -W 1 $head.$tail &> /dev/null && echo "$head.$tail is up" || echo "$head.$tail is down"
             done
         else
             echo "This ip can not connect internet"
         fi
     else
         echo "This is a illegal IP"
     fi

6、打印九九乘法表

     #!/bin/bash
     #date:08/17/16
     for i in {1..9} ; do
        for j in `seq $i` ; do
            echo -ne "$j*$i=$[i*j]\t"
        done
        echo
     done

用while實現

1、求100以內所有正整數之和

     #!/bin/bash
     #date:08/17/16
     i=0
     while [ $i -le 100 ] ; do
         j=$[j+i] ; let i++
     done
     echo $j

2、通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。

     #!/bin/bash
     #date:08/17/16
     i=1
     while [ $i -le 254 ] ; do
         if (ping -c 1 -W 1 172.16.250.$i &> /dev/null) ; then
            echo "172.16.250.$i is up" ; let up++
        else
            echo "172.16.250.$i is down" ; let down++
        fi
        let i++
     done
     echo "The sum of up is $up"
     echo "The sum of down is $down"

3、打印九九乘法表

     #!/bin/bash
     #date:08/17/16
     i=1
     while [ $i -le 9 ] ; do
        j=1
               while [ $j -le $i ] ; do
                echo -ne "$j*$i=$[i*j]\t" ; let j++
            done
        echo
        let i++
     done

  4、利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者

     #!/bin/bash
     #date:08/17/16
     num=`echo $[RANDOM]`
     echo=$num
     max=$num
     min=$num
     i=1
     while [ $i -le 9 ] ; do
         num=`echo $[RANDOM]`
         echo $num
         [ $num -gt $max ] && max=$num 
         [ $num -lt $min ] && min=$num
         let i++
     done
     echo "max $max"
     echo "min $min"

5、打印國際象棋棋盤

     #!/bin/bash
     #date:08/17/16
     i=1
      while [ $i -le 8 ] ; do
 
     j=1
          while [ $j -le 8 ] ; do
        sum=$[$i+$j]
        rem=$[$sum%2]
             if [ $rem -eq 0 ] ; then
                echo -ne "\033[47m  \033[0m"
                else
                   echo -ne "\033[41m  \033[0m"
            fi
              j=$[$j+1]
            done
    i=$[$i+1]
    echo
    done

用until實現
  1、求100以內所有正整數之和

     #!/bin/bash
     #date:08/17/16
     i=0
     until [ $i -gt 100 ] ; do
         j=$[j+i] ; let i++
     done
     echo $j

2、通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。

     #!/bin/bash
     #date:08/17/16
     i=1
     until [ $i -gt 254 ] ; do
         if (ping -c 1 -W 1 172.16.250.$i &> /dev/null) ; then
            echo "172.16.250.$i is up" ; let up++
        else
            echo "172.16.250.$i is down" ; let down++
        fi
        let i++
     done
     echo "The sum of up is $up"
     echo "The sum of down is $down"

3、打印九九乘法表

     #!/bin/bash
     #date:08/17/16
     i=1
     until [ $i -gt 9 ] ; do
        j=1
               until [ $j -gt $i ] ; do
                echo -ne "$j*$i=$[i*j]\t" ; let j++
            done
        echo
        let i++
     done

4、利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者

     #!/bin/bash
     #date:08/17/16
     num=`echo $[RANDOM]`
     echo=$num
     max=$num
     min=$num
     i=1
     until [ $i -gt 9 ] ; do
         num=`echo $[RANDOM]`
         echo $num
         [ $num -gt $max ] && max=$num 
         [ $num -lt $min ] && min=$num
         let i++
     done
     echo "max $max"
     echo "min $min"

5、打印國際象棋棋盤

     #!/bin/bash
     #date:08/17/16
     i=1
      until [ $i -gt 8 ] ; do
 
     j=1
      until [ $j -gt 8 ] ; do
        sum=$[$i+$j]
        rem=$[sum%2]
         if [ $rem -eq 0 ] ; then
            echo -ne "\033[47m  \033[0m"
        else
            echo -ne "\033[41m  \033[0m"
        fi
          j=$((j+1))
    done
    i=$((i+1))
    echo
done

6、每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統。

     #!/bin/bash
     #date:08/17/16
     until false ; do
         if who | grep -q "^hacker\>"  ; then
             break
         fi 
         sleep 3
     done
     echo "`date +%F +%T` hacker logged on" >> /var/log/login.log
     ##!/bin/bash
     # 
     #until who | grep -q "^hacker\>" ; do 
     #    sleep 3
     #done
     #echo "`date +%F +%T` hacker logged on" >> /var/log/login.log

7、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出。

         #!/bin/bash
         r=$[RANDOM%10]
         n=11
         until [ $n -eq $r ]  ; do
             read -p "please inout a numper (0-9) " n
                if [ $n -eq $r ] ; then
                    echo "it is right"
                elif [ $n -gt $r ] ; then
                    echo "it is great"
                else [ $n -lt $r ]
                    echo "it is less"
                fi
         done

  8、打印等腰三角形

  #!/bin/bash
  read -p "number:" n
  for ((i=0;i<=$n;i++)) ; do
      for ((j=$n;j>i;j--)) ; do
          echo -n " "
      done
      for((j=0;j<2*i-1;j++))
          echo -n "*"
      done
      echo
  done

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

(0)
anonymousanonymous
上一篇 2016-08-19
下一篇 2016-08-19

相關推薦

  • haproxy 簡單實現80轉后端8000

    一,安裝 yum -y install gcc automake autoconf libtool make tar -xzf haproxy-1.6.8 cd haproxy-1.6.8 make TARGET=linux2628 make install 二,編輯配置文件 Haproxy配置中分成五部分內容,當然這些組件不是必選的,可以根據需要選擇作為配…

    Linux干貨 2016-09-19
  • ?卸載kernel玩一玩

    卸載kernel玩一玩 廢話不多說,下面開始卸載內核這一驚險之旅,特別提醒在開始之前做好虛擬機的快照,也許會造成系統無法啟動,也許會出現各種錯誤,也許會笑著刪數據庫跑路,也許會從入門到放棄,,請系好安全帶。  練習 冒泡排序法 #!/bin/bash##Author:jasonmc#Date:2016-08-24#Description:buble…

    Linux干貨 2016-08-26
  • 第八周-Shell腳本編程

    1、寫一個腳本,使用ping命令探測172.16.250.1-172.16.250.254之間的所有主機的在線狀態; 在線的主機使用綠色顯示; 不在線的主使用紅色顯示; #!/bin/bash for i in {1..254}; do { ip=172.16.250.$i if ping -c 1 -w 1 $ip &> /dev/null …

    Linux干貨 2017-08-23
  • 破壞grub實驗之二

    刪除/etc/fstab和/boot和grub的stage1階段 [root@localhost ~]# rm -rf /boot [root@localhost ~]# rm -rf /etc/fstab  [root@localhost ~]# …

    Linux干貨 2016-09-28
  • 定時任務應用示例

    定時任務應用示例 1.每4小時執行一次對/etc目錄的備份,備份至/backup目錄中,保存的目錄名為形如etc-201504020202 mkdir /backup crontab -e * */4 * * * cp -ar /etc/ /backup/etc-$(date +%Y%m%d%H%M) 2.每周2,4,6備份/var/log/messages…

    Linux干貨 2017-08-06
  • Linux 系統啟動流程與grub的應用

    一 Linux 系統啟動流程    POST –> BIOS(Boot Sequence) –> MBR(bootloader) –> kernel + initramfs(或initrd) –> rootfs (ro) –> /sbin/init …

    Linux干貨 2016-03-07
欧美性久久久久