shell 脚本之数组 和 yum 【下】

数组

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

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

数组名和索引

索引:编号从0开始,属于数值索引

注意:索引可支持使用自定义的格式,而不仅是数值格式 ,即为关联索引,bash4.0版本之后开始支持。 bash的数组支持稀疏格式(索引不连续)

声明数组: 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

引用数组

引用数组元素:${ARRAY_NAME[INDEX]}

注意:省略[INDEX]表示引用下标为0的元素

数组的长度(数组中元素的个数):

${#ARRAY_NAME[*]}

${#ARRAY_NAME[@]}

示例:生成10个随机数保存于数组中,并找出其最大值和最小值

#!/bin/bash

declare -a rand

declare -i max=0

declare –i min=32767

for i in {0..9}; do

rand[$i]=$RANDOM

echo ${rand[$i]}

[ ${rand[$i]} -gt $max ] && max=${rand[$i]}

[ ${rand[$i]} -lt $min ] && min=${rand[$i]}

done

echo "Max: $max  Min:$min"

编写脚本,定义一个数组,数组中的元素是/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‘ ‘ -f1)

fi

done

echo "Lines: $lines."

数组数据处理

引用数组中的元素:

所有元素:

${ARRAY[@]}, ${ARRAY[*]}

数组切片:

${ARRAY[@]:offset:number}

offset:

要跳过的元素个数

number:

要取出的元素个数

取偏移量之后的所有元素

${ARRAY[@]:offset}

向数组中追加元素:

ARRAY[${#ARRAY[*]}]

删除数组中的某元素:导致稀疏格式

unset ARRAY[INDEX]

关联数组:

declare -A ARRAY_NAME

注意:必须先声明,再调用 ARRAY_NAME=([idx_name1]=‘val1‘ [idx_name2]=‘val2‘...)

字符串处理

bash的字符串处理工具:

字符串切片:

${#var}:

返回字符串变量var的长度

${var:offset}:

返回字符串变量var中从第offset个字符后 (不包括第offset个字符)的字符开始,到最后的部分,offset 的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)

${var:offset:number}:

返回字符串变量var中从第 offset个字符后(不包括第offset个字符)的字符开始,长度为 number的部分

${var: -lengh}:

取字符串的最右侧几个字符

注意:冒号后必须有一空白字符

${var:offset: -lengh}:

从最左侧跳过offset字符,一直 取到字符串的最右侧lengh个字符之前

基于模式取子串:

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

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

${var##*word}:同上,不同的是,删除的是字符串开 头至最后一次由word指定的字符之间的所有内容

示例:

file="var/log/messages“

${file#*/}: log/messages

${file##*/}: messages

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

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

示例 file="/var/log/messages"

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

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

示例: url=http://www.magedu.com:80

${url##*:} 80

${url%%:*} http

查找替换:

${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的值 ${var:+value}:如果var不空,则返回value,否则返回空值 ${var:=value}:如果var为空或未设置,那么返回value,并 将value赋值给var;否则,则返回var的值 ${var:?error_info}:如果var为空或未设置,那么在当前终 端打印error_info;否则,则返回var的值

为脚本程序使用配置文件,实现变量赋值

(1) 定义文本文件,每行定义“name=value”

(2) 在脚本中source此文件即可

Shell变量一般是无类型的,但是bash Shell提供了declare和 typeset两个命令用于指定变量的类型,两个命令是等价的

declare [选项] 变量名

-r 将变量设置为只读属性

-i 将变量定义为整型数

-a 将变量定义为数组

-A 将变量定义为关联数组

-f 显示此脚本前定义过的所有函数名及其内容

-F 仅显示此脚本前定义过的所有函数名

-x 将变量声明为环境变量

-l

将变量值转为小写字母

declare –l var=UPPER -u

将变量值转为大写字母

declare –u var=lower

间接变量引用

如果第一个变量的值是第二个变量的名字,从第一个变量引 用第二个变量的值就称为间接变量引用

variable1=variable2

variable2=value

variable1的值是variable2,而variable2又是变量名,

variable2的值为value,间接变量引用是指通过variable1获 得变量值value的行为

bash Shell提供了两种格式实现间接变量引用

eval tempvar=\$$variable1

tempvar=${!variable1}

示例:

[[email protected] ~]# N=NAME

[[email protected] ~]# NAME=45

[[email protected] ~]# N1=${!N}

[[email protected] ~]# echo $N1 45

[[email protected] ~]# eval N2=\$$A

[[email protected] ~]# echo $2 45

eval命令

eval命令将会首先扫描命令行进行所有的置换,然后再执 行该命令。该命令适用于那些一次扫描无法实现其功能的 变量。该命令对变量进行两次扫描

示例:

[[email protected] ~]# CMD=whoami

[[email protected] ~]# echo  $CMD whoami

[[email protected] ~]# eval $CMD

创建临时文件

mktemp命令:创建的临时文件可避免冲突

mktemp [OPTION]... [TEMPLATE] TEMPLATE: filename.XXX X至少要出现三个

OPTION:

-d: 创建临时目录

-p DIR或--tmpdir=DIR:指明临时文件所存放目录位置

示例:

#mktemp /tmp/test.XXX

#tmpdir=`mktemp –d /tmp/testdir.XXX`

#mktemp --tmpdir=/testdir test.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

示例:

install -m 700 -o wang -g admins file1 file2

install –m –d /testdir/installdir

bash如何展开命令行优先级

把命令行分成单个命令词

展开别名

展开大括号种的声明({})

展开波浪符声明(~)

命令替换$() 和 ``)

再次把命令行分成命令词

展开文件通配(*、?、[abc]等等)

准备I/0重导向(<、>)

运行命令

bash的配置文件

按生效范围划分,存在两类:

全局配置:

/etc/profile

/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)su UserName

(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时运行

用于

创建自动备份

清除临时文件

yum 的仓库指向 和 编译安装

yum的命令行选项:

--nogpgcheck:禁止进行gpg check

-y: 自动回答为“yes”

-q:静默模式

--disablerepo=repoidglob:临时禁用此处指定的repo

--enablerepo=repoidglob:临时启用此处指定的repo

--noplugins:禁用所有插件

如何使用光盘当作本地yum仓库:

(1) 挂载光盘至某目录,例如/media/cdrom # mount /dev/cdrom /media/cdrom

(2) 创建配置文件

[CentOS7]

name=

baseurl=

gpgcheck=

enabled=

程序包编译

程序包编译安装:

Application-VERSION-release.src.rpm --> 安装后,使 用rpmbuild命令制作成二进制格式的rpm包,而后再安装

源代码-->预处理-->编译-->汇编-->链接-->执行

源代码组织格式:

多文件:文件中的代码之间,很可能存在跨文件依赖关系

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

准备:提供开发工具及开发环境 开发工具:make, gcc等 开发环境:开发库,头文件 glibc:标准库 实现:通过“包组”提供开发组件

CentOS 6:

Development Tools

Server Platform Development

CentOS 7:

Development Tools Development and Creative Workstati

第一步: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

时间: 2024-10-22 11:20:20

shell 脚本之数组 和 yum 【下】的相关文章

linux基础学习第十二天(shell函数、数组以及yum使用及编译安装)

2016-08-18 授课内容: shell编程基础(select 循环与菜单.函数) yum管理.定制yum仓库 select 循环与菜单 select variable in list do 循环体命令 done 1.select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符(默认是#?),可以重新定义PS3,等待用户输入 2.用户输入菜单列表中的某个数字,执行相应的命令,用户输入被保存在内置变量REPLY 中 [19:45 [email protec

Linux中的shell脚本编程——数组 ,高级字符串操作 ,高级变量 ,配置用户环境

概述: 概述: 本章节将讲述Linux中shell脚本编程的数组,高级字符串处理,高级变量和配置用户的环境. 一.函数和位置参数扩展 1.shift 命令实现在位置参数中的跳跃,会把最左边的参数挤掉     2.匿名函数的使用 第一篇:数组 一.数组的定义: 1.变量:存储单个元素的内存空间 2.数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 3.数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开

vim编辑器简介;shell脚本的参数;yum仓库配置

1. vim编辑器 命令模式:dd:删除(剪切)光标所在整行:ndd:删除(剪切)光标处开始的n行:yy:复制光标所在整行:nyy:复制从光标开始处的n行:u:撤销上一步的操作:p:将之前删除(dd)或复制(yy)过的数据粘贴到光标后面:输入模式:进入:a或i或o:a:在光标后面以为切换到输入模式:i:在光标当前位置切换到输入模式:o:在光标的下面再创建一个空行:退出到命令模式:Esc键':'或末行模式::w 保存:q 退出:wq! 强制保存退出:q! 强制退出(放弃对文档的修改):set nu

shell 脚本-关联数组

shell 的关联数组 Shell Associative Array   bashi没有原生的对于类似hash table的支持,不像perl或python.下标数组元素是通过数组下标(数组下标可以是算术表达式,其结果必须是一个整数)来访问的,但是这种访问方式在表达某些关联性很强的数据时会存在限制.shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访问数组元素.这种数组叫做关联数组(associative array).关联数组的下标和值称为键值对,它们是一一对应的

用shell脚本递归遍历某个目录下的所有文件并移动到某个指定的目录中

1,先看下脚本cat recursive.sh #!/bin/shread -p "input path:" FilePath function getAllfiles(){for file in ls $FilePathdoif [ -f $file ]thenecho $filemv $file /bak_file/elif test -d $filethenecho "-------------------------------->"cd $fileF

18 shell脚本--009数组与字符串

回顾: 函数:写一个代码块,用来重复调用的: 1.函数的写法格式 2.参数,在函数名后面直接加,即可:如果在外面 abc(){ 函数体 [email protected] } abc 1 2 3 4 5 :wq a.sh 1 2 3 4 5 6 3.变量 local本地变量 local i=1 如果在函数体外同样也定义了一个相同的变量 扩展:source / bash / chmod+x 全路径 [父子进程的问题] 4.return 结束函数体的执行 和exit 的却别 return 和 exi

shell脚本练习--数组

问题描述:某个员工的linux系统有大量重复的软件(版本不同),导致使用yum安装软件时报错.现在需要将重复的软件找出来,将低版本的软件删掉.执行rpm -qa | sort 显示如下: [[email protected] ~]# rpm -qa | sort a52dec-0.7.4-27.el7.x86_64 aalib-libs-1.4.0-0.22.rc5.el7.x86_64 abattis-cantarell-fonts-0.0.25-1.el7.noarch abrt-2.1.1

shell脚本之数组

数组:    一堆变量的集合. 声明:        declare -a ARRAYNNAME        其中每个变量为ARRAYNAME[INDEX]        INDEX从0开始. 赋值:        ARRAYNAME[INDEX] = VALUE        ARRAYNAME = (VALUE1 VALUE2 ...)        ARRAYNAME = ( [INDEX1]=VALUE1 [INDEX2]=VALUE2 ...) 特殊引用方法:        ${#A

Shell脚本(五)数组

平时写脚本还没有用到过数组,暂时先记录下用法. #!/bin/bash array1=(1 2 3 4 5) array1_length=${#array1[@]} echo "array1 length: ${array1_length}" for item in ${array1[@]} do echo "current item of array1: ${item}" done array2[0]="test0" array2[1]=&qu