腳本數組及yum軟件包管理器

一、數組

變量:存儲單個元素的內存空間

數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。

數組名和索引
索引:編號從0開始,屬于數值索引
注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0版本之后開始支持。
bash的數組支持稀疏格式(索引不連續)

1.定義數組
聲明數組:
    declare -a ARRAY_NAME
    declare -A ARRAY_NAME: 關聯數組
數組元素的賦值:
    (1) 一次只賦值一個元素;
        ARRAY_NAME[INDEX]=VALUE
        weekdays[0]="Sunday"

        weekdays[4]="Thursday"

12 50 05 --.png

    (2) 一次賦值全部元素:

        ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)

12 44 58 --.png

    (3) 只賦值特定元素:

        ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)

12 46 48 --.png

    (4) 交互式數組值對賦值

        read -a ARRAY

12 48 16 --.png

2.引用數組
引用數組元素:${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下標為0的元素

數組的長度(數組中元素的個數):${#ARRAY_NAME[*]} 或 ${#ARRAY_NAME[@]}

13 01 47 --.png

示例:生成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"

練習:編寫腳本,定義一個數組,數組中的元素是/var/log目錄下所有以.log結尾的文件;要統計其下標為偶數的文件中的行數之和

#!/bin/bash
#
declare -a files
files=(/var/log/*.log)
declare -i lines=0
for i in $(seq 0 $[${#files[*]}-1]) ; do
    if [ $[$i%2] -eq 0 ];then
        let lines+=$(wc -l ${files[$i]} | cut -d' ' -f 1)
    fi
done
echo "Lines: $lines."

3.數組數據處理

所有元素:${ARRAY[@]}, ${ARRAY[*]}

12 52 52 --.png

數組切片:${ARRAY[@]:offset:number}    (offset: 要跳過的元素個數,number: 要取出的元素個數)

取偏移量之后的所有元素: ${ARRAY[@]:offset}

12 57 05 --.png

向數組中追加元素:ARRAY[${#ARRAY[*]}]

刪除數組中的某元素,導致稀疏格式:unset ARRAY[INDEX]

13 46 36 --.png

關聯數組(使用自定義的索引表,而非0,1,2,3……):
    declare -A ARRAY_NAME

    ARRAY_NAME=([idx_name1]='val1'  [idx_name2]='val2‘…)

13 49 59 --.png

4.字符串處理
(1).字符串切片:
${#var}:返回字符串變量var的長度
${var:offset}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,到最后的部分,offset的取值在0 到${#var}-1 之間(bash4.2后,充許為負值)
${var:offset:number}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,長度為number的部分

${var: -lengh}: 取字符串的最右側幾個字符:注意:冒號后必須有一空白字符

13 55 27 --.png

(2).基于模式取子串:
${var#*word}:其中word可以是指定的任意字符
    功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符

${var##*word}:同上,不同的是,刪除的是字符串開頭至最后一次由word指定的字符之間的所有內容

20 44 33 --.png

示例:
file="/var/log/messages"
${file##*/}: messages

${var%word*}:其中word可以是指定的任意字符;
    功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word,刪除字符串最后一個字符向左至第一次出現word字符之間的所有字符;

${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最后一次出現word字符之間的所有字符;

20 45 20 --.png

示例:
file="/var/log/messa

${file%/*}: /var/log

url=http://www.magedu.com:80
${url##*:} :80
${url%%:*} :http

(3).查找并替換:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之

${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之

20 47 01 --.png

${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之
20 50 55 --.png(4).查找并刪除:
${var/#pattern}:行首

${var/%pattern}:行尾

${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串

${var//pattern}:所有

20 53 45 --.png

字符大小寫轉換:
${var^^}:把var中的所有小寫字母轉換為大寫
${var,,}:把var中的所有大寫字母轉換為小寫

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

(6).高級變量用法-有類型變量
Shell變量一般是無類型的,但是bash Shell提供了declare和typeset兩個命令用于指定變量的類型,兩個命令是完全等價的
declare [選項] 變量名

-r 將變量設置為只讀屬性

20 56 20 --.png

-i 將變量定義為整型數
-a 將變量定義為數組
-A 將變量定義為關聯數組
-f 顯示此腳本前定義過的所有函數名及其內容
-F 僅顯示此腳本前定義過的所有函數名
-x 將變量聲明為環境變量
-l 將變量值轉為小寫字母
-u 將變量值轉為大寫字母

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

bash Shell提供了兩種格式實現間接變量引用
eval tempvar=\$$variable1
tempvar=${!variable1}
21 05 20 --.pngeval命令將會首先掃描命令行進行所有的置換,然后再執行該命令。該命令適用于那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描。
示例:
[root@server ~]# V1=pwd
[root@server ~]# echo $V1
pwd
[root@server ~]# eval $V1
/root

創建臨時文件
mktemp[OPTION]… [TEMPLATE]  創建的臨時文件可避免沖突(TEMPLATE: filename.XXX ;X至少要出現三個)
OPTION:
-d: 創建臨時目錄

–tmpdir=/DIR:指明臨時文件所存放的目錄位置

21 08 00 --.png

示例:
#mktemp–tmpdir=/testdirtest.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

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

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

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

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

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

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

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

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

練習
1、讓用戶(管理員或所有用戶)的PATH環境變量的值多出一個路徑,例如多如/usr/local/apache2/bin
2、用戶wang登錄時自動啟用別名rm=‘rm –i’
3、用戶登錄時,顯示紅色字體的警示提醒信息“hi,dangerous!”

二、yum程序包管理
顯示倉庫列表:
repolist[all|enabled|disabled]
顯示程序包:
list

  yum list [all | glob_exp1] [glob_exp2] […]

21 09 42 --.png

  yum list {available|installed|updates} [glob_exp1] […]
安裝程序包:
install package1 [package2] […]
reinstall package1 [package2] […] (重新安裝)

yum
升級程序包:
update [package1] [package2] […]
downgrade package1 [package2] […] (降級)
檢查可用升級:
check-update
卸載程序包:
{remove|erase} package1 [package2] […]

yum
查看程序包information:

info […

21 11 32 --.png

查看指定的特性(可以是某文件)是由哪個程序包所提供:

{provides|whatprovides} feature1 [feature2] […]

21 13 44 --.png

清理本地緩存:
clean [ packages | metadata | expire-cache | rpmdb| plugins | all ]
構建緩存:
makecache

yum
搜索:search string1 [string2] […]

以指定的關鍵字搜索程序包名及summary信息

21 14 24 --.png

查看指定包所依賴的capabilities:

deplist package1 [package2] […]

21 15 09 --.png

查看yum事務歷史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

yum history

21 15 53 --.png

yum history info 6

21 16 18 --.png

yum history undo 6
日志:/var/log/yum.log

yum
安裝及升級本地程序包:
 localinstall rpmfile1 [rpmfile2] […]
(用install替代)
 localupdate  rpmfile1 [rpmfile2] […]
(用update替代)
包組管理的相關命令:

groupinstall group1 [group2] […]

21 18 53 --.png

groupupdate group1 [group2] […]

grouplist [hidden] [groupwildcard] […]

21 17 51 --.png

groupremove group1 [group2] […]

groupinfo group1 […]

21 20 03 --.png

yum
如何使用光盤當作本地yum倉庫:
(1) 掛載光盤至某目錄,例如/media/cdrom
   mount /dev/cdrom  /media/cdrom
(2) 創建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=

yum
yum的命令行選項:
–nogpgcheck:禁止進行gpgcheck
-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>

程序包編譯
程序包編譯安裝:
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

編譯安裝
開源程序源代碼的獲?。?br />官方自建站點:
apache.org (ASF)
mariadb.org

代碼托管:
SourceForge.net
Github.com
code.google.com
c/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

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

#!/bin/bash

echo "Please input a list:"
read -a arr
for((i=0;i<${#arr[@]};i++))
do
    for((j=${#arr[@]}-1;j>i;j–));do
        if [[ ${arr[j]} -lt ${arr[j-1]} ]];then
           t=${arr[j]}
           arr[j]=${arr[j-1]}
           arr[j-1]=$t
        fi
    done
done
echo "sort:"
echo ${arr[@]}

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

(0)
anonymousanonymous
上一篇 2016-08-24 22:10
下一篇 2016-08-25 10:09

相關推薦

  • ?CentOS安裝程序{ 源碼包安裝;rpm包安裝;}&&恢復rpm功能

    ?CentOS安裝程序{ 源碼包安裝;rpm包安裝;}&&恢復rpm功能 本文是繼上一篇文章“CentOS程序安裝的3種方式{ 源碼包安裝 | rpm包安裝 | yum安裝;}”的補充,上篇文章http://www.www58058.com/38812主要介紹了yum安裝軟件的方法以及歸納了詳細的yum命令。本文繼續介紹基于本地file、遠程…

    Linux干貨 2016-08-24
  • vim編輯器

    vim編輯器:          文本:ASCII, Unicode(全球統一編碼格式)          文本編輯種類:       &n…

    Linux干貨 2016-08-10
  • 高可用Nginx

    高可用Nginx 基于vrrp流動一個IP地址 各節點時間必須同步; 確保iptables以及selinux不會成為阻礙; 各節點之間可通過主機名互相同喜(對KA而言并非必須) 確保各節點的用于集群服務的接口支持MULTICAST通信 IPv4,D類地址224-239 環境: node1:172.16.253.223 li1.jing.io node1 no…

    Linux干貨 2017-06-28
  • iptables

    Evernote Export   基于本機服務器的iptables: 創建、重命名、刪除自定義chain ~]# iptables -N testchain ~]# iptables -nL Chain INPUT (policy ACCEPT) target     prot opt source    …

    Linux干貨 2016-11-20
  • lvs-dr模型

    dr 模型 1、?directory ,node1 ,node2 三臺主機都是一塊網塊, 并且網卡都為橋接,且node1,nod2,不需要指定網關 在director主機中執行   #ip addr add 192.168.1.20/32 dev ens33 # ipvsadm -A -t 192.168.1.20:80 -s rr # ipvsa…

    Linux干貨 2017-08-26
  • Bash Shell腳本基礎-變量類型-位置變量

    Bash Shell腳本基礎–變量類型–位置變量   §·bash shell腳本編程概述: 1 §·bash shell腳本中的變量 2     *什么是變量 2     *變量的類型 2     *ba…

    Linux干貨 2016-08-12

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-25 14:02

    文章整體思路結構清晰,對數組的整個知識有了完整而全面的概述,同時yum倉庫的配置與yum工具的使用時我們必會的基本技能,文章個對yum配置內容整體很完整,整篇文章能看你出作者很用心在寫文章。

欧美性久久久久