函数:写一个代码块,用来重复调用的;
 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
 练习:
 1、获取此命令所依赖的所有库文件的列表
 Ldd /bin/cat
 2、复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
 /bin/bash  /mnt/sysroot/bin/bash
 /usr/bin/passwd  /mtn/sysroot/usr/bin/passwd
 3、复制此命令所依赖的所有库文件至目标目录下的对应路径下
 /lib64/ld-linux-x86-64.so.2  /mnt/sysroot/lib64/ld-linux-x86-64.so.2
 每次复制完成一个命令后,不要退出,而是提示用户输入新的复制的命令,并重复完成上述功能,直到用户输入quit退出;
 

Shell:Day08.笔记的更多相关文章

  1. Learning The Bash Shell读书笔记(整理)

    最近搞了一本书 Learning Bash Shell,发现有人已经写了阅读笔记,我就在这边整理一下 来自blog:http://blog.sina.com.cn/n4mine Learning Th ...

  2. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  3. Shell编程笔记

    Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理.   修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...

  4. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  5. 菜鸟教程之学习Shell script笔记(上)

    菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...

  6. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  7. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  8. shell 学习笔记2-shell-test

    一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...

  9. SHELL学习笔记三

    SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...

随机推荐

  1. Windows下EDK2环境的搭建以及经典的程序设计Print Hello World !-----(Linux下的待后续熟练了再更新)

    很久没有更新博客了,之前的博客末尾有提到过要写有关EDK2环境搭建的博客,现在就是完成的时候了,后续博客更新会比较规律(大概每周一篇?) 本人博客仅仅发表于博客园,本人主页为         http ...

  2. jadx初识

    一.jadx介绍 一款相对流行的反编译工具 下载:https://github.com/skylot/jadx/releases/tag/v1.0.0 解压后得到这么几个文件: 启动:(以下来两个文件 ...

  3. git命令,github网站以及sourceTree用法详解

    1.git下载安装 这里只是windows安装方法: 进入这个网址:http://msysgit.github.com/,点击下载,就会下载下来一个exe文件,双击打开,安装即可 完成安装之后,就可以 ...

  4. Head First设计模式——原型模式和访问者模式

    原型 原型模式:当创建给定类的过程很昂贵或很复杂时,就使用原型模式. 我们在进行游戏的时候游戏会动态创建怪,而怪时根据场景的不同而变化创建的,英雄自己也会创建一些随从.创建各式各样的怪兽实例,已经越来 ...

  5. JavaScript 模式》读书笔记(3)— 字面量和构造函数2

    上一篇啊,我们聊了聊字面量对象和自定义构造函数.这一篇,我们继续,来聊聊new和数组字面量. 三.强制使用new的模式 要知道,构造函数,只是一个普通的函数,只不过它却是以new的方式调用.如果在调用 ...

  6. CentOS7系统服务管理systemctl

    目录 一.systemctl介绍 二.systemctl常用命令 1.启动服务 2.停止服务 3.重启服务 4.查看服务是否已启动 5.查看服务的状态 6.启用开机自启动服务 7.停用开机自启动服务 ...

  7. 深入Redis客户端(redis客户端属性、redis缓冲区、关闭redis客户端)

    深入Redis客户端(redis客户端属性.redis缓冲区.关闭redis客户端) Redis 数据库采用 I/O 多路复用技术实现文件事件处理器,服务器采用单线程单进程的方式来处理多个客户端发送过 ...

  8. CentOS 7.3下安装MySql

    1.下载mysql源安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm   2.安装mysql源 ...

  9. github本地提交代码到远程仓库

    1.git工作状态: Workspace: 工作区  :等于平时放代码的地方 Index / Stage: 暂存区,临时存放你的改动,它只是一个文件,保存即将提交到文件列表信息 Repository: ...

  10. Slam笔记I

    视觉Slam笔记I 第二讲-三位空间刚体运动 点与坐标系: 基础概念: 坐标系:左手系和右手系.右手系更常用.定义坐标系时,会定义世界坐标系,相机坐标系,以及其他关心对象的坐标系.空间中任意一点可由空 ...