class13 shell編程(五)軟件包管理(三)

一、shell編程(五)

位置變量補充

shift (踢掉參數)

shift
               #! /bin/bashecho "1st arg is $1"echo "all arg are $*"shiftecho "1st arg is $1"echo "all arg are $*"shiftecho "1st arg is $1"echo "all arg are $*"shift 2echo "1st arg is $1"echo "all arg are $*"
       [root@6 ~]# ./test.sh a b c d e f g1st arg is a
all arg are a b c d e f g1st arg is b
all arg are b c d e f g1st arg is c
all arg are c d e f g1st arg is e
all arg are e f g

匿名函數 (無函數名)

{ echo yyy ;exit }

數組

變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。
                  
數組名和索引
    索引:編號從0開始,屬于數值索引
    注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0 版本之后開始支持。    bash 的數組支持稀疏格式(索引不連續)

定義數組

聲明數組:
    declare -a ARRAY_NAME
    declare -A ARRAY_NAME:  關聯數組  (先聲明,再使用)
    
數組元素的賦值:
    (1)一次只賦值一個元素;
    ARRAY_NAME[INDEX]=VALUE
    weekdays[0]="Sunday"
    weekdays[4]="Thursday"
    (2)一次賦值全部元素:
    ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)、
    生成列表
    file=({1,2}*{a,b})
    (3) 只賦值特定元素:
    ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
    
    (4) 交互式數組值對賦值
    read -a ARRAY

引用數組

引用數組元素:${ARRAY_NAME[INDEX]}
    注意:省略[INDEX] 表示引用下標為0 的元素
數組的長度( 數組中元素的個數):     
    ${#ARRAY_NAME[*]}
    ${#ARRAY_NAME[@]}示例 :生成10個隨機數保存于數組中,并找出其最大值和最小值    #!/bin/bash
    declare -a rand    declare -i max=0
    for i in {0..9}; do
        rand[$i]=$RANDOM
        echo ${rand[$i]}
        [ ${rand[$i]} -gt $max ] && max=${rand[$i]}
    done
    echo "Max: $max"

數組數據處理

引用數組中的元素:
    所有元素:${ARRAY[@]}, ${ARRAY[*]}
    數組切片:${ARRAY[@]:offset:number}
            offset:  要跳過的元素個數
            number:   要取出的元素個數
            
            ${ARRAY[@]:offset}
            echo ${v;3;5}
向數組中追加元素:
    ARRAY[${#ARRAY[*]}]
    
    [root@6 ~]# name=([0]=4 [1]=5 [2]=6)    [root@6 ~]# name[${#name[*]}]=10086    [root@6 ~]# echo ${name[*]}
    4 5 6 10086
                    
刪除數組中的某元素:導致稀疏格式
    unset ARRAY[INDEX]關聯數組:
    declare -A ARRAY_NAME
    ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...)          
     [root@6 ~]# declare -A A     [root@6 ~]# A=([a]=1 [b]=2 [c]=3)     [root@6 ~]# echo ${A[b]}
     2

字符串處理及替換

字符串處理

bash 的字符串處理工具:
字符串切片:
    ${#var}: 返回字符串變量var 的長度
    ${var:offset}: 返回字符串  變量var中從第offset個字符后   (不包括第offset個字符)的字符開始,到最后的部分,offset 的取值在0 到 ${#var}-1之間,(bash4.2 后,充許為負值
    ${var:offset:number} :返回 字符串變量var 中從第offset 個字符 后(不包括第offset個字符)的字符開始 ,長度為number 的部分
    ${var: -lengh} :取字符串的最右側幾個字符:
    注意:冒號后必須有一空白字符
基于模式取子串:
${var#*word} :其中word 可以是指定的任意字符功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符
${var##*word}:同上,不同的是,刪除的是字符串開頭至最后一次由word 指定的字符之間的所有內容
    file="/var/log/messages"
    ${file#*/}: log/messages
    ${file##*/}: messages
   
    ${var%word*} :其中word 可以是指定的任意字符;
功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最后一個字符向左至第一次出現word 字符之間的所有字符;    file="/var/log/messages"
    ${file%/*}: /var/log
${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最后一次出現word 字符之間的所有字符;
示例: :url=http://www.magedu.com:80
    ${url##*:} 80
    ${url%%:*} http
查找替換:
${var/pattern/substi} :查找var所表示的字符串中,第一次被pattern 所匹配到的字符串,以substi 替換之${var//pattern/substi}:  查找var 所表示的字符串中,所有能被pattern 所匹配到的字符串,以substi 替換之${var/#pattern/substi} :查找var所表示的字符串中,行首被pattern 所匹配到的字符串,以substi 替換之${var/%pattern/substi} :查找var所表示的字符串中,行尾被pattern 所匹配到的字符串,以substi 替換之
查找并刪除:
${var/pattern} :查找var所表示的字符串中,刪除第一次被pattern 所匹配到的字符串${var//pattern} :所有${var/#pattern} :首行${var/%pattern} :行尾
字符大小寫轉換:
${var^^} :把var 中的所有小寫字母轉換為大寫
${var,,} :把var 中的所有大寫字母轉換為小寫

變量賦值的進階用法

變量賦值

${var:-value} :如果var 為空或未設置,那么返回value;否則,則返回var 的值
${var:+value} :如果var 不空,則返回value${var:=value} :如果var 為空或未設置,那么返回value,并將value 賦值給var;否則,則返回var 的值
${var:?error_info} :如果var 為空或未設置,那么返回error_info ;否則,則返回var 的值
為腳本程序使用配置文件, 實現變量賦值
   (1)定義文本文件,每行定義“name=value”
   (2)在腳本中source 此文件即可

高級變量用法- 有類型變量

Shell 變量一般是無類型的,但是bash Shell 提供了declare和和typeset兩個命令用于指定變量的類型,兩個命令是完全等價的declare [ 選項]  變量名
    -r  將變量設置為只讀屬性
    -i  將變量定義為整型數
    -a  將變量定義為數組
    -f  顯示此腳本前定義過的所有函數名及其內容
    -F  僅顯示此腳本前定義過的所有函數名
    -x  將變量聲明為環境變量
    -l 將變量值轉為小寫字母   
    -u 將變量值轉為大寫字母
    
    [root@6 ~]# echo $name
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    [root@6 ~]# echo $name2
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    [root@6 ~]# declare -l name3=$name2
    [root@6 ~]# echo $name3
    a b c d e f g h i j k l m n o p q r s t u v w x y z

間接變量引用

如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用variable1=variable2variable2=valuevariable1的值是variable2,而variable2 又是變量名,variable2的值為value ,間接變量引用是指通過variable1獲 獲得變量值value 的行為

間接變量引用

bash Shell 提供了兩種格式實現間接變量引用
   eval tempvar=\$$variable1
   tempvar=${!variable1}
   示例:
[root@server ~]# N=NAME[root@server ~]# NAME=wangxiaochun[root@server ~]# N1=${!N}[root@server ~]# echo $N1wangxiaochun
[root@server ~]# eval N2=\$$A[root@server ~]# echo $2wangxiaochun

eval 命令

eval 命令將會首先掃描命令行進行所有的置換,然后再執行該命令。該命令適用于那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描 。
示例:
[root@server ~]# V1=pwd[root@server ~]# echo $V1pwd[root@server ~]# eval $V1/root

創建臨時文件

mktemp命令:創建的臨時文件可避免沖突
mktemp [OPTION]... [TEMPLATE]
  TEMPLATE: filename.XXX
      X至少要出現三個
      
OPTION:
    -d:  創建臨時目錄
    -p DIR --tmpdir=/DIR :指明臨時文件所存放的目錄位置
實例:    #mktemp --tmpdir=/testdir test.XXXXXX
    #mktemp -p /testdir test.XXXXXX
    #mktemp -d /testdir test.XXXXXX

安裝復制文件(二進制程序)

install 命令:    install [OPTION]... [-T] SOURCE DEST  單文件    install [OPTION]... SOURCE... DIRECTORY
    install [OPTION]... -t DIRECTORY SOURCE...    install [OPTION]... -d DIRECTORY... 創建空目錄
選項:
    -m MODE ,默認755
    -o OWNER
    -g GROUP
    install -m 700 -o lvasu -g admins file1 fie2

bash 如何展開命令行

把命令行分成單個命令詞
展開別名
展開大括號種的聲明({}) 
展開波浪符聲明(~) 
命令替換$() 和 ``再次把命令行分成命令詞
展開文件通配(* 、? 、[abc] 等等)
準備I/0 重導向(< 、>) 
運行命令

防止擴展

反斜線(\)會使隨后的字符按原意解釋
$ echo Your cost: \$5.00Your cost: $5.00加引號來防止擴展
    ?  單引號(’ )防止所有擴展
    ?  雙引號(”)也防止所有擴展,但是以下情況例外:
        $ (美元符號) - 變量擴展
        ` (反引號) - 命令替換
        \ (反斜線) - 禁止單個字符擴展
        ! (嘆號) - 歷史命令替換

bash 的配置文件

按生效范圍劃分,存在兩類:
全局配置:
    /etc/profile
    /etc/profile.d/*.sh
    /etc/bashrc
個人配置:
    ~/.bash_profile
    ~/.bashrc

shell 登錄兩種方式

交互式登錄:
 (1)直接通過終端輸入賬號密碼登錄;
 (2) 使用“su - UserName”  切換的用戶
執行順序:
    /etc/profile --> /etc/profile.d/*.sh -->
    ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登錄:
  (1)su UserName
  (2)圖形界面下打開的終端
  (3)執行腳本
執行順序:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

Profile類

按功能劃 分,存在兩類:
    profiile 類和bashrc類profile類:為交互式登錄的shell 提供配置
    全局:/etc/profile, /etc/profile.d/*.sh
    個人:~/.bash_profile
    功用:
        (1)用于定義環境變量
        (2)運行命令或腳本

Bashrc類

bashrc類:為非交互式和交互式登錄的shell 提供配置
    全局:/etc/bashrc    個人:~/.bashrc    功用:
    (1)  定義命令別名和函數
    (2)  定義本地變量

編輯配置文件生效

修改profile 和bashrc 文件后需生效
兩種方法:1 重新啟動shell 進程2 .  或source
例:
 . ~/.bashrc

Bash 退出任務

保存在~/.bash_logout 文件中(用戶)
在退出登錄shell 時運行
用于
    ? 創建自動備份
    ? 清除臨時文件

二、軟件包管理(三)

刪除rpm rpm -e rpm –nodeps 進入救援模式安裝 rpm /path/ –root=/sys

yum

安裝及升級本地程序包:
   * localinstall rpmfile1 [rpmfile2] [...]
     ( 用install 替代)
   * localupdate rpmfile1 [rpmfile2] [...]
      ( 用update 替代)
包組管理的相關命令:
    groupinstall group1 [group2] [...]
    groupupdate group1 [group2] [...]
    grouplist [hidden] [groupwildcard] [...]
    groupremove group1 [group2] [...]
    groupinfo group1 [...]如何使用光盤當作本地yum 倉庫:
 (1)  掛載光盤至某目錄,例如/media/cdrom
    # mount /dev/cdrom /media/cdrom
 (2)  創建配置文件    [CentOS7]
    name=
    baseurl=
    gpgcheck=
    enabled=


yum 的命令行選項:
    --nogpgcheck :禁止進行gpg check
    -y:  自動回答為“yes”
    -q :靜默模式
    --disablerepo=repoidglob :臨時禁用此處指定的repo
    --enablerepo=repoidglob :臨時啟用此處指定的repo
    --noplugins :禁用所有插件

yum 倉庫

yum 的repo 配置文件中可用的變量:    $releasever:  當前OS 的發行版的主版本號    $arch:  平臺,i386,i486,i586,x86_64等 等    $basearch :基礎平臺;i386    $YUM0-$YUM9: 自定義變量
實例:    http://server/centos/$releasever/$basearch/    http://server/centos/7/x86_64    http://server/centos/6/i384
    
創建yum 倉庫:
    createrepo [options] <directory>
                      
 光盤自動啟動服務:
 [root@6 Packages]# service autofs status


 遠程連接文件服務器:
   lftp ip
    mget    下載文件
    bye    退出文件服務器

程序包編譯

程序包編譯安裝:
Application-VERSION-release.src.rpm -->  安裝后,使用 用rpmbuild 命令制作成二進制格式的rpm 包,而后 再 安裝
源代碼--> 預處理--> 編譯(gcc)--> 匯編--> 鏈接--> 執行
源代碼組織格式:
    多文件:文件中的代碼之間,很可能存在跨文件依賴關系
    C 、C++ :make ( 項目管理器,configure -->
    Makefile.in --> makefile)    java: maven

編譯安裝

C 代碼編譯安裝三步驟:    1 、./configure
(1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及makefile.in 文件生成makefile
(2)  檢查依賴到的外部環境 2 、make :根據makefile 文件,構建應用程序 3 、make install: 復制文件到相應路徑
開發工具:
    autoconf:  生成configure 腳本
    automake :生成Makefile.in注意:安裝前查看INSTALL,README


開源程序源代碼的獲?。?
    官方自建站點:
        apache.org (ASF)
        mariadb.org
        ...
    代碼托管:
        SourceForge.net
        Github.com
        code.google.comc/c++ 編譯器: gcc (GNU C Complier)


編譯C 源代碼:
前提:提供開發工具及開發環境
    開發工具:make, gcc等 
    開發環境:開發庫,頭文件
       glibc :標準庫
通過“包組”提供開發組件
    CentOS 6: "Development Tools",    "Server Platform Development",
編譯安裝
第一步:configure 腳本
    選項:指定安裝位置、指定啟用的特性    --help:  獲取其支持使用的選項選項分類:
    安裝路徑設定:    --prefix=/PATH:  指定默認安裝位置, 默認為/usr/local/
    --sysconfdir=/PATH :配置文件安裝位置
    System types: 支持交叉編譯
            
Optional Features:  可選特性    --disable-FEATURE
    --enable-FEATURE[=ARG]Optional Packages:  可選包,    --with-PACKAGE[=ARG], 依賴包
    --without-PACKAGE, 禁用依賴關系第二步:make
第三步:make install安裝后的配置:
(1)  二進制程序目錄導入至PATH 環境變量中;
     編輯文件/etc/profile.d/NAME.sh     export PATH=/PATH/TO/BIN:$PATH(2)  導入庫文件路徑
    編輯/etc/ld.so.conf.d/NAME.conf
     添加新的庫文件所在目錄至此文件中;
    讓系統重新生成緩存:
         ldconfig [-v]
               
(3)  導入頭文件
  基于鏈接的方式實現:  ln -sv
(4)  導入幫助手冊
  編輯/etc/man.config|man_db.conf 文件
  添加一個MANPATH

積累應用

1、系統組件刪除恢復

rpm -e rpm --nodeps
光盤啟動,進入救援模式
           
centos6
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
centos7
rpm -ivh /run/../Package/rpm-4...*.rpm  --root=/mnt/sysimage

1、卸載RPM組件  (centos6)

class13 shell編程(五)軟件包管理(三)

 救援模式rescue   安裝RPM包

 

mount /dev/cdrom /mnt/cdrom   需要掛載光盤
      --root=/mnt/sysimage    指定安裝目錄

class13 shell編程(五)軟件包管理(三)、

2、 卸載RPM組件  (centos7)

class13 shell編程(五)軟件包管理(三)

 救援模式rescue   安裝RPM包

 

      --root=/mnt/sysimage    指定安裝目錄

class13 shell編程(五)軟件包管理(三)

3、卸載kernel組件  (centos6)

class13 shell編程(五)軟件包管理(三)

 救援模式rescue   安裝kernel包

 

mount /dev/cdrom /mnt/cdrom   需要掛載光盤
      --root=/mnt/sysimage    指定安裝目錄

class13 shell編程(五)軟件包管理(三)

4、卸載kernel組件  (centos7)

class13 shell編程(五)軟件包管理(三)

 救援模式rescue   安裝kernel包

 

      --root=/mnt/sysimage    指定安裝目錄

class13 shell編程(五)軟件包管理(三)

2、源碼安裝apache

步驟
1、安裝develpment tools
2、下載 tar xvf httpd-2.2.29.tar.bz2 
3./configure --prefix=/usr/local/http2 --sysconfdir=/etc/http2/4 make5 make install
              
  /etc/man_db.conf   編輯mandb的配置文件
            
   /etc/profile.d.sh/     把http2的執行文件路徑添加到PATH 中
   http2.sh
   PATH=$PATH:/usr/local/http2/bin   
               
6 ./bin/apachectl start     開啟apachectl 
              
7 netstat -ant    檢查端口
  telnet  10.1.252.213 80  
                8 iptables -F    關閉防火墻                  
9 測試links

安裝效果

   2016-8-24 8.JPG

3 、生成10 個隨機數,采用冒泡算法進行升序或降序排序


#! /bin/bash
#author:lvasu
#description:
#version:0.1
#date:
declare -i num;
read -a   arg -p    "請輸入10個數字:"
for((i=0;i<=9;i++))do
    for((k=$[i+1];k<=9;k++))do
       if  [ ${arg[$i]} -gt ${arg[$k]} ];then
         num=${arg[$i]} 
         arg[$i]=${arg[$k]} 
         arg[$k]=$num
       fi 
      done
done
   echo "正序排列${arg[*]}"
echo "=============="
for((i=0;i<=9;i++))do    
    for((k=$[i+1];k<=9;k++))do
    if  [ ${arg[$i]} -lt ${arg[$k]} ];then
         num=${arg[$i]} 
         arg[$i]=${arg[$k]} 
         arg[$k]=$num
     fi 
     done
done
   echo "逆序排練${arg[*]}"
echo "===================="
  zhengxu 
echo "===================="
    nixu
zhengxu()
{     local  num;
for((i=0;i<=9;i++))do
    for((k=$[i+1];k<=9;k++))do
       if  [ ${arg[$i]} -gt ${arg[$k]} ];then
         num=${arg[$i]} 
         arg[$i]=${arg[$k]} 
         arg[$k]=$num
       fi 
      done
done
   echo "正序排列${arg[*]}"
}
nixu()
{
for  ((i=0;i<=9;i++))do    
    for  ((k=$[i+1];k<=9;k++))do
    if  [ ${arg[$i]} -lt ${arg[$k]} ];then
         num=${arg[$i]} 
         arg[$i]=${arg[$k]} 
         arg[$k]=$num
     fi 
     done
done
   echo "逆序排練${arg[*]}"
}
[root@6 bin]# sort.sh
請輸入10個數字:2 5 1 4 6 10 5 9 111 20
正序排列1 2 4 5 5 6 9 10 20 111
==============================
逆序排練111 20 10 9 6 5 5 4 2 1
=============================
正序排列1 2 4 5 5 6 9 10 20 111
============================
逆序排練111 20 10 9 6 5 5 4 2 1

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

(0)
lvasulvasu
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • 正則表達式入門

    正則表達式入門 談到正則表達式,我們就得先了解一下POSIX。POSIX的全稱是Portable Operating System Interface foruniX,它由一系列規范構成,定義了UNIX,linux操作系統應當支持的功能,它定義了BRE(Basic Regular Expression,基本型正則表達式)和ERE(Extended Regul…

    2017-07-29
  • 初入linux_基礎(一)

    初入Linux知識點總結(一) 一、理論知識 1、時間點: 1946年 第一代計算機ENIAC誕生于美國賓州大學,特點:塊頭大、效率低 數學家馮諾?依曼提出計算機體系結構組成部分:計算器、運算器、存儲器、輸入設備、輸出設備 1969年 UNIX在美國貝爾實驗室誕生 1984年 GNU項目和軟件基金會成立 1991年 Linux在芬蘭赫爾辛基誕生 2、計算機的…

    Linux干貨 2017-02-18
  • 筆記整理:權限管理3-ACL

    ACL 訪問控制列表,并不是所有的Linux文件系統,都支持ACL。FAT文件系統也不支持ACL   ACL文件系統中,不支持chmod等命令。同時不能更改文件權限。不存在文件權限。 問題提出 只讓wang用戶,對該文件不能夠訪問,同時不影響其他任何用戶對該文件的操作。   ACL特點 針對單一用戶或群組,單一文件或目錄,進行rwx權限設…

    Linux干貨 2016-08-05
  • 自建CA搭建SSL加密網站

    企業環境中,在安全級別要求較高的公司,經常需要搭建基于SSL加密傳輸的網站,使用https協議訪問web站點,能大大提高網站的安全性。但構建https站點,需要用到證書。內部網站到互聯網上申請費用不菲的證書顯然不符合經濟性。于是,自建內部CA成為我們的首選。 本文以兩臺服務器,分別扮演CA及Web網站的角色,詳細論述自建CA搭建加密網站的過程。  …

    Linux干貨 2016-07-29
  • 馬哥教育網絡班21期-第七周課程練習

    1、創建一個10G分區,并格式為ext4文件系統;     #fdisk /dev/sdb (n;p;1;+10G;w)     #partx -a -n 1 /dev/sdb     (1…

    Linux干貨 2016-08-22
  • 文本處理工具 練習

    7.1 練習   1 、找出ifconfig 命令結果中本機的所有IPv4 地址 2 、查出分區空間使用率的最大百分比值   3 、查出用戶UID 最大值的用戶名、UID 及shell 類型 4 、查出/tmp 的權限,以數字方式顯示   5 、統計當前連接本機的每個遠程主機IP 的連接數,并按從大到小排序   &nb…

    Linux干貨 2016-08-07

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-26 12:06

    文章對所學的東西有了一個全面的梳理和總結,但對于實際操作部分,寫的過于簡略。

欧美性久久久久