一、数组
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合。
数组名和索引
索引:编号从0开始,属于数值索引
注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持。
bash的数组支持稀疏格式(索引不连续)
1.定义数组
声明数组:
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 关联数组
数组元素的赋值:
(1) 一次只赋值一个元素;
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[4]="Thursday"
(2) 一次赋值全部元素:
ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)
(3) 只赋值特定元素:
ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)
(4) 交互式数组值对赋值
read -a ARRAY
2.引用数组
引用数组元素:${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下标为0的元素
数组的长度(数组中元素的个数):${#ARRAY_NAME[*]} 或 ${#ARRAY_NAME[@]}
示例:生成10个随机数保存于数组中,并找出其最大值
#!/bin/bash declare -a rand declare -i max=0 for i in {0..9} ; do rand[$i]=$RANDOM echo ${rand[$i]} [ ${rand[$i]} -gt $max ] && max=${rand[$i]} done echo "Max: $max"
练习:编写脚本,定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件;要统计其下标为偶数的文件中的行数之和
#!/bin/bash # declare -a files files=(/var/log/*.log) declare -i lines=0 for i in $(seq 0 $[${#files[*]}-1]) ; do if [ $[$i%2] -eq 0 ];then let lines+=$(wc -l ${files[$i]} | cut -d' ' -f 1) fi done echo "Lines: $lines."
3.数组数据处理
所有元素:${ARRAY[@]}, ${ARRAY[*]}
数组切片:${ARRAY[@]:offset:number} (offset: 要跳过的元素个数,number: 要取出的元素个数)
取偏移量之后的所有元素: ${ARRAY[@]:offset}
向数组中追加元素:ARRAY[${#ARRAY[*]}]
删除数组中的某元素,导致稀疏格式:unset ARRAY[INDEX]
关联数组(使用自定义的索引表,而非0,1,2,3……):
declare -A ARRAY_NAME
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘…)
4.字符串处理
(1).字符串切片:
${#var}:返回字符串变量var的长度
${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0 到${#var}-1 之间(bash4.2后,充许为负值)
${var:offset:number}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var: -lengh}: 取字符串的最右侧几个字符:注意:冒号后必须有一空白字符
(2).基于模式取子串:
${var#*word}:其中word可以是指定的任意字符
功能:自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字符串开头至第一次出现word字符之间的所有字符
${var##*word}:同上,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容
示例:
file="/var/log/messages"
${file##*/}: messages
${var%word*}:其中word可以是指定的任意字符;
功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;
${var%%word*}:同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符;
示例:
file="/var/log/messa
${file%/*}: /var/log
url=http://www.magedu.com:80
${url##*:} :80
${url%%:*} :http
(3).查找并替换:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替换之
${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替换之
${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替换之
(4).查找并删除:
${var/#pattern}:行首
${var/%pattern}:行尾
${var/pattern}:查找var所表示的字符串中,删除第一次被pattern所匹配到的字符串
${var//pattern}:所有
字符大小写转换:
${var^^}:把var中的所有小写字母转换为大写
${var,,}:把var中的所有大写字母转换为小写
(5).变量赋值
${var:-value}:如果var为空或未设置,那么返回value;否则,则返回var的值
${var:+value}:如果var不空,则返回value
${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则,则返回var的值
${var:?error_info}:如果var为空或未设置,那么返回error_info;否则,则返回var的值
为脚本程序使用配置文件,实现变量赋值
定义文本文件,每行定义“name=value”
在脚本中source此文件即可
(6).高级变量用法-有类型变量
Shell变量一般是无类型的,但是bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是完全等价的
declare [选项] 变量名
-r 将变量设置为只读属性
-i 将变量定义为整型数
-a 将变量定义为数组
-A 将变量定义为关联数组
-f 显示此脚本前定义过的所有函数名及其内容
-F 仅显示此脚本前定义过的所有函数名
-x 将变量声明为环境变量
-l 将变量值转为小写字母
-u 将变量值转为大写字母
(7).间接变量引用
variable1=variable2
variable2=value
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用
variable1的值是variable2,而variable2又是变量名,variable2的值为value,间接变量引用是指通过variable1获得变量值value的行为
bash Shell提供了两种格式实现间接变量引用
eval tempvar=\$$variable1
tempvar=${!variable1}
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。
示例:
[root@server ~]# V1=pwd
[root@server ~]# echo $V1
pwd
[root@server ~]# eval $V1
/root
创建临时文件
mktemp[OPTION]… [TEMPLATE] 创建的临时文件可避免冲突(TEMPLATE: filename.XXX ;X至少要出现三个)
OPTION:
-d: 创建临时目录
–tmpdir=/DIR:指明临时文件所存放的目录位置
示例:
#mktemp–tmpdir=/testdirtest.XXXXXX
安装复制文件
install命令:
install [OPTION]… [-T] SOURCE DEST 单文件
install [OPTION]… SOURCE… DIRECTORY
install [OPTION]… -t DIRECTORY SOURCE…
install [OPTION]… -d DIRECTORY…创建空目录
选项:
-m MODE,默认755
-o OWNER
-g GROUP
bash如何展开命令行
把命令行分成单个命令词
展开别名
展开大括号种的声明({})
展开波浪符声明(~)
命令替换$()和“)
再次把命令行分成命令词
展开文件通配(*、?、[abc]等等)
准备I/0重导向(<、>)
运行命令
防止扩展
反斜线(\)会使随后的字符按原意解释
$echoYourcost:\$5.00
Yourcost:$5.00
加引号来防止扩展
单引号(’)防止所有扩展
双引号(”)也防止所有扩展,但是以下情况例外:
$(美元符号)-变量扩展
`(反引号)-命令替换
\(反斜线)-禁止单个字符扩展
!(叹号)-历史命令替换
bash的配置文件(按生效范围划分,存在两类)
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
shell登录两种方式
交互式登录:
直接通过终端输入账号密码登录;
使用“su-UserName”切换的用户
执行顺序:
/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile–> ~/.bashrc–> /etc/bashrc
非交互式登录:
suUserName
图形界面下打开的终端
执行脚本
执行顺序:
~/.bashrc–> /etc/bashrc–> /etc/profile.d/*.sh
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时运行
用于
创建自动备份
清除临时文件
练习
1、让用户(管理员或所有用户)的PATH环境变量的值多出一个路径,例如多如/usr/local/apache2/bin
2、用户wang登录时自动启用别名rm=‘rm –i’
3、用户登录时,显示红色字体的警示提醒信息“hi,dangerous!”
二、yum程序包管理
显示仓库列表:
repolist[all|enabled|disabled]
显示程序包:
list
yum list [all | glob_exp1] [glob_exp2] […]
yum list {available|installed|updates} [glob_exp1] […]
安装程序包:
install package1 [package2] […]
reinstall package1 [package2] […] (重新安装)
yum
升级程序包:
update [package1] [package2] […]
downgrade package1 [package2] […] (降级)
检查可用升级:
check-update
卸载程序包:
{remove|erase} package1 [package2] […]
yum
查看程序包information:
info […
查看指定的特性(可以是某文件)是由哪个程序包所提供:
{provides|whatprovides} feature1 [feature2] […]
清理本地缓存:
clean [ packages | metadata | expire-cache | rpmdb| plugins | all ]
构建缓存:
makecache
yum
搜索:search string1 [string2] […]
以指定的关键字搜索程序包名及summary信息
查看指定包所依赖的capabilities:
deplist package1 [package2] […]
查看yum事务历史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
yum history
yum history info 6
yum history undo 6
日志:/var/log/yum.log
yum
安装及升级本地程序包:
localinstall rpmfile1 [rpmfile2] […]
(用install替代)
localupdate rpmfile1 [rpmfile2] […]
(用update替代)
包组管理的相关命令:
groupinstall group1 [group2] […]
groupupdate group1 [group2] […]
grouplist [hidden] [groupwildcard] […]
groupremove group1 [group2] […]
groupinfo group1 […]
yum
如何使用光盘当作本地yum仓库:
(1) 挂载光盘至某目录,例如/media/cdrom
mount /dev/cdrom /media/cdrom
(2) 创建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=
yum
yum的命令行选项:
–nogpgcheck:禁止进行gpgcheck
-y: 自动回答为“yes”
-q:静默模式
–disablerepo=repoidglob:临时禁用此处指定的repo
–enablerepo=repoidglob:临时启用此处指定的repo
–noplugins:禁用所有插件
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>
程序包编译
程序包编译安装:
Application-VERSION-release.src.rpm–> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装
源代码–>预处理–>编译(gcc)–>汇编–>链接–>执行
源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系
C、C++:make (项目管理器,configure –>
Makefile.in –> makefile)
java: maven
编译安装
C代码编译安装三步骤:
1、./configure:
(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及makefile.in文件生成makefile
(2) 检查依赖到的外部环境
2、make:根据makefile文件,构建应用程序
3、make install:复制文件到相应路径
开发工具:
autoconf: 生成configure脚本
automake:生成Makefile.in
注意:安装前查看INSTALL,README
编译安装
开源程序源代码的获取:
官方自建站点:
apache.org (ASF)
mariadb.org
…
代码托管:
SourceForge.net
Github.com
code.google.com
c/c++编译器: gcc(GNU C Complier)
编译安装
编译C源代码:
前提:提供开发工具及开发环境
开发工具:make, gcc等
开发环境:开发库,头文件
glibc:标准库
通过“包组”提供开发组件
CentOS 6: "Development Tools",
"Server Platform Development",
编译安装
第一步: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
生成10个随机数,采用冒泡算法进行升序或降序排序
#!/bin/bash
echo "Please input a list:"
read -a arr
for((i=0;i<${#arr[@]};i++))
do
for((j=${#arr[@]}-1;j>i;j–));do
if [[ ${arr[j]} -lt ${arr[j-1]} ]];then
t=${arr[j]}
arr[j]=${arr[j-1]}
arr[j-1]=$t
fi
done
done
echo "sort:"
echo ${arr[@]}
原创文章,作者:anonymous,如若转载,请注明出处:http://www.178linux.com/40058
评论列表(1条)
文章整体思路结构清晰,对数组的整个知识有了完整而全面的概述,同时yum仓库的配置与yum工具的使用时我们必会的基本技能,文章个对yum配置内容整体很完整,整篇文章能看你出作者很用心在写文章。