一、shell编程(五)
位置变量补充
shift (踢掉参数)
shift #! /bin/bashecho "1st arg is $1"echo "all arg are $*"shiftecho "1st arg is $1"echo "all arg are $*"shiftecho "1st arg is $1"echo "all arg are $*"shift 2echo "1st arg is $1"echo "all arg are $*" [root@6 ~]# ./test.sh a b c d e f g1st arg is a all arg are a b c d e f g1st arg is b all arg are b c d e f g1st arg is c all arg are c d e f g1st arg is e all arg are e f g
匿名函数 (无函数名)
{ echo yyy ;exit }
数组
变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 数组名和索引 索引:编号从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" ...)、 生成列表 file=({1,2}*{a,b}) (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 for i in {0..9}; do rand[$i]=$RANDOM echo ${rand[$i]} [ ${rand[$i]} -gt $max ] && max=${rand[$i]} done echo "Max: $max"
数组数据处理
引用数组中的元素: 所有元素:${ARRAY[@]}, ${ARRAY[*]} 数组切片:${ARRAY[@]:offset:number} offset: 要跳过的元素个数 number: 要取出的元素个数 ${ARRAY[@]:offset} echo ${v;3;5} 向数组中追加元素: ARRAY[${#ARRAY[*]}] [root@6 ~]# name=([0]=4 [1]=5 [2]=6) [root@6 ~]# name[${#name[*]}]=10086 [root@6 ~]# echo ${name[*]} 4 5 6 10086 删除数组中的某元素:导致稀疏格式 unset ARRAY[INDEX]关联数组: declare -A ARRAY_NAME ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...) [root@6 ~]# declare -A A [root@6 ~]# A=([a]=1 [b]=2 [c]=3) [root@6 ~]# echo ${A[b]} 2
字符串处理及替换
字符串处理
bash 的字符串处理工具: 字符串切片: ${#var}: 返回字符串变量var 的长度 ${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#*/}: 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 将变量定义为数组 -f 显示此脚本前定义过的所有函数名及其内容 -F 仅显示此脚本前定义过的所有函数名 -x 将变量声明为环境变量 -l 将变量值转为小写字母 -u 将变量值转为大写字母 [root@6 ~]# echo $name a b c d e f g h i j k l m n o p q r s t u v w x y z [root@6 ~]# echo $name2 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [root@6 ~]# declare -l name3=$name2 [root@6 ~]# echo $name3 a b c d e f g h i j k l m n o p q r s t u v w x y z
间接变量引用
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用variable1=variable2variable2=valuevariable1的值是variable2,而variable2 又是变量名,variable2的值为value ,间接变量引用是指通过variable1获 获得变量值value 的行为
间接变量引用
bash Shell 提供了两种格式实现间接变量引用 eval tempvar=\$$variable1 tempvar=${!variable1} 示例: [root@server ~]# N=NAME[root@server ~]# NAME=wangxiaochun[root@server ~]# N1=${!N}[root@server ~]# echo $N1wangxiaochun [root@server ~]# eval N2=\$$A[root@server ~]# echo $2wangxiaochun
eval 命令
eval 命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描 。 示例: [root@server ~]# V1=pwd[root@server ~]# echo $V1pwd[root@server ~]# eval $V1/root
创建临时文件
mktemp命令:创建的临时文件可避免冲突 mktemp [OPTION]... [TEMPLATE] TEMPLATE: filename.XXX X至少要出现三个 OPTION: -d: 创建临时目录 -p DIR --tmpdir=/DIR :指明临时文件所存放的目录位置 实例: #mktemp --tmpdir=/testdir test.XXXXXX #mktemp -p /testdir test.XXXXXX #mktemp -d /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 lvasu -g admins file1 fie2
bash 如何展开命令行
把命令行分成单个命令词 展开别名 展开大括号种的声明({}) 展开波浪符声明(~) 命令替换$() 和 ``再次把命令行分成命令词 展开文件通配(* 、? 、[abc] 等等) 准备I/0 重导向(< 、>) 运行命令
防止扩展
反斜线(\)会使随后的字符按原意解释 $ echo Your cost: \$5.00Your cost: $5.00加引号来防止扩展 • 单引号(’ )防止所有扩展 • 双引号(”)也防止所有扩展,但是以下情况例外: $ (美元符号) - 变量扩展 ` (反引号) - 命令替换 \ (反斜线) - 禁止单个字符扩展 ! (叹号) - 历史命令替换
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类
bashrc类:为非交互式和交互式登录的shell 提供配置 全局:/etc/bashrc 个人:~/.bashrc 功用: (1) 定义命令别名和函数 (2) 定义本地变量
编辑配置文件生效
修改profile 和bashrc 文件后需生效 两种方法:1 重新启动shell 进程2 . 或source 例: . ~/.bashrc
Bash 退出任务
保存在~/.bash_logout 文件中(用户) 在退出登录shell 时运行 用于 • 创建自动备份 • 清除临时文件
二、软件包管理(三)
删除rpm rpm -e rpm –nodeps 进入救援模式安装 rpm /path/ –root=/sys
yum
安装及升级本地程序包: * localinstall rpmfile1 [rpmfile2] [...] ( 用install 替代) * localupdate rpmfile1 [rpmfile2] [...] ( 用update 替代) 包组管理的相关命令: groupinstall group1 [group2] [...] groupupdate group1 [group2] [...] grouplist [hidden] [groupwildcard] [...] groupremove group1 [group2] [...] groupinfo group1 [...]如何使用光盘当作本地yum 仓库: (1) 挂载光盘至某目录,例如/media/cdrom # mount /dev/cdrom /media/cdrom (2) 创建配置文件 [CentOS7] name= baseurl= gpgcheck= enabled= yum 的命令行选项: --nogpgcheck :禁止进行gpg check -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> 光盘自动启动服务: [root@6 Packages]# service autofs status 远程连接文件服务器: lftp ip mget 下载文件 bye 退出文件服务器
程序包编译
程序包编译安装: 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.comc/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
积累应用
1、系统组件删除恢复
rpm -e rpm --nodeps 光盘启动,进入救援模式 centos6 mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom centos7 rpm -ivh /run/../Package/rpm-4...*.rpm --root=/mnt/sysimage
1、卸载RPM组件 (centos6)
救援模式rescue 安装RPM包
mount /dev/cdrom /mnt/cdrom 需要挂载光盘 --root=/mnt/sysimage 指定安装目录
、
2、 卸载RPM组件 (centos7)
救援模式rescue 安装RPM包
--root=/mnt/sysimage 指定安装目录
3、卸载kernel组件 (centos6)
救援模式rescue 安装kernel包
mount /dev/cdrom /mnt/cdrom 需要挂载光盘 --root=/mnt/sysimage 指定安装目录
4、卸载kernel组件 (centos7)
救援模式rescue 安装kernel包
--root=/mnt/sysimage 指定安装目录
2、源码安装apache
步骤 1、安装develpment tools 2、下载 tar xvf httpd-2.2.29.tar.bz2 3./configure --prefix=/usr/local/http2 --sysconfdir=/etc/http2/4 make5 make install /etc/man_db.conf 编辑mandb的配置文件 /etc/profile.d.sh/ 把http2的执行文件路径添加到PATH 中 http2.sh PATH=$PATH:/usr/local/http2/bin 6 ./bin/apachectl start 开启apachectl 7 netstat -ant 检查端口 telnet 10.1.252.213 80 8 iptables -F 关闭防火墙 9 测试links
安装效果
3 、生成10 个随机数,采用冒泡算法进行升序或降序排序
#! /bin/bash #author:lvasu #description: #version:0.1 #date: declare -i num; read -a arg -p "请输入10个数字:" for((i=0;i<=9;i++))do for((k=$[i+1];k<=9;k++))do if [ ${arg[$i]} -gt ${arg[$k]} ];then num=${arg[$i]} arg[$i]=${arg[$k]} arg[$k]=$num fi done done echo "正序排列${arg[*]}" echo "==============" for((i=0;i<=9;i++))do for((k=$[i+1];k<=9;k++))do if [ ${arg[$i]} -lt ${arg[$k]} ];then num=${arg[$i]} arg[$i]=${arg[$k]} arg[$k]=$num fi done done echo "逆序排练${arg[*]}" echo "====================" zhengxu echo "====================" nixu
zhengxu() { local num; for((i=0;i<=9;i++))do for((k=$[i+1];k<=9;k++))do if [ ${arg[$i]} -gt ${arg[$k]} ];then num=${arg[$i]} arg[$i]=${arg[$k]} arg[$k]=$num fi done done echo "正序排列${arg[*]}" } nixu() { for ((i=0;i<=9;i++))do for ((k=$[i+1];k<=9;k++))do if [ ${arg[$i]} -lt ${arg[$k]} ];then num=${arg[$i]} arg[$i]=${arg[$k]} arg[$k]=$num fi done done echo "逆序排练${arg[*]}" }
[root@6 bin]# sort.sh 请输入10个数字:2 5 1 4 6 10 5 9 111 20 正序排列1 2 4 5 5 6 9 10 20 111 ============================== 逆序排练111 20 10 9 6 5 5 4 2 1 ============================= 正序排列1 2 4 5 5 6 9 10 20 111 ============================ 逆序排练111 20 10 9 6 5 5 4 2 1
原创文章,作者:lvasu,如若转载,请注明出处:http://www.178linux.com/39794
评论列表(1条)
文章对所学的东西有了一个全面的梳理和总结,但对于实际操作部分,写的过于简略。