zoukankan      html  css  js  c++  java
  • 20191324第三周读书笔记

    第十章:sh编程

    sh脚本

    • sh脚本由三个sh函数组成的层次结构组成;cpf2f()将文件复制到文件,cpf2d()将文件复制到目录,cpd2d()递归复制目录
    • sh脚本的第一行通常以#!组合开始,通常称为shebang,当主sh见到shebang时,会读取脚本所针对的程序名并调用该程序。
    • 如果没指定shebang,他将运行默认的sh。

    sh脚本与c程序

    • sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。
    • sh脚本中的第一个可执行语句是程序的入口点。
    • 如果行是可执行命令且为内置命令,那么sh可以直接执行。否则,他会复刻一个子进程来执行命令直到他终止。
    • C程序需要先编译链接到一个二进制可执行文件,之后通过主sh子进程运行二进制可执行文件。
    • C程序中的每一个变量必须有一个类型。
    • C程序需要有一个mian()函数作为入口点。

    命令行参数

    • 在sh脚本中,可以通过位置参数$0,$1等访问命令行参数。
    • $# = 命令行参数1到n的数量
    • $* = 所有命令行参数,包括0S = 执行sh的进程PID
    • $? = 最后一个命令执行的退出状态(若成功为0,否则为非0)

    sh变量

    • sh脚本中的每个变量都是字符串,未赋值的sh变量是null字符串。sh变量可用以下方法设置或赋值
    • 如果A是一个变量,则$A是变量的值

    sh中的引号

    • sh有许多特殊字符,如$、/、*、<、>等。要想把他们用作普通字符,可使用或单引号来引用。
    • 单双引号的区别:单引号内没有替换;双引号用于保留双引号字符串中的空格,且会发生替换。

    sh语句

    • sh语句包括所有Unix/Linux命令,以及可能的I/O重定向
    • sh编程还支持sh程序执行的测试条件、循环、case等语句

    sh命令

    • .file :读取并执行文件。
      break [n]:从最近的第 n 个嵌套循环中退出。
      cd [dirname]:更换目录。
      continue [n]:重启最近的第 n 个嵌套循环。
      eval [arg...]:计算一次参数并让sh执行生成的命令。
      exec [arg...]:通过这个 sh 执行命令, sh 将会退出。
      exit[n]:使 sh 退出,退出状态为 n 。
      export [var...]:将变量导出到随后执行的命令。
      read [var...]:从 stdin 中读取一行并为变量赋值。
      set [arg...]:在执行环境中设置变量。
      shift :将位置参数23...重命名为12...
      trap [arg[n]:接收到信号 n 后执行参数。
      umask [ ddd ]:将掩码设置为八进制数 ddd 的。
      wait [pid];等待进程 pid ,如果没有给出 pid ,则等待所有活动子进程。
      read 命令:当 sh 执行 read 命令时,它会等待来自 stdin 的输入行。它将输人行划分为几个标记,分配给列出的变量。
    • Linux命令:
      echo:将参数字符串作为行回显到stdout,通常将多个空格压缩为一个(除非有引号);
      expr:用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
    点击查看代码
    I = 123
    I = $(expr $I +1)
    
    • 管道命令:在sh脚本中经常用作过滤器
    • 实用命令:
      awk:数据处理程序;
      cmp:比较两个文件;
      comm:选择两个排序文件共有的行;
      grep:匹配一系列文件的模式;
      diff:找出两个文件的差异;
      join:通过使用相同的键来连接记录以比较两个文件;
      sed:流或行编辑命令;sort:排序或合并文件;
      tail:打印某个文件的最后n行;
      tr:一对一字符翻译;
      uniq:从文件中删除连续重复行。

    命令替换

    • 当sh遇到'cmd'或$(cmd)时,会优先执行cmd,并用执行结果字符串替换cmd。

    命令分组:

    • 在sh脚本中,使用{}或()对命令进行分组;
    • {}:在相同环境下执行{}中的命令;
    • ():通过subsh进程执行()中的命令,subsh进程可在不影响父sh的情况下更改其工作目录;

    sh控制语句:

    • 在sh中每个语句需单独在一行上,若用分号将多个语句隔开,则运行多个语句在同一行;
    • 在sh中0为TRUE,而非0为FALSE;
    • if-else-fi语句:
    点击查看代码
    if [condition]; then
    	statements
    else
    	statements
    fi
    
    • 字符串比较:
    点击查看代码
    if [s1 = s2]
    if [s1 != s2]
    if [s1 < s2]
    if [s1 > s2]
    
    • 作为整数比较:
    点击查看代码
    -eq           #等于
    -ne           #不等于
    -gt           #大于
    -lt           #小于  
    -ge           #大于等于
    -le           #小于等于
    
    • 文件比较:
    点击查看代码
    if [ -x name]
    
    -e filename #如果 filename存在,则为真
    -f filename #如果 filename为常规文件,则为真
    -d filename #如果 filename为目录,则为真 
    -r filename #如果 filename可读,则为真 
    filename1 -ef filename2 #如果 filename1与filename2相同,则为真
    
    • if-elif-else-fi复合语句:
    点击查看代码
    if [condition1]; then
    	statements
    	elif [condition]; then
    		statements
    	#additional elif[condition3]; then
    	.....
    	else
    		statements
    	fi
    
    • 复合条件:与在c语言中一样,sh也允许在复合条件中使用&&(and)和||(or),但语法比c语言更加严格。条件必须用一对匹配的双括号[[和]]括起来。
    • for语句:
    点击查看代码
    for VARIABLE in string1 string2 ... stringn
    	do
    		statements
    	done
    
    • 每次迭代中,变量接受一个参数字符串值,并执行do和done之间的命令
    • while语句:当条件为真时,重复执行do-done语句,直至为假时退出
    点击查看代码
    while [condition]
    	do
    		statements
    	done
    
    • until-do语句:当条件为真时退出循环
    点击查看代码
    until [condition]
    	do
    		statements
    	done
    

    I/O重定向

    • .>file stdout转向文件,如果文件不存在,将会创建文件
    • .>>file stdout追加到文件
    • <file 将文件用作stdin;文件必须存在具有r权限
    • <<word 从“here”文件中获取输入,直到包含“word”的行

    sh中的通配符

    • file *:列出当前目录中所有文件的信息
    • ls *.c:列出当前目录中所有以.c结尾的文件
    • ?通配符:查询某文件名中的字符
    • []通配符:查询文件名中一对[]中的字符
    • file ???:有三个字符的所有文件名
    • ls *.??:点号后有2个字符的所有文件名
    • file [ab]:包含字符a或b的所有文件名
    • ls [xyz]:列出所有包含x、y或z的文件名
    • ls [a-m]:列出包含a到m范围内字符的所有文件名

    一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?

    • 需要一定的自学能力,老师上课说的并不全,需要自己线下自学
    • 需要强的动手能力,不能懒,不要以为上课看一遍老师脚本过程就记住了,要多实践

    实践:杨辉三角


    代码:

    点击查看代码
    #!/bin/bash  
    if (test -z $1) ;then 
     read -p "Input Max Lines:" MAX 
    else 
            MAX=$1  
    fi  
     
    i=1  
    while [ $i -le $MAX ]   #i行控制  
    do  
         j=1  
         while [ $j -le $i ]        #j列控制  
         do  
            f=$[i-1]        #f=i-1 这是另一种计算写法。  
            g=$[j-1]        #g=j-1 这是另一种计算写法。  
            if [ $j -eq $i ] || [ $j -eq 1 ] ; then 
                    declare SUM_${i}_$j=1           #声明变量 头尾都是1  
            else 
                    declare A=$[SUM_${f}_$j]       #取上一行的j列变量  
                    declare B=$[SUM_${f}_$g]       #取上一行的j-1列变量  
                    declare SUM_${i}_$j=`expr $A + $B`    #声明并计算当前变量的值  
            fi  
            echo -en $[SUM_${i}_$j]" "  #输出当前变量  
            let j++  
         done  
         echo       #换行  
         let i++  
    done
    

    参考链接: https://blog.csdn.net/oldboy8/article/details/8294594

  • 相关阅读:
    STC项目风险分析
    “四则运算练习器”的开发心得与优化方案
    针对“订餐系统”的分析、改进建议与阅读心得
    记一次leetcode翻车之路---给自己做个记录
    数据库基础(一)MYSQL
    面试题第1发---记20年某次面试
    go之“hello word”
    利用python简单实现unittest
    web自动化(python)——selenium工具基本使用
    2015最强java开源oa源码
  • 原文地址:https://www.cnblogs.com/pxmxxr/p/15332591.html
Copyright © 2011-2022 走看看