linux基礎學習第十一天(shell循環、軟件包管理)

2016-08-16

授課內容:

shell腳本基礎:循環,for,while,until(未講完)

軟件包管理(未講完):

?軟件運行環境

?軟件包基礎

?Rpm包管理

循環執行

將某代碼段重復運行多次

重復運行多少次:

循環次數事先已知

循環次數事先未知

有進入條件和退出條件

循環控制語句:

break:【提結束循環,循環將不再執行】指前面的循環退出,退出后還繼續執行后面的命令,而exit則是退出整個腳本

continue:【提結束本輪循環,而進入下一輪循環】當碰到continue語句時,continue后面的語句不再執行,直接提前進入下一輪循環

for循環

for 變量名in 列表;do

循環體

done

列表:以空格隔開的包括數字、字符、文件等個體

    執行機制:

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

    例如:

     寫一個腳本,提示輸入正整數n的值,計算1+2+3+…n的總和

 #!/bin/bash
 
 #Version:1.0
 #Create time:2016-08-15 13:51:02
 #Description:寫一個腳本,提示輸入正整數n的值,計算1+2+3+…n的總和
 let SUM=0
 read -p "input num: " NUM
 expr $NUM + 0 &> /dev/null
 [ $? -ne 0 ] && echo "please input digitnum" && exit 100
 [ $NUM -le 0 ] && echo "input the right num" && exit 99
 for I in `seq $NUM`
 do
     SUM=$(($SUM+$I))
 done
 echo "the sum is $SUM"
 unset SUM
 unset NUM

while循環:

while CONDITION; do

循環體

done

進入條件:CONDITION為true;

退出條件:CONDITION為false

即當循環體是真是執行循環體,循環體是假是退出循環體

例如:
求100以內所有正整數之和
#!/bin/bash
#Version:1.0
#Create time:2016-08-15 14:36:00
#Description:求100以內所有正整數之和
let SUM=0
let NUM=1
while [ $NUM -le 100 ] 
do
    SUM=$(($SUM+$NUM))
    NUM=$(($NUM+1))
done
echo "1+2+...+100=$SUM"
until循環
until CONDITION; do
循環體
done

進入條件:CONDITION 為false

退出條件:CONDITION 為true

【】即當循環體是真是執行循環體,循環體是假是退出循環體,與while循環相反

軟件包管理

    軟件運行環境

     程序源代碼–> 預處理–> 編譯–> 匯編–> 鏈接

     注釋內容在預處理時被去掉

    ABI:Application Binary Interface

    Windows與Linux不兼容,如ls命令不能再windows運行,因為uwindows和linux的ABI接口不同

包管理器:

     二進制應用程序的組成部分:

          二進制文件、庫文件、配置文件、幫助文件

     程序包管理器:

         debian:deb文件, dpkg包管理器

         redhat: rpm文件, rpm包管理器,SUSE系列也是使用rpm包管理器

         rpm: RedhatPackage Manager(初期)

         RPM Package Manager (行業標準,類似GNU)

     包命名

         源代碼: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

         OS:el7,指的是RHEL7的版本

         常見的arch:

         x86: i386, i486, i586, i686(32位平臺)

         x86_64: x64, x86_64, amd64(64位平臺)

         powerpc: ppc

         跟平臺無關:noarch

        包:一個rpm包里面包含多個文件

             Application-VERSION-ARCH.rpm: 主包

             Application-devel-VERSION-ARCH.rpm開發子包

             Application-utils-VERSION-ARHC.rpm其它子包

             Application-libs-VERSION-ARHC.rpm其它子包

    ?包之間:可能存在依賴關系,甚至循環依賴

    ?解決依賴包管理工具:

         yum:rpm包管理器的前端工具

         apt-get:deb包管理器前端工具

    

     由于一個二進制的執行程序包是由二進制文件、庫文件、幫助文件和配置文件組成,所以每個包文件里包括:

     1、包文件組成(每個包獨有)

         RPM包內的文件

         RPM的元數據,如名稱,版本,依賴性,描述等

         安裝或卸載時運行的腳本

     2、數據庫(公共)

         程序包名稱及版本

         依賴關系

         功能說明

         包安裝后生成的各文件路徑及校驗碼信息

    ldd:查看命令的庫文件

[17:13 root@Centos7.2~]# ldd /usr/bin/ls
linux-vdso.so.1 =>  (0x00007ffe41576000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc41c3e6000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fc41c1e1000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fc41bfd7000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc41bc16000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fc41b9b5000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fc41b78f000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc41b58b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc41c61e000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fc41b386000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc41b169000)

管理程序包的方式:

     后端包管理器:rpm

     使用前端工具:yum, dnf

rpm

    1、安裝

         rpm {-i|–install} [install-options] PACKAGE_FILE…

         -v:顯示詳細情況

         -h:以#顯示進度

         -ql:查詢程序的所有文件及路徑

         [install-options]:

         –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:安裝有舊版程序包,則“升級”

         如果不存在舊版程序包,則不執行升級操作

         rpm -Uvh PACKAGE_FILE …

         rpm -Fvh PACKAGE_FILE …

         –oldpackage:降級

         –force: 強行升級

課后作業:

一、用until實現下列作業

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

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 09:53:04
#Description:每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶nihaoma登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,    并提示該用戶退出系統。
until who|grep "nihaoma" &> /dev/null
do
    sleep 3
done
echo `who|grep 'nihaoma' |tr -s ' ' ':'|cut -d: -f3-6` >> /var/log/login.log &> /dev/null
mail -s "please logout" nihaoma &> /dev/null

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

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 10:24:52
#Description:隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出
NUM=$(($RANDOM%11))
read -p "input a NUM: " NUM1
! expr $NUM1 + 1 &> /dev/null && echo "please input a num." && exit 100
until [ $NUM1 -eq $NUM ]
do
    [ $NUM1 -lt $NUM ] && echo "litter" || echo "bigger"
    read -p "input a NUM: " NUM1
    until  expr $NUM1 + 1 &> /dev/null 
    do
        echo "please input a num." 
        read -p "input a NUM: " NUM1
    done
done
echo "yes the NUM is $NUM"

3、編寫腳本,求100以內所有正整數之和

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 10:48:15
#Description:編寫腳本,求100以內所有正整數之和
let I=0
let SUM=0
until [ $I -gt 100 ]
do
    SUM=$(($I+$SUM))
    I=$(($I+1))
done
echo "the sum is $SUM"

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

let NUM=1
COUNT1=0
COUNT2=0
until [ $NUM -gt 254 ]
do
    ping -c1 -W1 "172.16.250.$NUM" &> /dev/null
    if [ $? -eq 0 ];then
        echo "172.16.150.$NUM is up"
        COUNT1=$(($count1+1))
    else
        COUNT2=$(($COUNT2+1))
    fi
    NUM=$(($NUM+1))
done
    echo "total $COUNT1 is up,$COUNT2 is down"
unset NUM
unset COUNT1
unset COUNT2

5、編寫腳本,打印九九乘法表

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 11:07:26
#Description:
NUM=1
until [ $NUM -gt 9 ]
do
    for I in `seq $NUM`
    do
        echo -ne "${NUM}X$I=$(($NUM*$I))\t"
    done
    NUM=$(($NUM+1))
    echo
done
unset NU

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

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 11:08:42
#Description:
let I=1
let MAX=0
let MIN=$RANDOM
echo $MIN
until [ $I -gt 9 ]
do
    let NUM=$RANDOM
    echo "$NUM"
    if [ $NUM -le $MAX ];then
        if [ $NUM -le $MIN ];then
            MIN=$NUM
        fi
    else
        MAX=$NUM
    fi
    I=$(($I+1))
done
echo "the max num is $MAX"
echo "the min num is $MIN"
unset I
unset MAX
unset MIN
unset NUM

7、編寫腳本,實現打印國際象棋棋盤

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 11:10:07
#Description:
#算法:行數和列數之和為偶數打印白格,為奇數打印黑格
let I=1
until [ $I -gt 8 ]
do
    for J in `seq 8`
    do
        [ $((($I+$J)%2)) -eq 0 ] && echo -ne "\033[47m  \033[0m" || echo -ne "\033[40m  \033[0m"
    done
    I=$(($I+1))
    echo
done

8、打印等腰三角形

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 11:21:00
#Description:打印等腰三角形,
#算法:1、第n行打印總行數N-n個空格,2、第n行打印2n-1個*。先打印空格再打印*
read -p "how many lines you want? " LINES
! expr $LINES + 0 &> /dev/null && echo "input digitNUM" && exit 100
[ $LINES -le 0 ] && echo "input positive int" && exit 99
let I=1
let B=$LINES-1
until [ $I -gt $LINES ]
do
    for A in `seq $B`
    do
        echo -n " "
    done
    let B--
    for J in `seq $((2*$I-1))`
    do
        echo -n "*"
    done
    echo
    let I++
done

9、安裝centos6.7,用centos6.8kernel升級

rpm -ivh kernel-2.6.32-431.el6.x86_64.rpm

二、預習

原創文章,作者:麥德良,如若轉載,請注明出處:http://www.www58058.com/36947

(0)
麥德良麥德良
上一篇 2016-08-18 10:10
下一篇 2016-08-18 10:10

相關推薦

  • Linux源碼包安裝詳解

    安裝源碼包 安裝一個源碼包,是需要我們自己把源代碼編譯成二進制的可執行文件。如果你讀得懂這些源代碼,那么你就可以去修改這些源代碼自定義功能,然后再去編譯成你想要的。使用源碼包的好處除了可以自定義修改源代碼外還可以定制相關的功能,因為源碼包在編譯的時候是可以附加額外的選項的。 源碼包的編譯用到了linux系統里的編譯器,常見的源碼包一般都是用C語言開發的,這也…

    Linux干貨 2016-09-06
  • Linux啟動之grub詳解,故障排除,自建linux

    概述     上篇我們以CentOS6為例介紹了一下系統啟動流程,本篇將承接上篇,詳細的介紹一下系統啟動流程中的grub,以及系統啟動過程中的各種故障的排除,以及利用現有內核自己構建一個能夠正常啟動的簡單Linux系統。具體分為一下幾個部分:     1、grub相關概念詳解 &…

    Linux干貨 2016-09-13
  • 小巧精悍——常見文本處理工具用法及技巧總結

    小巧精悍——常見文本處理工具用法及技巧總結 Linux最重要的哲學思想就是:一切皆文件。可見文件及文件操作在Linux當中是多么的重要。在Linux系統中我們也會經常用到各種文本文件處理的操作,熟練使用這些小巧精悍的文本處理工具,在關鍵時刻往往展現非凡的神奇功效。常見文本處理小工具:cat、hexdump、nl、less、head、tail、cut、tr、r…

    Linux干貨 2016-11-05
  • Linux自動備份腳本

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1541163        今天網上一個朋友問了我一個shell的題目,讓我幫他做下。下面是題目以及解題思路。 題目:…

    Linux干貨 2016-08-15
  • 文件管理權限

    命令和筆記

    Linux干貨 2017-12-03
  • 自制Linux系統

                          自制Linux系統 1、環境準備:         在centos6上添加一塊新硬盤,并分區格式化。 &n…

    系統運維 2016-09-21

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 10:02

    腳本需要我們做的就是多寫,多看優秀的代碼,rpm包管理器常用的選項需要做的就是能熟練允許用,這需要多加聯系。

欧美性久久久久