• 20201307梁辰鱼第三周学习总结


    20201307梁辰鱼第三周学习总结

    前言:学习一门程序设计语言有哪些必备的要素和技能。

    • 分阶段学习:在我们的每个学习阶段,供选择参考的教程是不一样的,对于一门语言来说,如果是刚入门,我们应该着重学习语法等基础知识;如果有基础的话,那么关于算法、设计结构、编程思想将是我们的下一个学习目标
    • 勤加练习:没有人是生下来就会写代码的,大佬们也是通过一点点的积累才会变成大佬。模仿是一种很好的学习方式,程序设计也是这样,我们在开始学的时候可以多模仿别人的代码进行学习,体会其中的编程思想,逐渐形成自己的表达方式,这样就可以逐渐进步,但要注意的是我们不要直接复制粘贴别人的代码,一定要自己敲,否则学习的效果将会大打折扣。
    • 解决问题的能力:当我们在学习中遇到问题时,要培养自己独立解决问题的能力,我们在解决一个问题时,会在这个过程中学到很多知识,而且当我们了解出错的原因时,我们下一次再这个地方几乎就有99%的把握不会出错。
    • 进行小组讨论:一个人解决问题的能力是有限的,而且长时间困扰在一个问题中可能会熄灭我们的学习热情,所以当我们真的遇到很困扰的问题时,一定要多提问,这样才能帮助我们更好的学习。

    1 知识点归纳

    1.1 sh脚本

    sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。例如,我们可以创建一个文本文件mysh,包含:

    #!/bin/bash
    # comment line
    echo hello
    

    使用chmod +x mysh使其可执行。然后运行mysh。

    sh脚本的第一行通常以#!组合开始,通常称为shebang;shebang允许主sh调用适当版本的sh来执行脚本。如果未指定shebang,它将运行默认的sh,即Linux中的/bin/bash。 当bash执行mysh脚本时,将会打印hello。

    1.2 sh脚本与C程序
    //sh代码
    INTERPRETER: read & execute
    
    mysh a b c d
    $0 $1 $2 $3 $4
    
    //C代码
    COMPILE-LINKED to a.out
    
    a.out a b c d
    main(int argc, char *argv[])
    
    1. 命令执行的区别
      • Sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么Sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。
      • C程序必须先编译链接到一个二进制可执行文件.然后通过主sh的子进程运行二进制可执行文件
    2. 变量类型的区别
      • 在C程序中,每个变量必须有一个类型,例如char、int、float、派生类型(如struct)等。
      • 在sh脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。
    3. mian函数的有无
      • 每个C程序必须有一个main。函数,每个函数必须定义一个返回值类型和参数(如有)
      • sh脚本不需要main函数。在sh脚本中,第一个可执行语句是程序的入口点。
    1.3 命令行参数

    可使用与运行sh命令完全相同的参数调用sh脚本,如:

    mysh one two three
    

    在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。前10个命令行参数可以作为$0 ~ $9被访问。其他参数必须称为${10}~${n},其中n>10。或者,可以通过稍后显示的shift命令査看它们。通常,$0是程序名本身,$1到$n是程序的参数,在sh中,可用内置变量$#和$*计数并显示命令行参数。

    1. $# =命令行参数$ 1到$n的数量
    2. $* =所有命令行参数,包括$0
    3. $S =执行sh的进程PID
    4. $? =最后一个命令执行的退出状态(如果成功,则为0,否则为非0 )
    1.4 sh变量

    sh有许多内置变量,如PATH、HOME、TERM等。除了内置变量外,用户还可使用任何符号作为sh变量。不需要声明。所有的sh变量值都是字符串。未赋值的sh变量是NULL字符串。sh变量可用以下方法设置或赋值:

    variable=string # NOTE: no white spaces allowed between tokens
    

    如果A是一个变量,则$A是变量的值。

    1.5 sh中的引号

    sh有许多特殊字符,如$、/、*、>、<等。要想把它们用作普通字符,可使用\或单引号来引用它们。

    A=xyz
    echo \$A       ==>  $A	     #	back quote $ as is
    echo * $A/     ==>  $A	     #	NO substitution within SINGLE quotes
    echo "see $A"  ==>  see	xyz  #	substitute $A in DOUBLE quotes
    

    通常,\用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。

    1.6 sh语句

    sh语句包括所有Unix/Linux命令,以及可能的I/O重定向。

    Is
    Is > outfile 
    date
    cp f1 f2
    mkdir newdir 
    cat < filename
    

    此外,sh编程语言还支持控制sh程序执行的测试条件、循环、case等语句。

    1.7 sh命令
    1.7.1内置命令

    sh有许多内置命令,这些命令由sh执行,不需要创建一个新进程。下面列出一些常用的内置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:将位置参数$2 $3...重命名为$1 $2...。
    • trap [arg] [n]:接收到信号n后执行参数。
    • umask [ddd]:将掩码设置为八进制数ddd的。
    • wait [pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。

    read命令:当sh执行read命令时,它会等待来自stdin的输入行。它将输入行划分为几个标记,分配给列岀的变量。read的一个常见用法是允许的sh进行交互, 如下面的示例所示。

    echo -n "enter yes or no : " 		 	 # wait for user input line from stdin
    read ANS			 	  		 		# sh reads a line from stdin
    echo $ANS								# display the input string
    

    在获得输入后,sh可能会测试输入字符串,以决定下一步做什么。

    1.7.2 Linux命令

    sh可以执行所有的Linux命令。其中,有些命令几乎已经成为sh不可分割的一部分, 因为它们广泛用于sh脚本中。下文列出并解释了其中一些命令。

    1. echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
    2. expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。
    3. 管道命令:在sh脚本中经常使用管道作为过滤器。
    4. 实用命令:除了上面的Linux命令之外,sh还使用许多其他实用程序作为命令。其中包括:
      • awk:数据处理程序。
      • cmp:比较两个文件。
      • comm:选择两个排序文件共有的行。
      • grep:匹配一系列文件的模式。
      • diff:找出两个文件的差异。
      • join:通过使用相同的键来连接记录以比较两个文件。
      • sed:流或行编辑命令。
      • sort:排序或合并文件。
      • tail:打印某个文件的最后n行。
      • tr:一对一字符翻译。
      • uniq:从文件中删除连续重复行。

    1.8 命令替换

    在sh中,$A会被替换成A值。同样,当sh遇到'cmd'(用引号括起来)或$(cmd)时, 它会先执行cmd,然后用执行的结果字符串替换$(cmd)。

    echo $(date)	# display the result string of date command
    echo $(ls dir)	# display the result string of ls dir command
    

    1.9 sh控制命令

    sh是一种编程语言,支持许多执行控制语句,类似于C语言中的语句。

    1.9.1 if-else-fi

    if-else-fi语句的语法是:

    if [ condition ]     # NOTE: must have white space between tokens
       then
          statements
       else	             # as usual, the else part is optional
          statements
    fi	         	     # each if must end with a matching fi
    

    每个语句必须在单独的一行上。但是,如果多个语句之间用分号分开,则sh允许多个语句在同一行,实际上,if-else-fi语句通常写成:

    if [ condition ]; then
       statements
     else
       statements
    fi
    
    1.9.2 for语句

    sh中的for语句作用类似于C语言中的for循环。

    for VARIABLE in string1 string2 ・・・ stringn
      do
        commands
      done
    

    在每次迭代中,变量接受一个参数字符串值,并执行关键字do和done之间的命令。

    1.9.3 while语句

    sh的while语句类似于C语言中的while循环:

    while [ condition ]
      do
        commands
      done
    

    当条件为真时,sh将重复执行do-done关键字中的命令。预计条件会有变化,所以循环将在某个时间点退出。

    1.9.4 until-do 语句

    该语句类似于c语言中的do-until语句。

    until [ $ANS = "give up" ]
      do
          echo -n "enter your answer :"
          read ANS
      done
    
    1.9.5 case 语句

    该语句也类似于C语言中的case语句,但在sh编程中很少使用。

    case $variable in
         patternl) commands;; # note the double semicolons ;;
         pattern2) command;; 
         patternN) command;;
    esac
    
    1.9.6 continue 和 break 语句

    与在C语言中一样,continue重启最近循环的下一个迭代,break退出最近循环。它们的工作原理与在C语言中完全相同。

    1.10 sh中的通配符
    1. 星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件。
      • file*:列出当前目录中所有文件的信息。
      • ls *.c:列出当前目录中所有以.c结尾的文件。
    2. ?通配符:查询某文件名中的字符。
      • file ???:有3个字符的所有文件名。
      • ls*.??: 一个点号.后有2个字符的所有文件名。
    3. []通配符:查询文件名中一对[]中的字符。
      • file *[ab] *:包含字符a或b的所有文件名。
      • ls *[xyz] *:列出所有包含x、y或z的文件名。
      • ls *[a-m] *:列出包含a到m范围内字符的所有文件名。
    1.11 调试sh脚本

    sh脚本可由带有-x选项的子sh运行,以进行调试,如:

    bash -x mysh
    

    子sh将在执行命令之前显示要执行的每个Sh命令,包括变量和命令替换C它允许用户跟踪命令执行。如果出现错误,Sh将在错误行上停止并显示错误消息。

    2 实际截图与代码链接

    2.1 使用echo打印字符串
    #i /bin/bash
    # comment line
    echo hello world
    

    2.2 sh命令行参数
    #! /bin/bash
    echo \$# = $#
    echo \$* = $*
    echo $1 $9 $10
    echo $1 $9 %{10}
    shift
    echo $1 $9 ${10}
    

    2.3 sh变量赋值
    #! /bin/bash
    echo A
    echo $A
    A="hellow_orld"
    echo $A
    B=A
    echo $B
    B=$A
    echo $B
    


    2.4 sh中的引号
    #! /bin/bash
    A=lcy123
    echo \$A
    echo '$A'
    echo "see $A"
    

    2.5 sh语句
    #! /bin/bash
    ls
    ls > outfile
    date
    cp f1 f2
    mkdir newdir
    cat < filename
    

    2.6 expr命令
    #! /bin/bash
    I=123
    echo $I
    I=$(expr $I + 1)
    echo $I
    

    2.7 if—else—fi
    #! /bin/bash
    s1="123"
    s2="456"
    if [ s1 = s2 ]
    	then
    		echo "="
    	else
    		echo "!="
    fi
    

    2.8 for循环
    #! /bin/bash
    for STR in LL CC YY
    	do
    		if [ "$STR" = "LL" ]; then
    			echo LL
    		elif [ "$STR" = "CC" ]; then
    			echo CC
    		else
    			echo YY
    		fi
    	done
    

    2.9 while 语句
    #! /bin/bash
    i=0
    while [ $i != 7 ]
    	do
    		echo $i
    		i=$(expr $i + 1)
    	done
    

    2.10 until-do 语句
    #! /bin/bash
    i=0
    until [ $i = 7 ]
        do
            echo "the num is $i"
            i=$(expr $i + 1)
        done
    


    2.11 通配符使用的练习

    3 问题及解决思路

    3.1 sh脚本中"[]"中的内容需要与"[]"之间隔开一个空格

    这个问题来自于我对于c语言的使用习惯,对于c语言的使用,括号与变量之间并没有需要分隔一个空格的要求,导致我在sh脚本中也这样使用了,但事实不是这样,sh脚本会报错,而且代码中变量的赋值无法正确显示,大家可以看一下下面两幅图的区别。

    可以发现,没有加空格分隔的代码中,; then没有显示高亮,所以这个地方确实是存在区别。

    3.2 变量赋值时,"="与变量之间不能加空格

    这也是sh脚本的一个要求,同样,大家可能因为编程习惯而根本没有发现这个报错,还感到很莫名奇妙,下面直接来看对比图:

    同样,我们可以发现,加空格的变量在代码中不显示高亮,不加空格的一组则可以正常运行

    4 学习总结

    在本章中,我学习了sh编程的基本规则,并与之与C语言程序做对比,也亲自尝试了编写sh脚本,如:sh变量赋值、sh语句、sh内置命令等;也尝试编写了一些sh控制语句,如:for循环、while循环、do—while循环等;
    还学会了星号通配符、?通配符、[]通配符的使用。

  • 相关阅读:
    一种无法被Dump的jar包加密保护解决方案
    基于设备指纹零感验证系统
    IOS防作弊产品技术原理分析
    某移动端防作弊产品技术原理浅析与个人方案构想
    web安全防御之RASP技术
    Linux漏洞分析入门笔记-Off-By-One(栈)
    smb中继学习
    Dedecms sp2 5.7 后台getshell审计
    phpmyadmin后台代码执行分析复现
    静态恶意代码逃逸-学习一
  • 原文地址:https://www.cnblogs.com/yu15141310373/p/16705816.html
Copyright © 2020-2023  润新知