Bashe Shell之数组及bash配置文件解析

数组

  数据结构,数据序列,保存了连续的多个数据,可以使用索引获取相关元素,相当于多个变量的集合

 

§数组名和索引

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

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

 

§声明数组

    declare –a arryname

    declare –A arryname 关联数组

 

初始化或赋值:各元素之间使用空白字符隔开,不加下标默认为第一个

第一种方式

    arryname=(‘a’  ‘b’  ‘c’)

    arryname=( [0]=’a’ [1]=’b’ [2]=’c’)

第二种方式

    arryname[1]=”one”

第三种方式:交互式

    read  -a  arryname

    a  b  c

 

§ 引用数组

    echo ${arryname[0]}

 

§获取元素的长度

    echo  ${#arryname[@]}

    echo  ${#arryname[*]}

    当我们想去某个字符的长度,挠破脑袋想找个工具来计算出字符串的长度时,bash shell提供了计算出字符的长度,这时候bash shell的功能就展露无遗了

    1.jpg

    bash的伪随机生成器

    $RANDOM

 取特定位数的

   $[$RANDOM%11]:取10以内的随机数

 

§数组数据处理

  引用数组中的元素:

  所有元素:echo ${arryname[@] , echo ${arryname[*]}

  数组切片:${arryname[@]:offset:number}

     offset:要跳过的元素个数

     number:要去除的元素个数

     echo ${arryname[@]:2:3} 跳过两个字符,取三个字符

     2.jpg

 向数组中追加元素

    arryname[${#arryname[@]}]

 

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

    unset arryname[索引编号]

     3.jpg

 关联数组:

    dexclare –A arryname3

    arryname=([a]=1  [b]=2  [c]=3 … ),这里的索引编号可以自定义

  注意:在赋值之前,必须要声明数组为关联数组

    4.jpg

 

 

 

§字符串处理

    bash的字符串处理工具

 字符串切片

    echo ${#arryname}:返回字符串变量的arryname的长度

    echo ${arryname:offset}:返回字符串变量arryname从第offset个字符后(不包括offset的取值在0${#arryname}-1之间

    echo ${arryname:offset:number}:返回字符串变量arryname中从offset个字符后(不包括)的字符开始,长度为number的字符

    echo ${arryname:  -number}:去字符串最右侧的几个字符

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

     5.jpg

 基于模式取子串

    echo ${arryname#*keyword}:其中keywod可以是指定的任意字符

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

     echo ${arryname##*keyword}

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

    echo ${arryname%keyword*}:其中keyword可以使指定的任意字符

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

     echo ${arryname%%keyword*}

功能:自由而左,查找arryname变量所存储的字符串中,删除字符串最后一个字符至最后一次出现keyword字符之间的所有字符

    6.jpg 

    在工作中,有时可能会遇到去一个url的协议以及端口这时候取字符串这个功能就非常好使了

    url=http://www.magedu.com:80
    ${url##*:}80
    ${url%%:*}http

 

 查找替换

    echo ${arryname/pattern/abc:查找arryname所表示的字符串中,第一次被pattern所匹配到的字符串,用abc来替换

    echo ${arryname//pattern/abc} :查找arryname所表示的字符串中,所有被pattern所匹配到的字符串,用abc来替换

    echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,行首被pattern所匹配到的字符串,用abc来替换

    echo ${arryname/%pattern/abc}:查找arryname所表示的字符串中,行尾被pattern所匹配到的字符串,用abc来替换

     7.jpg

 

 查找并删除

    echo ${arryname/pattern}:查找arryname所有字符串中,删除第一次被pattern所匹配到的字符串

    echo ${arryname//pattern}:查找arryname所有字符串中,删除所有被pattern所匹配到的字符串

    echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,删除行首被pattern所匹配到的字符串echo                       

    ${arryname/%pattern/abc}:查找arryname所表示的字符串中,删除行尾被pattern所匹配到的字符串

  8.jpg




 字符大小写转换

    echo ${arryname^^}:把arryname的所有小写字母转换成大写

    echo ${arryname,,}:把arryname的所有大写字母转换成小写

  9.jpg

 

 

 变量赋值

    echo ${arryname:-value}:如果arryname为空或者未设置,那么就返回value,否则,则返回arryname的值

    echo ${arryname:+value}:如果arryname非空,那么就返回value,否则返回空值

    echo ${arryname:=value}:如果arryname为空或者未设置,那么就返回value,并且将value赋值给arryname,否则返回arryname的值

    echo ${arryname:?error_messages}:如果arryname的值为空或未被设置,那么返回error_messages;否则,则返回arryname的值

  10.jpg

 

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

1.         定义在文本文件中,每行定义”name=value”

2.         在脚本中source次文件即可

 

   Shell变量一般是无类型的,但是Bash Shell提供了declaretypeset两个命令用于指定变量的类型,两个命令是完全等价的

declare [选项] 变量名

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

         -I 将变量设置为整型

         -a 将变量设置为数组

         -A 将变量设置为关联数组

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

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

         -x 将变量定义为环境变量

         -l 将变量值转为小写字母

         -u 将变量值转为大写字母

 

 间接变量引用

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

    a=b

    b=123

    a的值b,而b又是变量名

    b的值为123,间接变量引用是指通过a获得变量值123的行为

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

    eval c=\\$$a

    c=${!a}

    11.jpg

 

    Bash如何展开命令行

 把命令行分成单个命令词

 展开别名

 展开大括号中的声明

 展开波浪符声明(~

 命令替换$()和` `

 再次把命令行分成命令词

 展开文件通配符(*、?、[ab]

 准备I/O重定向(<>

 运行命令

 

 

 防止扩展

 反斜线(\)会使随后的字符按原意解释

 echo you cost :\$500

 加引号来防止扩展

 单引号’ ‘ 防止所有扩展

 双引号也防止所有扩展,但是一下几种情况除外

   $     变量扩展

   `          命令替换

   \          禁止单个字符扩展

   !          历史命令替换

 

    Bash的配置文件

 按生效范围划分

 全局配置

    /etc/profile

    /etc/profile.d/*.sh

    /etc/bashrc

 个人配置

    ~/.bash_profile

    ~/.bashrc

  按功能划分

    profile类:为交互式登录的shell提供配置

 全局:/etc/profile,/etc/profile.d/*.sh

 个人:~/.bash_profile

 功能

1.         用于定义环境变量

2.         运行命令或脚本

 

    bashrc类:为非交互式登录的shell提供配置

 全局:/etc/bashrc

 个人:~/.bashrc

 功能

 定义命令别名

 定义本地变量

 

 修改profilebashrc文件后需生效

 两种方法:

 重新启动shell进程

   “.” source  文件

 

   shell登录的两种方式

  交互式登录:

    (1)直接通过终端输入账号密码登录;

    (2)使用“su-UserName”切换的用户

 执行顺序:

    /etc/profile-à/etc/profile.d/*.shà~/.bash_profileà~/.bashrcà/etc/bashrc

 

 非交互式登录:

   (1)suUserName

   (2)图形界面下打开的终端

   (3)执行脚本

 执行顺序:

    ~/.bashrcà/etc/bashrcà/etc/profile.d/*.sh

 

    Bash退出任务

 保存在~/.bash_logout文件中

 在退出登录shell时运行

 用于创建自动备份和清除临时文件

 

 

 

1、生成10个随机数,采用冒泡算法进行升序或降序排序

  将给出的数,一次做大小比较,从小往大的顺序排列

 #!/bin/sh
 #sorting following array
 echo "please input a number list:"
 read -a arr
   for (( i=0 ; i<${#arr[@]} ; i++ ))
   do
    for (( j=${#arr[@]} – 1 ; j>i ; j– ))
    do
     #echo $j
      if  [[ ${arr[j]} -lt ${arr[j-1]} ]]
      then
       t=${arr[j]}
       arr[j]=${arr[j-1]}
       arr[j-1]=$t
      fi
   done
 done
 echo "after sorting:"
 echo ${arr[@]}
 12.jpg

 

原创文章,作者:fszxxxks,如若转载,请注明出处:http://www.178linux.com/39355

(0)
fszxxxksfszxxxks
上一篇 2016-08-24
下一篇 2016-08-24

相关推荐

  • iptables之froward

    先克隆一台centos服务器添加虚拟网卡 同时两个服务器配上host only的网卡 echo 1 > /proc/sys/net/ipv4/ip_forward打开网卡间转发 有回包 但是没有10.0.0.3还是没有ping通原因是192.168.68.134 的网关指向了192.168.68.2 而不是192.168.68.144添加一条指向192…

    2017-11-12
  • linux运维

    linux运维大纲,学习路线图

    Linux干货 2017-10-21
  • 学习新技术的10个建议

    我们生活在一个振奋人心的时代。我们可以越来越方便廉价地获得大量学习资源。这些资源的传播载体由最初的教室被变成了博客,技术论坛等。坐拥如此众多的学习资源,我们没有任何理由不去好好利用。随之而来的问题便是如何在这知识的海洋中选择自己的前进方向。在这篇文章中,我将简要概括一些技术学习的建议,希望可以给你带来一些启发。 尽管我的建议主要涉及的是软件开发方面,但是这些…

    Linux干货 2015-03-20
  • 数据结构应用详解-

    概述 最小生成树——无向连通图的所有生成树中有一棵边的权值总和最小的生成树 拓扑排序 ——由偏序定义得到拓扑有序的操作便是拓扑排序。建立模型是AOV网 关键路径——在AOE-网中有些活动可以并行地进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度,路径长度最长的路径叫做关键路径(Critical Path)。 最短路径——最短路径问题是…

    Linux干货 2015-04-07
  • N25-第七周作业

    第七周 1、创建一个10G分区,并格式为ext4文件系统; (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl; [root@zf ~]# fdisk /dev/sdb Command (m for help): n Command action e extended p primary partit…

    Linux干货 2017-02-24
  • 2016-08-12博客作业

    德摩根定理       在命题逻辑和逻辑代数中,德摩根定律(或称德摩根定理)是关于命题逻辑规律的一对法则。奥古斯塔斯·德摩根首先发现了在命题逻辑中存在着下面这些关系: 非(P 且 Q)=(非 P)或(非 Q) 非(P 或 Q)=(非 P)且(非 Q)     …

    Linux干货 2016-08-15

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-26 10:09

    文章内容很完整,让我明白了数组的定义和调用,但在bash环境配置,只是进行了知识点的罗列,这是不合适的,希望自己能通过总结成自己的语言,清晰的表述出自己想要表达的意思。