• shell笔记_数组与字符串


    回顾:

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

           1、函数的写法格式

           2、参数,在函数名后面直接加,即可;如果在外面

                  abc(){

                         函数体 $@

                  }

                  abc 1 2 3 4 5

                  :wq

                 

                  a.sh 1 2 3 4 5 6

           3、变量

                  local本地变量

                  local i=1

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

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

                         【父子进程的问题】

           4、return

                  结束函数体的执行

                  和exit 的却别

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

                  return只用在函数体中;

           5、迭代

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

                  n!

                  n!=n(n-1)!

                  fact(){

                         if [ $1 -lt 1 -o $1 -eq 0 ];then

                                echo 1

                         else

                                echo "$[$1*$(fact $[$1-1])]"

                         fi

                  }

                  fact 100

          

                  1 2 3 4 5 6  7   8

                  1 1 2 3 5 8 13 21 34 ...  斐波那锲数列

                  F(n)=F(n-1)+F(n-2)

                 

                  fab(){

                         if [ $1 -eq 1 ];then

                                echo 1

                         elif [ $1 -eq 2 ];then

                                echo 1

                         else

                                echo "$[$(fab $[$1-1])+$(fab $[$1-2])]"

                         fi

                  }

                  fab 100

                  fork炸弹:

                  .(){

                         . | . &

                  }

                  .

                  .(){ .|.& };.  【研究一下别的语言的fork炸弹怎么写的】

    ==========================================================

    数组与字符串

    数组

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

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

                  共好学院云三本[1]=张卓

                  1、数组名

                  2、索引

                  3、值

           如何去定义数组:

                  declare -i 定义整数 (申明)

                  declare -a 定义数组array

                  declare -A 定义嵌套的数组

                         共好学院云[1]=云计算专业

                         云计算专业[1]=云三班

                         云三班[1]=张卓

                         【这样数组值,在bash中并不常用】

                  【python 和 shell】

                  array=(值)

                  array=()

           如何给数组赋值:

                  array=()

                  1、array[8]=张卓    (在计算机语言中,索引一般从0开始计算)

                                (索引并不一定是数字 : key-value  array[张卓]=1.87m)

                                (shell中数组赋值,可以跳跃(跳跃赋值))

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

                         做遍历

                        array=(a b c d e)      

                  3、array=('张卓=187' '梁浩田=186' ... )

                  4、通过read命令来赋值

                         read -t 延迟 -p "指定说明" -a 输入数组所需的变量值

                         read -a a b c d e

           如何去调用数组:

                  ${变量名}

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

                  ${数组名}  默认调用 索引=0 的值  $array(最好不要这样写)

                  ${数组名[*]} 或者 ${数组名[@]} 调用数组内所有的值  $* $@

                        

                  练习下: 统计 /var/log/*.log 中 索引为偶数 的文件 的行数的 和;

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

                         for i in {0..7};do

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

                                       line=`wc -l ${a[$i]} | cut -d' ' -f1`

                                       sum+=$line       # sum+=`wc -l ${a[$i]} | cut -d' ' -f1`   # sum+=$(wc -l ${a[$i]} | cut -d' ' -f1)

                                fi

                         done

                         echo $sum

                 

                  1、调用数组的数组长度

                  length("变量")

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

                  2、添加数组值的特殊方式

                  ${变量名[${#变量名[@]}]}="值" 或者  ${变量名[${#变量名[*]}]}="值"

                 

          

           关于数组的其他操作

                  数组切片

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

                                echo ${a[*]:2:4}

                         ${变量名[@]:偏移量}  

                  删除值

                         unset ${变量名[索引]} 

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

                         【知道值,如何查看索引?】

                  修改值

                         a[3]=c

                         a[3]=d 覆盖即修改

           练习:

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

                  declare -a a

                  declare -i max=0

                        

                  for i in `seq 0 9`;do

                          a[$i]=$RANDOM

                         [ ${a[$i]} -gt $max ] && max=${a[$i]}

                  done

                  echo ${a[@]}

                  echo "最大值为:$max"

                  生成10个随机数,并进行排序

    字符串:

           ==============================

           printf 

           name=张卓

           hiagth=183

          

           python  ( %s ,他的升高为 %d ) % (name, hiaght)

                  输出: 张卓,他的升高为183

                  %s

                  %d

                  %f

                 

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

                  %-[num]s  代表左对齐

                         【居中对齐】

           =============================

                 

           1、字符串切片:

                  数组切片:${变量名[@]:偏移量:数值个数}

                  字符串:${变量名:偏移量:数值个数}

                               ${变量名: -数值个数} 【*注意:冒号后面一定要加空格*】

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

                                read "sasasa:" test

                                [ -z $test ] && test=abc

           2、基于模式取子字符串

                  从左自右

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

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

                 

                  从右自左

                  ${变量名%pattern}

                  ${变量名%%pattern}

                  思考:取url中IP(域名)

          

           3、字符替换

                  ${变量名/pattern/替换后的字符串}   【pattern并不是正则表达式,而是文件通配符】

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

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

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

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

                         指定匹配行首必须是 pattern ,才会替换

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

                         指定匹配行尾必须是 pattern , 才会替换

                  注意: /  分隔符,不能替换为(# % 等特殊字符 ,和sed 不一样)

           4、查找并删除

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

                  ${变量名/pattern}

                  ${变量名//pattern}

                  ${变量名/#pattern}

                  ${变量名/%pattern}

           5、替换大小写

                  tr  替换大小写

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

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

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

           6、变量赋值

                  变量名1=${变量名2:-word}  注意没有空格!   输入默认值的作用 , 变量2 没有值,就将 word 默认值赋值给 变量1

                  变量名1=${变量名2:+word}  不常用   变量2 有值的情况下,才将 word默认值赋值给变量1

                  ${变量:=word}   如果变量没有值,就将word赋值给变量,有值,则使用原来的值 

                  变量1=${变量2:?error_infor}  如果变量2 没有值,输出erro_infor错误信息

                         【不知道如何使用?】

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

                  filename1

                  vim filename1

                         a=1

                         b=2

                  :wq

                  vim filename1.sh

                         . /全路径/filename  后者  source /全路径/filename     //执行整个代码

                         c=$[$a+$b]

                         ehco $c

                  :wq

                  bash filename1.sh

                 

                  练习:修改hostname,定义一个 hostname文件 name=xxx ,hostname.sh

                         hostname

                                name=test.com

                        

                         hostname.sh

                         if [ -r /root/hostname ];then

                                . /root/hostname

                         else

                                echo "/root/hostname 没有执行权限"

                         exit 1

                         fi

                         hostname $name

           8、两个命令

                  mktemp  创建临时文件以及目录  temp -- /tmp

                         避免大家取的文件名字重复;mktemp 名字.XXXXXX (XX代表随机数(字母和数字))

                         默认创建是随机的文件

                         -d  创建的就是随机的 目录

                         file=`mktemp a.XXXX`

                  install   复制或删除文件,用法同copy

                         优点可以指定权限来复制文件

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

                                   -t   源目对换

                                   -d  创建

                                   -m MODE

                                    -o OWNER

                                   -g GROUP

  • 相关阅读:
    SQL 耗时优化
    Visual Studio 使用 Web Deploy 发布远程站点
    Windows API 调用示例
    Windows Server 2016 配置 IIS 的详细步骤
    SQL Server 游标的使用示例
    IIS 常用命令
    Nginx的使用和配置
    Nginx安装和配置
    mysql中关于时间的总结
    时间格式转换
  • 原文地址:https://www.cnblogs.com/baocx/p/11400806.html
Copyright © 2020-2023  润新知