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 19:02
下一篇 2016-08-24 21:21

相关推荐

  • tar,cpio,rpm,yum的使用详解(适合初学者)

    基于linux下的tar包管理和yum源配置 友情提示:对于这些实际操作的,还是需要进行手工的尝试,由于这几个对于包管理的是比较常用和实用的, 所以,一定要熟练使用。 1.tar tar是对于系统中文件,目录等进行打包,解包的工具。tar也可以对文件进行打包存放到别的目录下, 所以在很早的时候,一些老的工程师经常使用tar对文件进行备份。很大程度上,所谓的t…

    Linux干货 2016-08-21
  • Linux下的一些命令的认识及用法

    date+%F(显示年月日)+%T(显示时间)+%Y(显示年)+%m(显示月)+%d(显示日)+%H(显示小时)+%M(显示分钟)+%S(显示秒)+%s( seconds since 1970-01-01 00:00:00 UTC)         +%w(显示星期几)+%a(locale’s abbrevi…

    2017-07-22
  • Shell脚本编程之入门基础(一)

    Shell脚本编程   一、本章节一内容:    编程基础    脚本基本格式    变量    运算    条件测试   在本章节开始之前,我们先回顾下前面的知识点内容。前面学习了Linux的基础入门,了解到计算机是运行二进制指令的,而我…

    Linux干货 2016-08-12
  • 实现基于MYSQL验证的vsftpd虚拟用户

    马哥教育面授21期 运维 vsftpd MySQL 说明:本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器 一、安装所需要包和包组: 在数据库服务器上安装包: yum –y install mariadb-server mariadb-devel systemctl start mariad…

    Linux干货 2016-12-21
  • 转载:UEFI和BIOS对比

    传统BIOS开机流程     从你按下主机机壳上的电源键,到进入作业系统的期间,储存于主机板上那颗EEPROM(电气可抹除暨可程式化唯读记忆体)里的BIOS便会开始执行以下的工作: 1. 初始化:     当电脑打开,CPU会自行重置为初始状态,准备运作。BIOS boot block(基本输出输入…

    Linux干货 2016-05-01
  • Python语法基础之if while for常见的简单算法

    格式要符合语法要求

    2017-09-14

评论列表(1条)

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

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