数组
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合。
数组名和索引
索引:编号从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] <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
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
评论列表(1条)
文章对当天所学东西总结的很详细,但是而没有通过自己的文字总结成通顺的话语,这是不合适的,建议以后尝试通过自己的语言将内容的知识点进行总结与梳理,写出优秀的博客。