数组,字符串处理,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

相关推荐

  • LVS负载均衡集群详解

    一、LVS概述  1.LVS:Linux Virtual Server          四层交换(路由):根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(根据调度算法);      …

    系统运维 2016-04-30
  • Linux作业管理、网络客户端工具和bash循环

    Linux系统作业控制;                   job:         前台作业foregroud:通过终端启动,且启动后会一直占据终端;         后台作业…

    Linux干货 2017-01-05
  • 马哥教育网络20期+第六周课程练习

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; :%s/^[[:space:]]/#&/ 2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白…

    Linux干货 2016-07-07
  • ☞实时数据同步方案{ rsync; inotify; }

    实时数据同步方案{ rsync; inotify; } rsync 传输数据 安装 rsyncd 服务 CentOS 6 CentOS 7 配置 rsyncd 服务 配置 rsync 手动同步示例     启动 rsyncd 服务 CentOS 6 CentOS 7 rsync 客户端命令 rsync 数据传输功能 基…

    Linux干货 2016-10-29
  • N25-第一周博客作业

    1、描述计算机的组成及其功能:    没有听马哥视频之前,计算机的组成理解为主机+显示器;    听完视频之后,对计算机的组成分为硬件系统和软件系统。    硬件系统主要有:运算器、控制器、存储器、输入设备和输出设备;    软件系统主要有…

    Linux干货 2016-12-04
  • 分布式文件系统之MogileFS

    MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和…

    Linux干货 2017-06-16

评论列表(1条)

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

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