shell_数组与字符串

Posted theneverlemon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell_数组与字符串相关的知识,希望对你有一定的参考价值。

回顾

   函数:写一个代码块,用来重复调用的;

1. 函数的写法格式

2. 参数,在函数名后面直接加,即可;如果在外面传参是不行的

3. 变量

local本地变量

local i=1

   如果在函数体外同样定义了一个相同的变量

   扩展:source /bash /chmod+x 全路径

4. return

结束函数体执行

和exit的区别

   return和exit都指定的返回值 0代表执行成功,1-255代表执行失败

   return只用在函数体中;

5. 迭代

迭代的时候一定要指初始值

 

斐波那契数列

 

 

 

数组与字符串

1. 数组

  数组说白了就是一段连续的变量,一段练习的内存存储空间

  解决:变量过多的问题;在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)

  1) 数组名

  2) 索引

  3) 值

 

如何去定义数组:

  declare -i 定义整数(声明)

  declare -a 定义数组array

  declare -A 定义嵌套的数组【这样的数组值在bash中并不常用】

  array=(值)

  array=()空数组

如何给数组赋值:

  array=()

  1. array[0]=ly  (在计算机语言中,索引一般从零开始计算;索引并不一定是数字:key-      value;shell中数组赋值可以跳跃(跳跃赋值) )

  2. array=(/var/log/*.log)

    array=(a b c d…)

  3. array=(‘李媛=174’‘韩忠达=160’…)

  4. 通过read命令来赋值

    read  -t 延迟

    -p “指定说明”

    -a 输入数组所需要的变量值

    read -a a b c d e f

如何去调用数组:

  $变量名

  $数组名[索引] 定义的是哪个索引,就看到是对应索引指定的值

  $数组名 默认调用索引=0的值

  $数组名[*]或者$数组名[@]

    调用数组内所有的值$* $@[尽量使用@]

特殊用法:

  调用数组的数组长度

    length(“变量”)

    $#变量名[*]或者$#变量名[@]

  添加数组值得特殊方式

    $变量名[$#变量名[@]]=“值”或者

    $变量名[$#变量名[*]]=“值”

关于数组的其他操作

  数组切片

    $变量名[@]:偏移量:所需要取出值得个数

    a=(/var/log/*.log)

    echo $a[*]:2:4

  删除值

    unset 变量名[索引]

    注意:删除的是索引所对的值,而不是带着索引一块删除

  修改值

    a[3]=c

    a[3]=d 覆盖即修改

练习:

统计/var/log/*.log中索引为偶数的文件的行数的和

   declare -a a=/var/log/*.log

   declare -i sum=0

   for i in `seq 0 7`;do

      if[ $[$i%2] -eq 0 ];then

         line=`wc -l $a[$i]|cut -d’’ -f1`

        sum+=$line                             

      fi

   done

   echo “输出的行数总和为:$sum”

练习:

   生成10个随机数,打印其中最大的数值

  

字符串:

   printf   占位符:%s %d %f

  %[num]s  指定该字符串站位的宽度

   %-[num]s 代表左对齐

1. 字符串切片

  $变量名:偏移量:数值个数

  $变量名: -数值个数 切片从后切 【注意:冒号后面一定要加空格】

  $变量名:-word 默认赋值的意思

2. 基于模式取子字符串

从左到右

  $变量名#pattern 删除pattern第一次匹配到的字符串

  $变量名##patten 删除所有pattern匹配到的字符串

从右到左

  $变量名%pattern

  $变量名%%pattern

思考:取url中的IP地址或域名

3. 字符替换

  $变量名/pattern/替换后的字符串【patter并不是正则表达式】

    匹配第一个pattern,来进行替换

  $变量名//pattern/替换后的字符串

    匹配所有的pattern,并进行替换

 

  $变量名/#pattern/替换后的字符串

    指定匹配行首必须为pattern,才去替换

  $变量名/%pattern/替换后的字符串

     指定匹配行尾必须为pattern,才去替换

注意:/分隔符,不能替换为其他特殊符号

4. 查找并删除

  替换中,不指定替换字符串,即为删除

  $变量名/pattern/

  $变量名//pattern/

  $变量名/#pattern/

  $变量名/%pattern/

5. 替换大小写

  tr替换大小写

  tr [[:lower:]] [[:upper:]] < filename

 

  $变量名^^将字符串全部替换为大写

  $变量名,,将字符串全部替换为小写

6. 变量赋值

  a)变量名1=$变量名2:-word

    注意没有空格  输入默认值得作用,变量2没有值,就将word默认值赋值给变量1

  b)变量名1=$变量名2:+word

    不常用 变量2 有值得情况下,才将word默认值赋值给变量1

  c)$变量:=word

    如果变量没有值,就将word赋值给变量,有值,则使用原来的值

  d)变量1=$变量2:?error_info

    如果变量2没有值,输出error_info错误信息

7. 脚本应用其他文件中的变量,如何实现?

  filename 1

  vim filename 1

       a=1

       b=2

  :wq

 

  vim filename1.sh

       ./全路径/filename 后者

    source /全路径/filename【执行整个代码】

       c=$[$a+$b]

       echo $c

  :wq

 

bash filename1.sh

练习:

 

8. 两个命令

install

  复制或删除文件,用法同copy;优点可以指定权限来复制文件

  用法:

    install a文件 b目录 //复制a文件到b目录,并回复初始权限(文件:755 目录:644)

    -t 源目对换

    -d 创建目录

    -m MODE

    -o OWNER

    -g GROUP

 

mktemp

  创建临时文件以及目录

  避免大家取的文件名重复;mktemp 名字. XXXX

  XXXX代表随机数(字母和数字)

  默认创建的是随机的文件

  -d 创建的是随机的目录

  file=`mktemp a.XXXX`

以上是关于shell_数组与字符串的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本入门 03:字符串与数组

shell变量函数控制流和数组以及字符串的截取

Shell脚本开发——变量字符串与数组

shell入门笔记2:字符串数组echo与printf

18 shell脚本--009数组与字符串

Shell全解析:字符串变量和数组变量