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.178linux.com/39794

(0)
上一篇 2016-08-24 21:22
下一篇 2016-08-24 21:22

相关推荐

  • 常见HTTP code大全

    1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。 代码 说明 100 (继续) 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。  101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。 2xx (成功)表示成功处理了请求的状…

    Linux干货 2016-09-19
  • 马哥教育网络班21期+第4周课程练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@centos ~]# cp -r /etc/skel /home/tuser1 [root@centos ~]# ls -aldh&…

    Linux干货 2016-07-29
  • Hello World, Hello Linux.

    文笔不好,请见谅。

    2018-03-26
  • 第一周学习总结

    俗话说,好记性不如烂笔头,在当今移动互联网横行的时代,烂笔头就是网络,而笔记本就是各种平台。 作为一个IT人,有人突然问你计算机是啥,你可能不会像学文科的人一样给他说,就是电脑啊。这时候就是凸显IT知识技能的时候了,那么我下面就给您慢慢的道来。 在1946年美籍匈牙利人冯·诺依曼首次提出了自己的计算机体系理论,简称冯·诺依曼体系,主要是说计算机由五大基本部件…

    2017-12-14
  • shell-语句总结

    shell脚本语法总结 过程式编程语言: 顺序执行 选择执行 循环执行 shell默认是顺序执行,如果有判断或循环语句则执行判断或循环。 条件判断 if     单分支         if 判断条件:then  &nb…

    Linux干货 2016-08-21
  • linux软链接与硬链接的区别

    硬链接:相于当给文件增加了一个新名 在添加链接时会增加链接数,其inode结点数不会增加 支持绝对路径与相对路径 硬链接不能对目录来创建 不能跨分区来创建链接 硬链接链接到文件被删除时,依旧可以通过链接文件来访问被删文件的数据 软链接:可以支持对目录来创建链接 (注,当你用rm -rf 删除目录的时候,目录不会删除,但目录中的内容会被删除,并且会删除源文件)…

    Linux干货 2013-07-15

评论列表(1条)

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

    文章对所学的东西有了一个全面的梳理和总结,但对于实际操作部分,写的过于简略。