数组,字符串处理,mktemp命令,install命令,bash的环境配置文件,程序包编译

数组

变量:存储单个元素的内存空间

数组:存储多个元素的连续的内存空间,相当于多个变量的集合。

数组名和索引

索引:编号从0开始,属于数值索引

注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持。

bash的数组支持稀疏格式(索引不连续)

声明数组:

declare -a ARRAY_NAME(普通数组可以不加声明)

declare -A ARRAY_NAME:关联数组(关联数组必须先声明再使用)

数组赋值

数组元素的赋值:

(1)一次只赋值一个元素

declare -a menu

menu[0]=hsr

menu[1]=bjky

menu[2]=mckr

echo ${menu[*]}

       QQ图片20160824103604.png

(2)一次赋值全部元素

number=(1 3 5 6 8 9)

QQ图片20160824103046.png

unmber2=({1..9})

echo ${number2[*]}

QQ图片20160824102000.png

files=(`ls /testdir`)

echo ${files[*]}

        QQ图片20160824103920.png

file=({1,2}.{a,b})

echo ${file[*]}

1.a 1.b 2.a 2.b

        QQ图片20160824103920.png

(3)只赋值特定元素

num=([0]=100 [2]=20 [10]=1000)

echo ${num[*]}

        QQ图片20160824104156.png

(4)交互式数组值对赋值

read -a num

1 2 3 4 5

echo ${num[*]}

1 2 3 5 5

        QQ图片20160824104314.png

编号从0开始编,所以编号最大值为元素的n-1个。

echo ${#number[*]}

echo ${#var} 

统计变量number的字符数(变量的长度)。

QQ图片20160824104444.png

引用数组

取十个随机数字,取出最大值和最少值。

#!/bin/bash

declare -a rand

declare -i min

declare -i max

for i in {0..9}

do

rand[$i]=$RANDOM

[ $i -eq 0 ] && { min=${rand[$i]};max={$rand[$i]}; }

[ $min -gt ${rand[$i]} ] && min=${rand[$i]}

[ $max -lt ${rand[$i]} ] && max=${rand[$i]}

done

echo ${rand[*]}

echo max=$max

echo min=$min

QQ图片20160824110529.png

#!/bin/bash

declare -a files

file=(/var/log/*.log)

for i in `seq 0 $[${#file[*]}-1]`

do

filelines=`wc -l ${file[$i]} | cut -d" " -f1`

[ $[$i%2] -eq 0 ] && let lines+=$filelines

done

echo $lines

字符串处理

字符串切片:

${#var}:返回字符串变量var的长度

a=({1..9})

echo ${a[*]}

1 2 3 4 5 6 7 8 9

echo ${#a[*]}

9

统计变量里面字符串的数量

QQ图片20160824142425.png

${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##*/}: messages

echo ${var#*word}

第一个word之前的都删除

echo ${var##*word}

全部word的之前都删除

从左到右

QQ图片20160824142655.png

echo ${var%word*}

最后一个word之前的都删除

echo ${var%%word*}

全部word的之后都删除

从右到左

QQ图片20160824142844.png

${var%word*}:其中word可以是指定的任意字符;

功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;

file="/var/log/messages"

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

${var%%word*}:同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符;

查找替换:

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

QQ图片20160824143134.png

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

QQ图片20160824143314.png

${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之

QQ图片20160824143557.png

${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替换之

QQ图片20160824143659.png

查找并删除:

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

${var//pattern}:所有

${var/#pattern}:行首

${var/%pattern}:行尾

QQ图片20160824143856.png

字符大小写转换:

${var^^}:把var中的所有小写字母转换为大写

${var,,}:把var中的所有大写字母转换为小写

QQ图片20160824144404.png

变量赋值

${var:-value}:如果var为空或未设置,那么返回value;否则,则返回var的值

echo ${var:-mage}  ($var为空)

mage

${var:+value}:如果var不空,则返回value

echo ${var:+mage}  ($var不为空)

mage

(为空则返回空值)

${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则,则返回var的值

echo ${var:=mage}  ($var为空)

mage

echo ${var:=mage}  ($var不为空)

haha

${var:?error_info}:如果var为空或未设置,那么返回error_info;否则,则返回var的值

echo ${var:?mage}  ($var为空)

mage

echo ${var:?mage}  ($var不为空)

haha

建立一个文件,专门放置变量。

Shell变量一般是无类型的,但是bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是完全等价的

declare [选项] 变量名

-r 将变量设置为只读属性

-i 将变量定义为整型数

-a 将变量定义为数组

-A 关联数组必须先用声明

-f 显示此脚本前定义过的所有函数名及其内容

-F 仅显示此脚本前定义过的所有函数名

declare -F

-x 将变量声明为环境变量

-l 将变量值转为小写字母

declare -l var=AAAAA

echo $var

aaaaa

-u 将变量值转为大写字母

declare -u var=aaaaa

echo $var

AAAAA

QQ图片20160824144700.png

declare 会确实使元数据改变

间接变量引用

v1=name

name=wang

eval v3=\$$v1

echo $v3

echo ${!v1}

QQ图片20160824145043.png

会随着前一个变量的改变而影响下一个相关联的变量。

cmd=hostname

'echo $cmd' = eval $cmd

eval 等于执行了两次的扫描,第一次扫描出cmd=hostanme,第二次运行执行命令。

QQ图片20160824145200.png

创建临时文件

mktemp命令;创建的临时文件可以避免冲突。

mktemp file(名称).XXX

                  .XXX(固定格式)

生成的临时的文件.后续的三位随机。

不写路径默认在当前目录下生成。

mktemp -p /testdir/ tmp.XXX

  -d 可以生成文件目录

  -p 生成文件

QQ图片20160824145351.png

安装复制文件


install命令

install一般都只用与复制二进制文件

install -m 666 -o zczx -g bin f1 /testdir/f111

选项:

-m MODE,默认755 权限修改

-o OWNER 属主更改

-g GROUP 属组更改

QQ图片20160824145702.png

bash如何展开命令行(运行级别又上到下)

把命令行分成单个命令词

展开别名

展开大括号种的声明({})

展开波浪符声明(~)

命令替换$()和“)

再次把命令行分成命令词

展开文件通配(*、?、[abc]等等)

准备I/0重导向(<、>)

运行命令

反斜线(\)会使随后的字符按原意解释

$echoYourcost:\$5.00

Yourcost:$5.00

加引号来防止扩展

单引号(’)防止所有扩展

双引号(”)也防止所有扩展,但是以下情况例外:

$(美元符号)-变量扩展

`(反引号)-命令替换

\(反斜线)-禁止单个字符扩展

!(叹号)-历史命令替换

bash的环境配置文件

全局配置:

/etc/prolfie

/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)suUserName

    (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类:为非交互式和交互式登录的shell提供配置

全局:/etc/bashrc

个人:~/.bashrc

功用:

(1) 定义命令别名和函数

(2) 定义本地变量

修改profile和bashrc文件后需生效

两种方法:

1重新启动shell进程

2 . 或source

例:

. ~/.bashrc

Bash 退出任务

保存在~/.bash_logout文件中(用户)

在退出登录shell时运行

用于

创建自动备份

清除临时文件

/etc/profile.d 

yum

yum的命令行选项:

–nogpgcheck:禁止进行gpgcheck

y: 自动回答为“yes”

-q:静默模式

–disablerepo=repoidglob:临时禁用此处指定的repo

–enablerepo=repoidglob

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>

yum -y install createrepo 

baseurl=ftp://mirrors,maged.com/$releasever/$basearch

程序包编译

程序包编译安装:

Application-VERSION-release.src.rpm–> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装

源代码–>预处理–>编译(gcc)–>汇编–>链接–>执行

make 项目管理器

源代码组织格式:

多文件:文件中的代码之间,很可能存在跨文件依赖关系

C、C++:make (项目管理器,configure –>Makefile.in –> makefile)

java: maven

编译安装

C代码编译安装三步骤:

1、./configure:(生成makefile)

(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及makefile.in文件生成makefile

(2) 检查依赖到的外部环境

2、make:根据makefile文件,构建应用程序

3、make install:复制文件到相应路径

在解压缩的时候进行的操作。

开发工具:

autoconf: 生成configure脚本

automake:生成Makefile.in

注意:安装前查看INSTALL,README

c/c++编译器: gcc(GNU C Complier)

编译C源代码:

前提:提供开发工具及开发环境

开发工具:make, gcc等

开发环境:开发库,头文件

glibc:标准库

通过“包组”提供开发组件

CentOS 6: "Development Tools"

"Server Platform Development"

源码安装apachectl

1安装develpment tools

yum grouplist

yum groupinstall "Development Tools" "Security Tools"

2下载

tar xvf http-2.2.29.tar.bz2

3设置解压的目录,设置的目录

./configure –prefix=/usr/local/http2 –sysconfdir=/etc/http2

4

make

make install

5在设置文件中加入新装包的man路径

vim /etc/man_db.conf

6 apachectl start

QQ图片20160824184659.png

80端口已经成功开启

编译安装

第一步: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

原创文章,作者:swzczx,如若转载,请注明出处:http://www.178linux.com/39468

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

相关推荐

  • KVM虚拟化平台部署及管理

    前言 KVM即Kernel Virtual Machine,最初是由以色列公司Qumranet开发。2007年2月被导入Linux 2.6.20核心中,成为内核源代码的一部分。2008年9月4日,Redhat收购了Qumranet,至此Redhat拥有了自己的虚拟化解决方案,之后便舍弃Xen开始全面扶持KVM,从RHEL6开始KVM便被默认内置于内核中。本文…

    Linux干货 2015-07-19
  • Linux程序包管理相关

    前言 首先说说一个软件的诞生过程: 程序员用编程语言写文本格式的源代码,但是计算机只能读懂二进制文件,那么就需要将源代码转换成二进制格式,这个过程称为编译。编译用的工具称为编译器,编译器有很多种,在Linux上常用gcc这个编译器。利用编译器,得到二进制格式的文件(二进制程序(Windows上.exe.msi,Linux.elf)、库文件、配置文件、帮助文件…

    Linux干货 2018-01-04
  • 通过虚拟机制作RAID5

    制作RAID5的过程,包括制作RAID5的制作,增加和删除RAID

    2017-12-10
  • Net25-第10周作业

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) Centos系统启动过程分内核空间启动和用户空间启动: 内核空间启动流程: POST: post加点自检,检测计算机基本5大件是否完好,计算机可被正常点亮。 BootSequence: 位于ROM上的BIOS的BootSequence来选择启动顺序 Bootloader: 决定启动顺…

    Linux干货 2017-03-15
  • Linux常用命令说明

    个人认为把操作练习打在博客上比较愚蠢,关于操作部分我将以练习题的形式展示,每周固定练习这些基础的题目 Linux常见命令练习 1.文本内容显示 1.1cat: (1)显示/root下adjtime文件内容 (2)把文件mm.txt的文件内容加上行号输入到textfile2文件中 (3)把文件mm.txt和textfile2的文件内容加上行号(空白行不加)之后…

    Linux干货 2016-10-29
  • 权限管理

    权限管理包括普通权限、特殊权限、默认权限、ACL权限。 这些权限都是针对u(owner)、g(group)、o(other)三类定义的。 设置权限时文件和目录不同(此处把文件和目录分开,一般说文件就包含目录(linux思想:一切皆文件))如下图所示, 分别用两个用户分别创建了一个目录一个文件,可以看到同是目录的liutest和test的权限不同,它俩同为目录…

    Linux干货 2017-07-30

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-26 14:01

    文章对当天所学东西总结的很详细,但是而没有通过自己的文字总结成通顺的话语,这是不合适的,建议以后尝试通过自己的语言将内容的知识点进行总结与梳理,写出优秀的博客。