脚本数组及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

编译安装
开源程序源代码的获取:
官方自建站点:
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.178linux.com/40058

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

相关推荐

  • 马哥教育网络20期+第四周课程练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 ~]# cp -r /etc/skel /home/tuser1 ~]# chmod -R go-r /home/tuser1 2、编辑/etc…

    Linux干货 2016-07-04
  • Linux终端的类型

    Linux终端可以分为如下几种类型    1、物理终端:是指通过键盘显示器直接连接到主机的方式,我们也称之为console端。    2、虚拟终端:是利用软件的方式模拟实现类似物理终端的访问方式,通常Linux内核开启6个虚拟终端,分别使用Ctrl+Alt+F1~F6实现不同tty虚拟终端之间的切换,供多用户或者多任务…

    Linux干货 2016-10-29
  • 了解Nginx

    Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝…

    Linux干货 2016-11-07
  • 马哥教育网络19期+第十六周课程练习

    编译安装LNMP 一、安装Nginx: 1、解决依赖关系 编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Libraries"。同时,还需要专门安装pcre-devel包: # yum -y ins…

    Linux干货 2016-08-22
  • Bonding多块网卡绑定同一IP地址

    Bonding多块网卡绑定同一IP地址 就是将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。当然,直接给两块网卡设置同一IP地址是不可能的。通过bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址。 一共有七种模式这里提供三种常用的:   一、Mode 0 (balance-rr)  轮转( Round-robin…

    Linux干货 2016-09-07
  • N22-第二周作业

    一.linux上的文件管理命令都有哪些,其常用的使用方法及其相关示例演示     cp复制命令:     -i:若目标文件存在,提示是否覆盖目标文件,此选项为已写入alias里,使用时为默认选项     [root@localhost ~]# ls /tmp/…

    Linux干货 2016-08-20

评论列表(1条)

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

    文章整体思路结构清晰,对数组的整个知识有了完整而全面的概述,同时yum仓库的配置与yum工具的使用时我们必会的基本技能,文章个对yum配置内容整体很完整,整篇文章能看你出作者很用心在写文章。