设为首页 收藏本站
查看: 868|回复: 0

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

[复制链接]

尚未签到

发表于 2018-8-27 10:52:28 | 显示全部楼层 |阅读模式
  数组
  数据结构,数据序列,保存了连续的多个数据,可以使用索引获取相关元素,相当于多个变量的集合
  §数组名和索引
  索引:编号从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的功能就展露无遗了
    DSC0000.jpg

      bash的伪随机生成器
      $RANDOM
      取特定位数的
      $[$RANDOM%11]:取10以内的随机数
      §数组数据处理
      引用数组中的元素:
      所有元素:echo ${arryname[@] , echo ${arryname
  • }
      数组切片:${arryname[@]:offset:number}
      offset:要跳过的元素个数
      number:要去除的元素个数
      echo ${arryname[@]:2:3} 跳过两个字符,取三个字符
    DSC0001.jpg

      向数组中追加元素
      arryname[${#arryname[@]}]
      删除数组中的某元素:导致稀疏格式
      unset arryname[索引编号]
    DSC0002.jpg

      关联数组:
      dexclare –A arryname3
      arryname=([a]=1  =2  [c]=3 … ),这里的索引编号可以自定义
      注意:在赋值之前,必须要声明数组为关联数组
    DSC0003.jpg

      §字符串处理
      bash的字符串处理工具
      字符串切片
      echo ${#arryname}:返回字符串变量的arryname的长度
      echo ${arryname:offset}:返回字符串变量arryname从第offset个字符后(不包括offset的取值在0到${#arryname}-1之间
      echo ${arryname:offset:number}:返回字符串变量arryname中从offset个字符后(不包括)的字符开始,长度为number的字符
      echo ${arryname:  -number}:去字符串最右侧的几个字符
      注意:冒号后必须有一个空白字符
    DSC0004.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字符之间的所有字符
    DSC0005.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来替换
    DSC0006.jpg

      查找并删除
      echo ${arryname/pattern}:查找arryname所有字符串中,删除第一次被pattern所匹配到的字符串
      echo ${arryname//pattern}:查找arryname所有字符串中,删除所有被pattern所匹配到的字符串
      echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,删除行首被pattern所匹配到的字符串echo
      ${arryname/%pattern/abc}:查找arryname所表示的字符串中,删除行尾被pattern所匹配到的字符串
    DSC0007.jpg

      字符大小写转换
      echo ${arryname^^}:把arryname的所有小写字母转换成大写
      echo ${arryname,,}:把arryname的所有大写字母转换成小写
    DSC0008.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的值
    DSC0009.jpg

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

    •   定义在文本文件中,每行定义”name=value”
    •   在脚本中source次文件即可
      Shell变量一般是无类型的,但是Bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是完全等价的
      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}
    DSC00010.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
      功能

    •   用于定义环境变量
    •   运行命令或脚本
      bashrc类:为非交互式登录的shell提供配置
      全局:/etc/bashrc
      个人:~/.bashrc
      功能
      定义命令别名
      定义本地变量
      修改profile和bashrc文件后需生效
      两种方法:
      重新启动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 ; ii ; 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[@]}
    DSC00011.jpg



  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557216-1-1.html 上篇帖子: kernel shell bash简介 下篇帖子: shell练习-对指定目录下的符合条件的文件执行操作
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表