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

相关推荐

  • linux中如何使用帮助

     在linux学习过程中,会遇到许多困难,尤其是一些命令掌握不牢固,不知道具体用法;或者是想要实现一些功能而不知道使用何种命令。这时求人不如求己,上网求助不如自己学会使用帮助,下面介绍几种linux帮助的用法。 1.what is +命令    执行这条命令可以显示命令的简短描述,让大家了解命令的基本功能。同时可以看到命令相关章…

    2017-07-23
  • keepalived配置

    前两个配置做完实验没截图,后面的实验有图片。 keepalived的的单独设置 1.确保时间同步 ntpdate 10.1.0.1 2.保证/etc/hosts文件可以解析到 3.本机配置ssh-keygen -t rsa -P ''  ,然后ssh-copy-id -i .ssh/id_rsa.pub root@10.1.44…

    Linux干货 2016-11-11
  • N26-第八周作业-邢岩

    马哥门徒-N26-邢岩 1、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;      在线的主机使用绿色显示;      不在线的主机使用红色显示; #!/bin/bash # Author: jeque# Des…

    2017-03-24
  • Linux上文件管理命令、元素据及时间戳、bash的工作特性回显和命令展开、定义别名,命令引用。

    文件管理命令: mkdir 创建空目录 语法: mkdir [选项]…目录… 选项: -P:逐层创建目录。 -v:显示过程。 -m:直接给定权限。 注意:路径的基名为命令作用对象。基名路径必须存在。 示例 创建/tmp/x1/a/a1和/tmp/x1/b rmdir 移除空目录 语法 rmdir [选项]…目录&#8230…

    Linux干货 2017-12-10
  • 1021作业

    关于用户和组相关配置文件的总结 /etc/passwd:用户及相关属性信息 在Linux /etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。这个文件对所有用户都是可读的。但是Linux /etc/passwd文件中都有些什么内容呢? #cat/etc/pass…

    Linux干货 2016-10-24
  • 第十七周 作业–结合图形描述lvs原理

        LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。   Lvs有三种模式分别是lvs-nat、lvs-dr、lvs-tun。下面分别介绍lvs-nat、lvs-dr…

    Linux干货 2016-12-07

评论列表(1条)

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

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