一、数组

数组就是一段连续的变量,一段连续的内存存储空间,为了解决变量过多的问题,在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义

1、定义数组

declare -a         定义数组
declare -A 定义嵌套的数组 --- 这个在bash中并不常用
testname=(value) 也可以定义一个空数组

2、数组赋值

shell中是可以跳跃赋值的

testname=( )

  a) testname[0]=1  ----索引一般从0开始,但索引并不一定是数字;

  b) testname=(/var/log/*.log)  把/var/log下以.log结尾的放入数组

  c) testname=(“qq=123” “vx=456”…)

  d) 通过read命令赋值:read -a 输入数组所需的变量值

    read -a x y z …

3、调用数组

${变量名}

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

${数组名} 默认调用索引=0的值

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

4、练习:统计/var/log/*.log匹配到的所有文件索引为偶数文件的行数的和。

a=(/var/log/*.log)
declare -i sum=0
for i in `seq 0 7`;do
if [ $[$i%2] -eq 0];then
line=wc -l ${a[$i]} |cut -d’ ‘ -f1
sum += $line
fi
done
echo $sum

5、调用数组的长度

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

6、添加数组值的特殊方式

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

7、数组切片

${变量名[@]:偏移量:取值个数} ${a[*]::} 不加取值个数就是取到最后

8、删除值

unset ${变量名[索引]} 删除的是该索引数的值,其他值索引不变

9、修改值

覆盖就是修改

二、字符串

1、格式化输出:printf

printf "%-5s %-5s %-5s" No Name Height
printf "%-5s %-5s %-5d" zhangsan
printf "%-5s %-5s %-5.1f" zhangsan 170.5
%-5d 左对齐

2、字符串切片

${变量名:偏移量:数值个数}  a=abcdefg  ${a::} ===cdef
${变量名: -数值个数} 从后往前取 冒号后面一定要有空格
${变量名:-word} 默认赋值,如果变量没有赋值,就使用默认值

3、基于模式取子字符串

${变量名#patten} a=abcdABCabABCD ${a#a*C}===adABCD 从开头匹配删除最短匹配的子串
${变量名##pattern} a=abcdABCabABCD ${a##a*C}===D 从开头匹配删除最长匹配的子串
${变量名%pattern} a=abcdABCabABC ${a%a*C}===abcdABC 从结尾匹配删除最短匹配的子串
${变量名%%pattern} a=abcdABCabABC ${a%a*C}===空 从结尾匹配删除最长匹配的子串

4、字符替换

${变量名/pattern/替换的字符串} 匹配第一个pattern进行替换
a=192.168.1.1 ${a//}=72.168.1.1
${变量名//pattern/替换的字符串} 匹配所有pattern进行替换
${变量名/#pattern/替换的字符串} pattern必须出现在行首,不然不替换
${变量名/%pattern/替换的字符串} pattern必须出现在结尾,不然不替换
注意:/分隔符不能换成(# % 等特殊字符)

5、查找并删除:替换中不指定替换的字符串,即为删除

${变量名/pattern}
${变量名//pattern}
${变量名/#pattern}
${变量名/%pattern}

6、替换大小写

tr [:lower:] [:upper:] < filename 小写转大写
${变量名^^} 把小写转换为小写
${变量名,,} 把大写转换为小写

7、变量赋值

变量名1=${变量名2:-word} 当变量2没有值时,赋予变量1默认word值
变量名1=${变量名2:+word} 当变量2有值时,赋予变量1默认word值
${变量名:=word} 变量没有值的时用word默认值,有值则用原来的值
变量名1=${变量名2:?error_info} 变量2没有值时,输出error_info

8、脚本应用其他文件中的变量

vim /root/filename1
a=
b=
:wq vim /root/filename2.sh
./root/filename1 #导入filename1文件
c=$[$a+$b]
echo $c
:wq

9、两个命令

mktemp:创建临时文件以及目录,避免取的文件名重复
  格式:mktemp 名字.XXXX XX代表随机数(字母和数字)
默认创建的是文件
  -d 创建名字随机的目录
例如:file=`mktemp a.XXX` dir=`mktemp -d b.XXX`
install:复制或删除文件,用法和copy相同
优点是可以指定权限来复制文件
用法:
install [option] 文件 目录 复制时恢复初始权限
install [option] 目录 文件
参数:
-t 源目对换
-d 创建
-m MODE 设置权限 mask
-o OWNER 指定所属主
-g GROUP 指定所属组

Linux--shell数组和字符串--09的更多相关文章

  1. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

  2. 转:linux shell 数组建立及使用技巧

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

  3. 转载-Linux Shell 数组建立及使用技巧

    转载自:http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html 如侵犯版权,请联系我删除 linux shell在编程方面比win ...

  4. linux shell 数组建立及使用技巧

    参考网址:http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html linux shell在编程方面比windows 批处理强大太多 ...

  5. Linux Shell 数组

    shell 数组一般都是一维数组. 1. 数组的声明 declare -a arr 该命令将声明一个数组arr,实际上不声明也可以直接定义数组. 2. 数组的初始化 arr=(1 2 3):该命令定义 ...

  6. linux shell 数组的使用

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

  7. linux shell数组

    from: http://www.jb51.net/article/34322.htm bash shell只支持一维数组,但参数个数没有限制. 声明一个数组:declare -a array(其实不 ...

  8. linux shell数组赋值方法(常用)

    http://blog.csdn.net/shaobingj126/article/details/7395161 Bash中,数组变量的赋值有两种方法: (1) name = (value1 ... ...

  9. linux shell学习(字符串操作)--01

    http://blog.csdn.net/shuanghujushi/article/details/51298672 在bash shell的使用过程中,经常会遇到一些字符串string的操作,下面 ...

随机推荐

  1. 【UVA - 10006 】Carmichael Numbers (快速幂+素数筛法)

    -->Carmichael Numbers  Descriptions: 题目很长,基本没用,大致题意如下 给定一个数n,n是合数且对于任意的1 < a < n都有a的n次方模n等于 ...

  2. Gin 框架 - 使用 logrus 进行日志记录

    目录 概述 日志格式 Logrus 使用 推荐阅读 概述 上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录. 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirup ...

  3. java中this 和 super关键字的作用

    emmmmmm也真的是好久没有写过java了,因为项目需要, 最近又必须重新拾起来了,虽然好多东西也都忘得差不多了.... 然后发现 竟然把super和this傻傻分不清.... 开个帖子记录一下: ...

  4. 个人永久性免费-Excel催化剂功能第71波-定义名称管理器维护增强

    Excel使用得好坏一个分水岭之一乃是对定义名称的使用程度如何,大量合理地使用定义名称功能,对整个Excel的高级应用带来极大的便利性和日常公式函数嵌套的可读性得到很大的提升.Excel催化剂再次以插 ...

  5. classpath和classpath*区别

    classpath和classpath*区别: classpath:只会到你的class路径中查找找文件. classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找. ...

  6. 线程锁,threadinglocal,线程池,生产者消费者模型

    1.线程锁 1.锁Lock(只能锁一次) import threading import time v = [] lock = threading.Lock() def func(arg): lock ...

  7. Java emoji持久化mysql

    好久没有更新博客了,今天和大家分享一个关于emoji表情持久化问题,相信做web开发的都遇到过这样的问题,因为我们知道mysql的utf-8字符集保存不了保存不了表情字符,这是为什么呢?因为普通的字符 ...

  8. Linux设备驱动程序学习----1.设备驱动程序简介

    设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...

  9. java 第二章

    变量:变量就是代表程序运行时存放数据的地方 数据存放在:磁盘,内存卡,U盘,光盘,内存条,固态硬盘,机械硬盘等 字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计 ...

  10. 私有网络(VPC)概述

    1 什么是私有网络(VPC) 私有网络是一块可用户自定义的网络空间,您可以在私有网络内部署云主机.负载均衡.数据库.Nosql快存储等云服务资源.您可自由划分网段.制定路由策略.私有网络可以配置公网网 ...