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 和 exit 都指定的返回值 0 代表执行成功,1-255 代表执行失败
return只用在函数体中;
5、迭代
迭代的时候一定要指初始值!!!
n!

n!=n(n-1)!

fact(){
if [ $1 -lt 1 -o $1 -eq 0 ];then
echo 1
else
echo "$[$1*$(fact $[$1-1])]"
fi
}
fact 100

1 2 3 4 5 6 7 8
1 1 2 3 5 8 13 21 34 ... 斐波那锲数列
F(n)=F(n-1)+F(n-2)

fab(){
if [ $1 -eq 1 ];then
echo 1
elif [ $1 -eq 2 ];then
echo 1
else
echo "$[$(fab $[$1-1])+$(fab $[$1-2])]"
fi
}
fab 100

fork炸弹:
.(){
. | . &
}
.

.(){ .|.& };. 【研究一下别的语言的fork炸弹怎么写的】

==========================================================

数组与字符串
数组
数组说白了就是一段连续的变量,一段连续的内存存储空间
解决:变量过多的问题; 在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)
共好学院云三本[1]=张卓
1、数组名
2、索引
3、值

如何去定义数组:
declare -i 定义整数 (申明)
declare -a 定义数组array
declare -A 定义嵌套的数组
共好学院云[1]=云计算专业
云计算专业[1]=云三班
云三班[1]=张卓
【这样数组值,在bash中并不常用】
【python 和 shell】
array=(值)
array=()

如何给数组赋值:
array=()
1、array[8]=张卓 (在计算机语言中,索引一般从0开始计算)
(索引并不一定是数字 : key-value array[张卓]=1.87m)
(shell中数组赋值,可以跳跃(跳跃赋值))
2、array=(/var/log/*.log)
做遍历
array=(a b c d e)
3、array=(‘张卓=187‘ ‘梁浩田=186‘ ... )
4、通过read命令来赋值
read -t 延迟 -p "指定说明" -a 输入数组所需的变量值
read -a a b c d e

如何去调用数组:
${变量名}
${数组名[索引]} 定义的是哪个索引,就看到是对应索引指定的值
${数组名} 默认调用 索引=0 的值 $array(最好不要这样写)
${数组名[*]} 或者 ${数组名[@]} 调用数组内所有的值 $* [email protected]

练习下: 统计 /var/log/*.log 中 索引为偶数 的文件 的行数的 和;
a=(/var/log/*.log)
for i in {0..7};do
if [ $[$i%2] -eq 0 ];then
line=`wc -l ${a[$i]} | cut -d‘ ‘ -f1`
sum+=$line # sum+=`wc -l ${a[$i]} | cut -d‘ ‘ -f1` # sum+=$(wc -l ${a[$i]} | cut -d‘ ‘ -f1)
fi
done
echo $sum

1、调用数组的数组长度
length("变量")
${#变量名[*]} 或者 ${#变量名[@]}
2、添加数组值的特殊方式
${变量名[${#变量名[@]}]}="值" 或者 ${变量名[${#变量名[*]}]}="值"

关于数组的其他操作
数组切片
${变量名[@]:偏移量:所需要取出值的个数}
echo ${a[*]:2:4}
${变量名[@]:偏移量}
删除值
unset ${变量名[索引]}
注意:删除是索引所对的值,而没有带着索引一块删除;
【知道值,如何查看索引?】
修改值
a[3]=c
a[3]=d 覆盖即修改

练习:
生成10个随机数,打印其中最大的数值
declare -a a
declare -i max=0

for i in `seq 0 9`;do
a[$i]=$RANDOM
[ ${a[$i]} -gt $max ] && max=${a[$i]}
done
echo ${a[@]}
echo "最大值为:$max"

生成10个随机数,并进行排序

字符串:
==============================
printf
name=张卓
hiagth=183

python ( %s ,他的升高为 %d ) % (name, hiaght)
输出: 张卓,他的升高为183

%s
%d
%f

%[num]s 指定该字符串占位的宽度
%-[num]s 代表左对齐
【居中对齐】

=============================

1、字符串切片:
数组切片:${变量名[@]:偏移量:数值个数}
字符串:${变量名:偏移量:数值个数}
${变量名: -数值个数} 【*注意:冒号后面一定要加空格*】
${变量名:-word} 默认赋值的意思
read "sasasa:" test
[ -z $test ] && test=abc
2、基于模式取子字符串
从左自右
${变量名#pattern} 删除pattern第一次匹配到的字串
${变量名##pattern} 删除所有pattern匹配到的字串

从右自左
${变量名%pattern}
${变量名%%pattern}

思考:取url中IP(域名)

3、字符替换
${变量名/pattern/替换后的字符串} 【pattern并不是正则表达式,而是文件通配符】
匹配第一个pattern,来进行替换
${变量名//pattern/替换后的字符串}
匹配所有哦pattern,并进行替换
${变量名/#pattern/替换后的字符串}
指定匹配行首必须是 pattern ,才会替换
${变量名/%pattern/替换后的字符串}
指定匹配行尾必须是 pattern , 才会替换

注意: / 分隔符,不能替换为(# % 等特殊字符 ,和sed 不一样)

4、查找并删除
替换中,不指定替换字符串,即为删除
${变量名/pattern}
${变量名//pattern}
${变量名/#pattern}
${变量名/%pattern}

5、替换大小写
tr 替换大小写
tr [[:lower:]] [[:upper:]] < filename

${变量名^^} 将字符串全部替换为大写
${变量名,,} 将字符串全部替换为小写

6、变量赋值
变量名1=${变量名2:-word} 注意没有空格! 输入默认值的作用 , 变量2 没有值,就将 word 默认值赋值给 变量1
变量名1=${变量名2:+word} 不常用 变量2 有值的情况下,才将 word默认值赋值给变量1
${变量:=word} 如果变量没有值,就将word赋值给变量,有值,则使用原来的值
变量1=${变量2:?error_infor} 如果变量2 没有值,输出erro_infor错误信息
【不知道如何使用?】

7、脚本应用其他文件中的变量,如何实现?
filename1
vim filename1
a=1
b=2
:wq

vim filename1.sh
. /全路径/filename 后者 source /全路径/filename //执行整个代码
c=$[$a+$b]
ehco $c
:wq

bash filename1.sh

练习:修改hostname,定义一个 hostname文件 name=xxx ,hostname.sh
hostname
name=test.com

hostname.sh
if [ -r /root/hostname ];then
. /root/hostname
else
echo "/root/hostname 没有执行权限"
exit 1
fi

hostname $name

8、两个命令
mktemp 创建临时文件以及目录 temp -- /tmp
避免大家取的文件名字重复;mktemp 名字.XXXXXX (XX代表随机数(字母和数字))
默认创建是随机的文件
-d 创建的就是随机的 目录

file=`mktemp a.XXXX`

install 复制或删除文件,用法同copy
优点可以指定权限来复制文件
用法:intall a文件 b目录 //复制a文件到b目录,并回复初始权限(文件:755 目录:644)
-t 源目对换
-d 创建
-m MODE
-o OWNER
-g GROUP

练习:
1、获取此命令所依赖的所有库文件的列表
Ldd /bin/cat
2、复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
/bin/bash ? /mnt/sysroot/bin/bash
/usr/bin/passwd ? /mtn/sysroot/usr/bin/passwd
3、复制此命令所依赖的所有库文件至目标目录下的对应路径下
/lib64/ld-linux-x86-64.so.2 ? /mnt/sysroot/lib64/ld-linux-x86-64.so.2
每次复制完成一个命令后,不要退出,而是提示用户输入新的复制的命令,并重复完成上述功能,直到用户输入quit退出;

原文地址:https://www.cnblogs.com/wx00/p/11386659.html

时间: 2024-11-08 20:56:15

18 shell脚本--009数组与字符串的相关文章

20.16 20.17shell中的函数(上下);20.18 shell中的数组;20.19 告警系统需求分析

20.16 shell中的函数(上) 函数就是把一段代码整理到了一个小单元中,并给这个小单元起 一个名字,当用到这段代码时直接调用这个小单元的名字即可. 1. [[email protected] ~]# vi fun1.sh 添加内容: #!/bin/bash function inp(){ echo "The first par is $1" echo "The second par is $2" echo "The third par is $3&q

20.16-20.17 shell中的函数;20.18 shell中的数组;20.19 告警系统需求

20.16 shell中的函数(上) 函数就是把一段代码整理到了一个小单元中,并给这个小单元起 一个名字,当用到这段代码时直接调用这个小单元的名字即可. 1. [[email protected] ~]# vi fun1.sh 添加内容: #!/bin/bash function inp(){ echo "The first par is $1" echo "The second par is $2" echo "The third par is $3&q

20.16/20.17 shell中的函数20.18 shell中的数组20.19 告警系统需求分析

20.16/20.17 shell中的函数显示变量的隐函数执行的结果参数只有一个1,执行的结果 第一个是1,第二个是空的,第三个也是空的,肢本的名字是fun1.sh,总共有1个参数加法的函数显示IP的隐函数-A1是显示关键词的一行包括下一行精准查找到IP脚本就可以这样写,ip $eth 是输入一个网卡的名字#!/bin/baship() {ifconfig |grep -A1 "ens33: " |awk '/inet/ {print $2}'}read -p "Please

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求

20.16/20.17 shell中的函数函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可.格式: function f_name() {? ?? ?? ?? ?? ?? ?? ? command? ?? ?? ?? ? }函数必须要放在最前面示例1 #!/bin/bashinput() {? ? echo $1 $2 $# $0} input 1 a b 示例2 #!/bin/bashsum() {? ? s=$[$1+$2]? ?

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

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

shell 脚本-关联数组

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

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 脚本之数组 和 yum 【下】

数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的 集合. 数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式 ,即为关联索引,bash4.0版本之后开始支持. bash的数组支持稀疏格式(索引不连续) 声明数组: declare -a ARRAY_NAME declare -A ARRAY_NAME: 关联数组 数组赋值 数组元素的赋值: (1) 一次只赋值一个元素: ARRAY_NAME[INDEX]=VA

shell脚本之数组

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