三月阳光 发表于 2018-8-27 10:52:28

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

  数组
  数据结构,数据序列,保存了连续的多个数据,可以使用索引获取相关元素,相当于多个变量的集合
  §数组名和索引
  索引:编号从0开始,属于数值索引
  注意:所以可支持使用自定义的格式,而不仅是数值格式,即关联索引,bash4.0版本之后开始支持,bash的数组支持稀疏格式(索引不连续)
  §声明数组
  declare –a arryname
  declare –A arryname 关联数组
  初始化或赋值:各元素之间使用空白字符隔开,不加下标默认为第一个
  第一种方式
  arryname=(‘a’‘b’‘c’)
  arryname=( =’a’ =’b’ =’c’)
  第二种方式
  arryname=”one”
  第三种方式:交互式
  read-aarryname
  abc
  §引用数组
  echo ${arryname}
  §获取元素的长度
  echo${#arryname[@]}
  echo${#arryname
[*]}
  当我们想去某个字符的长度,挠破脑袋想找个工具来计算出字符串的长度时,bash shell提供了计算出字符的长度,这时候bash shell的功能就展露无遗了

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

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

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

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

  基于模式取子串
  echo ${arryname#*keyword}:其中keywod可以是指定的任意字符
  功能:自左而右,查找arryname变量所存储的字符串中,第一次出现keyword,删除字符串开头至第一次出现keyword字符之间的所有字符
  echo ${arryname##*keyword}
  功能:自左而右,查找arryname变量所存储的字符串中,删除字符串开头至最后一次出现keyword字符之间的所有字符
  echo ${arryname%keyword*}:其中keyword可以使指定的任意字符
  功能:自由而左,查找arryname变量所存储的字符串中,第一次出现keyword,删除字符串最后一个字符至第一次出现keyword字符之间的所有字符
  echo ${arryname%%keyword*}
  功能:自由而左,查找arryname变量所存储的字符串中,删除字符串最后一个字符至最后一次出现keyword字符之间的所有字符

  在工作中,有时可能会遇到去一个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来替换

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

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

  变量赋值
  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的值

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

[*]  定义在文本文件中,每行定义”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}

  Bash如何展开命令行
  把命令行分成单个命令词
  展开别名
  展开大括号中的声明
  展开波浪符声明(~)
  命令替换$()和` `
  再次把命令行分成命令词
  展开文件通配符(*、?、)
  准备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} -lt ${arr} ]]
  then
  t=${arr}
  arr=${arr}
  arr=$t
  fi
  done
  done
  echo "after sorting:"
  echo ${arr[@]}


页: [1]
查看完整版本: Bashe Shell之数组及bash配置文件解析