数组

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

 

§数组名和索引

索引:编号从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