数组,字符串处理,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)
上一篇 2016-08-24 21:21
下一篇 2016-08-24 21:21

相关推荐

  • X-Y Problem

    X-Y Problem 对于X-Y Problem的意思如下: 1)有人想解决问题X2)他觉得Y可能是解决X问题的方法3)但是他不知道Y应该怎么做4)于是他去问别人Y应该怎么做? 简而言之,没有去问怎么解决问题X,而是去问解决方案Y应该怎么去实现和操作。于是乎: 1)热心的人们帮助并告诉这个人Y应该怎么搞,但是大家都觉得Y这个方案有点怪异。2)在经过大量地讨…

    Linux干货 2016-08-15
  • linux下手工创建新用户

    当我们要创建一个用户时,通常使用useradd命令就可以自动创建了一个用户;实际上,在linux下,一切皆文件,设置好几个文件,也是可以创建出一个用户: 文件如下: /etc/passwd  :用户 /etc/shadow  :密码 /home/username:用户家目录 /etc/group:用户组 /etc/skel/*: &nbs…

    Linux干货 2015-03-30
  • Linux boot分区意外格式化或清除之后…

    boot分区在没有备份的情况下意外被清空,包括启动引导信息也没了。这时若Linux还在运行,那你是幸运的, 修复的方法: 1. cat  /etc/*release      #赶快先确定当前系统的具体版本。有ISO镜像赶快挂载上来.   &nbsp…

    Linux干货 2016-03-22
  • 博客启动计划&我个人理解的Python优缺点

    很久没有写博客了,因为最近一直在使用Python。Python实在不是一门好的工作用语言(我的观点是所有的动态语言都不是好的工作用语言,不仅是Python),但是自己玩还是可以的。但,生活所迫,还是要继续用的呀(笑)。 所以呢,博客还是要写的,java还是最喜欢的,Python也是要学习的,当然其实更多是总结了。既然博客要启动了,这篇文字就权当测试吧,使用公…

    Linux干货 2015-03-13
  • 1.初识linux

    1.计算机组成 计算机五大部件:运算器、控制器、存储器、输入设备、输出设备。对应实际情况大致如下: CPU CPU(Central Processing Unit)主要包含运算器、控制器;也包含寄存器、缓存用于辅助: CPU在同一时间能并行处理的二进制数的位数称为CPU字长。字长由CPU对外数据通路的数据总线条数决定。 运算器 运算器也称…

    Linux干货 2016-08-22
  • 01day-计算机与操作系统基础

    第1章 计算机基础 1.1 什么是计算机 计算机是个笼统的概念,泛指一切计算功能的机器。这样扯的话,以前的算盘也是计算机了。我们现在的计算机应该称作电子计算机,我天朝人民称为电脑。听说谷歌在研究量子计算机,完全不懂是什么玩意。 一不小心在百度百科看到还有光子计算机,生物计算机,吓我一跳,赶紧复制链接过来,自己慢慢看《百度百科—-计算机》 &nbs…

    Linux干货 2016-06-29

评论列表(1条)

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

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