数组

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

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


数组名和索引

索引:编号从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[*]}

       

(2)一次赋值全部元素

number=(1 3 5 6 8 9)

unmber2=({1..9})

echo ${number2[*]}

files=(`ls /testdir`)

echo ${files[*]}

        

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

echo ${file[*]}

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

        

(3)只赋值特定元素

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

echo ${num[*]}


        

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

read -a num

1 2 3 4 5

echo ${num[*]}

1 2 3 5 5

        

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


echo ${#number[*]}

echo ${#var} 

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


引用数组

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

#!/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


#!/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

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

${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的之前都删除

从左到右

echo ${var%word*}

最后一个word之前的都删除

echo ${var%%word*}

全部word的之后都删除

从右到左

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

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

file="/var/log/messages"

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

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



查找替换:


${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的值

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

declare 会确实使元数据改变


间接变量引用

v1=name

name=wang

eval v3=\$$v1

echo $v3


echo ${!v1}

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


cmd=hostname

'echo $cmd' = eval $cmd

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


创建临时文件


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

mktemp file(名称).XXX

                  .XXX(固定格式)


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

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

mktemp -p /testdir/ tmp.XXX

  -d 可以生成文件目录

  -p 生成文件



安装复制文件


install命令

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


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


选项:

-m MODE,默认755 权限修改


-o OWNER 属主更改


-g GROUP 属组更改


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]

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

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