Shell-07数组与字符串

数组

数组说白了就是一段连续的变量,一段连续的内存存储空间

解决:变量过多的问题;在同类的变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)

数组名 索引 值

如何定义数组:

declare -i 定义整数(声明)

declare -a 定义数组array

declare -A 定义嵌套的数组

共好云班[1]=云计算[1]=云计算三班[1]=某某

【这样的数据组值,在bash中并不常用】

【python和shell】

array=1

如何给数组赋值:

Array=()

  1. array[0]=A (在计算机语言中,索引一般从0开始;索引并不一定是数字:key-value array[A]=1;shell中数组赋值可以跳跃—跳跃赋值)
  2. array=(/var/log/*.log)-----每一个文件对应一个数组值

array=(a b c d)

  1. array=(‘a=187’c=’188’b=’170’)
  2. 通过read命令进行赋值

read -t 延时 -p指定说明 -a 输入数组所需的1变量值

read -a a b c d e

如何调取函数:

${变量名}

${数组名[索引]} 定义的是哪个索引,就看到是对应索引指定的值

${数组名} 默认调用 索引=0的值 $array(最好不要这样写)

${数组名[*]}或者${数组名[@]} 调用数组内所有的值

练习:

统计/var/log/*.log中,索引为偶数的文件的行数的和

wc -l /var/log/*.log

a=(/var/log/*.log)

declare -I Line=0

declare -I sum=0

sum=0

for i in {0..7};do

if [ $[$i % 2 ]-eq 0 ]

line=`wc -l  ${a[$i]} | cut -d “ ” -f1`

sum=sum+$line

fi

done

echo $sum

调用数组数组长度:

${#变量名[*]}或者${#变量名[@]}

添加数组值的特殊方式:

${变量名[${#变量名[@]}]}=”值” 或者 ${变量名[${#变量名[*]}]}=”值”

关于数组的其他操作:

数组的切片:${变量名[@]:偏移量:所需要取出值的个数}

a=(/var/log/*.log)

Echo ${a[*]:2:4}

${变量名[@]:偏移量}

数组删除值:unset${变量名[索引]}

删除的是索引所对的值,并不是带着索引删除;

【知道值,如何查看索引?】

修改值:覆盖即为修改

a[3]=c  a[3]=2

练习:

  1. 生成10个随机数,打印其中最大的值

#!/bin/bash

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

  1. 随机生成十个数并排序

字符串:

printf --- 格式化输出

name=zqq high=180

python print(%s,%d)%(name,high)

占位符----%s %d %f

%[num]s 指定该字符串占位的宽度

%-[num]s 指定左对齐

%-10s表示向左对齐

%20d 向右对齐20字符

%-10.1f 代表保留小数点后一位

printf "%-10s %-10s %-10s\n" No Name Height

printf "%-10s %-10s %-10d\n" 1 zqq 180

printf "%-10s %-10s %-10d\n" 2 qqq 190

printf "%-10s %-10s %-10f\n" 3 www 188.11

字符串切片:

数组切片:${变量名[]:偏移量:数值个数}

字符串切片:${变量名:偏移量:数值个数}—正切

${变量名: -数值个数}—反切 冒号后面要加空格

${变量名:-word}—默认赋值的意思

read “sasasa:” test

[ -z $test ] && test=123

基于模式取子字符串:

从左自右

${test#pattern}  删除pattern第一次匹配到地字符串

${test##pattern}  删除所有pattern匹配到地字符串

[root@localhost ~]# a=123qwe123wsx

[root@localhost ~]# b=${a#*1}--------去除1

[root@localhost ~]# echo $b

23qwe123wsx

[root@localhost ~]# a=/var/log/anaconda/anaconda.log/16.sh

[root@localhost ~]# b=${a##*/}

[root@localhost ~]# echo $b

16.sh

[root@localhost ~]# a=/var/log/anaconda/anaconda.log/16.sh

[root@localhost ~]# b=${a#*/}

[root@localhost ~]# echo $b

var/log/anaconda/anaconda.log/16.sh

[root@localhost ~]# url=http://192.168.72.100:8080

[root@localhost ~]# b=${url##*:}

[root@localhost ~]# echo $b

8080

从右自左

${变量名%pattern}

${变量名%%pattern}

[root@localhost ~]# url=http://192.168.72.100:8080

[root@localhost ~]# echo ${url%:*}

http://192.168.72.100

[root@localhost ~]# echo ${url%%:*}

http

[root@localhost ~]# url=http://192.168.72.100:8080

[root@localhost ~]# url1=${url#*//}

[root@localhost ~]# url2=${url1%:*}

[root@localhost ~]# echo $url2

192.168.72.100

字符替换:

${变量名/pattern/替换后的字符串}

匹配第一个pattern替换 【pattern并不是正则表达式,是文件通配符】

[root@localhost ~]# url=http://192.168.72.100:8080

[root@localhost ~]# echo ${url/192.168/10.6}

http://10.6.72.100:8080

[root@localhost ~]# url=http://192.168.72.100:8080

[root@localhost ~]# echo ${url/[1-9]*.*.*.*[0-9]/www.baidu.com}

http://www.baidu.com

${变量名//pattern/替换后的字符串}

匹配所有的pattern,并进行替换

${变量名/#pattern/替换后的字符串}

指定pattern必须是行首

[root@localhost ~]# a=`cat /etc/passwd|grep root`

[root@localhost ~]# echo $a

root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# echo ${a/#root/rooter}

rooter:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# echo ${a/#r??t/rooter}

rooter:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# echo ${a/\/bin\/bash//sbin\/nologin}

root:x:0:0:root:/root:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin

${变量名/%pattern/替换后的字符串}

指定行尾必须是pattern才替换

[root@localhost ~]# a=`cat /etc/passwd|grep root`

[root@localhost ~]# echo ${a/%\/?bin\/*/aaa}

root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:aaa

[root@localhost ~]# echo $a

root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

/ 分隔符,不能替换为(#%等特殊字符,与sed不同)

查找并删除

替换中,不指定替换字符串,即为删除

${变量名/pattern }

[root@localhost ~]# a=`cat /etc/passwd|grep root`

[root@localhost ~]# echo $a

root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# echo ${a/%operator*n/}

root:x:0:0:root:/root:/bin/bash

${变量名//pattern }

${变量名/#pattern }

${变量名/%pattern }

替换大小写:

tr 替换大小写

tr [[:lower:]] [[:upper:]] < filename

${变量名^^}---替换大写

${变量名,,}----替换小写

tr [:lower:] [:upper:] < /etc/passwd

[root@localhost ~]# a=$(cat /etc/passwd | head -1)

[root@localhost ~]# echo $a

root:x:0:0:root:/root:/bin/bash

[root@localhost ~]# echo ${a^^}

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

[root@localhost ~]# b=${a^^}

[root@localhost ~]# echo $b

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

[root@localhost ~]# echo ${b,,}

root:x:0:0:root:/root:/bin/bash

变量赋值:

变量名1=${变量名2:-word}  注意没有空格!!!

输入默认值的作用,变量2没有值,将word默认值赋值给变量1

[root@localhost ~]# echo $b

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

[root@localhost ~]# c=${b:-qaz}

[root@localhost ~]# echo $b

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

[root@localhost ~]# echo $c

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

[root@localhost ~]# e=${f:-qaz}

[root@localhost ~]# echo $f

[root@localhost ~]# echo $e

qaz

变量名1=${变量名2:+word} 不常用

变量2在有值的情况下,才将word默认值赋值给变量1

[root@localhost ~]# h=1

[root@localhost ~]# echo $h

1

[root@localhost ~]# g=${h:+qqq}

[root@localhost ~]# echo $g

qqq

[root@localhost ~]# echo $h

1

${变量2:=word}

如果变量没有值,就将word赋值给变量,有值,则使用原来的值

变量名1=${变量2:?error_info}

如果变量2没有值,输出error_infor错误信息

脚本引用其他文件中的变量如何实现?

filename1

vim filename1

A=1

B=2

:wq

vim filename1.sh

./全路径/filename 后者 source /全路径/filename

C=$[$a+$b]

Echo $c

bash filename1.sh

练习:

修改hostname,定义一个hastname文件name=xxx,hostname.sh

两个命令:

mktemp 创建临时文件以及目录 temp-- /tmp

避免大家取得文件名字重复;mktemp 名字.XXXXXX(XX代表随机数,随机的字母和数字)

默认创建的是随机的文件

-d 创建的就是随机的目录

File=`mktemp a.XXX`

install  复制和删除文件 用法同cp

优点:可以指定权限来复制文件

用法:intall  a文件 b目录 //复制a文件到b目录,并恢复初始权限(文件755 目录644) -t 源目对换 -d 创建目录 -m指定权限(mask) -o指定所属组 -g指定所属组

练习:

Ldd查看所有程序的库文件

创建目录

Chroot 切换系统根目录

/--/dev/sda1

原来的操作系统的shell程序 切换到 新的1目录下面去,然后再在这个目录下面放置相应的系统启动需要的程序文件。

如何取出命令的全路径

如何读取库文件---ldd

如何把通过ldd读取出来的库文件复制到目标目录

不管如何都要覆盖掉

扩展:

虚拟化的准备知识:系统的启动原理

读取系统—读取磁盘:提前就是必须先加载磁盘的驱动程序

挂载虚拟根(img虚根文件 ramdisk)

虚根文件 文件挂上以后,在grub1.5加载磁盘驱动;

通过chroot将ramdisk上面的临时“根”切换到磁盘上面

操作系统:vmlinuz的内核、ramdisk.img

Shell-07数组与字符串的更多相关文章

  1. Linux shell之数组

    引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...

  2. PHP 数组转字符串,与字符串转数组

    implode 使用一个字符串将数组变成字符串 <?php $array = array('lastname', 'email', 'phone'); $comma_separated = im ...

  3. C语言基础复习:字符,字符数组,字符串,字符指针

    1. 概述2. 字符2.1 字符定义和大小2.2 字符的输入和输出2.3 字符的计算3. 字符数组3.1 字符数组的定义和大小3.2 字符数组的输入和输出3.3 字符数组的计算4. 字符串4.1 字符 ...

  4. linux shell 中数组使用方法介绍

    linux shell在编程方面比windows 批处理强大太多,不管是在循环.运算.已经数据类型方面都是不能比較的. 以下是个人在使用时候,对它在数组方面一些操作进行的总结. 1.数组定义 [che ...

  5. Java-Runoob-高级教程-实例-字符串:07. Java 实例 - 字符串分割

    ylbtech-Java-Runoob-高级教程-实例-字符串:07. Java 实例 - 字符串分割 1.返回顶部 1. Java 实例 - 字符串分割  Java 实例 以下实例使用了 split ...

  6. shell 中数组学习

         因为应用shell的时间不是太长.对于数组在实际项目中没有接触过.今天在需要把相似于:a=1,2,3,4这种东西转换. 之前用的方法是用awk,分别取出.所以今天想是否有更好更简洁的方法-- ...

  7. 我们一起来学Shell - shell的数组

    文章目录 什么是数组 数组中常用变量 数组的定义 小括号定义数组变量 小括号加键值对定义数组变量 分别定义数组变量 动态地定义数组变量 数组赋值的切片 遍历数组 关联数组 我们一起来学Shell - ...

  8. Base-64 字符数组或字符串的长度无效等问题解决方案

    项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...

  9. c数组与字符串

    原文链接:http://www.orlion.ga/913/ 一.数组 定义数组: int count[9]; 赋值: int count[4] = { 3, 2, }; 未赋初值的元素用0初始化.如 ...

随机推荐

  1. Unity中的动画系统和Timeline(5) Timeline

    在前面的动画,都是控制单独的物体,比如说控制一个角色的运动.而Timeline,可以对多个物体实施动画,形成过场动画,或者电影效果.比如,很多赛车游戏比赛开始前都会播放一段开场动画,围绕自己车的几个方 ...

  2. datav轮播表使用事例

    官方事例地址: http://datav.jiaminghi.com/guide/scrollBoard.html 安装: npm install @jiaminghi/data-view 局部引入: ...

  3. python 基础复习

    1.简述cpu.内存.硬盘的作用 cpu (1)cpu:处理逻辑运算.算术运算 (2)cpu:接受指令传给电脑硬件,让其运行 内存: (1)内存:从硬盘中读取数据,供其cpu调取指令运行,短暂的存贮数 ...

  4. python 并发编程 多线程 GIL与多线程

    GIL与多线程 有了GIL的存在,同一时刻同一进程中只有一个线程被执行 多进程可以利用多核,但是开销大,而python的多线程开销小,但却无法利用多核优势 1.cpu到底是用来做计算的,还是用来做I/ ...

  5. poj1061(扩展欧基里德定理)

    题目链接:https://vjudge.net/problem/POJ-1061 题意:在一个首位相接的坐标轴上,A.B开始时分别位于X,Y处,每个单位时间向右移动m,n米,问是否能相遇,坐标轴长L. ...

  6. 快速乘+快速幂(用于模数超过int范围)

    一般的快速幂并不适合模数大于int范围的情况,因为在乘法运算的过程可能会出现超出long long的情况出现.这个时候可以利用快速幂的思想使用快速乘,原理就是模拟乘法运算,将乘法运算分解成加法运算,再 ...

  7. 通过sohu获取浏览器端IP地址

    接口:http://pv.sohu.com/cityjson?ie=utf-8

  8. 剑指offer-连续子数组的最大和-数组-python

    题目描述 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止). 给一个数组,返回它的最大连续子序列的和 思路:动态规划 # -*- coding:u ...

  9. IA-32 Assembly Language Reference Manual

    Load Full Pointer (lds,les, lfs, lgs, and lss) lds{wl} mem[32|48], reg[16|32]les{wl} mem[32|48], reg ...

  10. MySQL基础入门之常用命令介绍

    mysql命令介绍 mysql 是数据库管理命令 通过mysql --help来查看相关参数及使用说明 mysql --help                #mysql数据库管理命令 Usage: ...