zoukankan      html  css  js  c++  java
  • 第十章学习笔记

    学习笔记

    sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。相反,C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。其次,在C程序中,每个变量必须有一个类型,例如charintfloat、派生类型(如 struct)等。相反,在 sh脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。最后,每个c程序必须有一个main()函数,每个函数必须定义一个返回值类型和参数(如有)。相反,sh脚本不需要main函数。在 sh脚本中,第一个可执行语句是程序的入口点。

    学习问题:大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?

    根据定义可知,程序设计语言有3个方面的因素,即语法、语义和语用。语法表示程序的结构或形式,亦即表示构成语言的各个记号之间的组合规律,但不涉及这些记号的特定含义,也不涉及使用者。语义表示程序的含义,亦即表示按照各种方法所表示的各个记号的特定含义,但不涉及使用者。语言的种类千差万别。但是,一般说来,基本成分不外4种。数据成分、用以描述程序中所涉及的数据。运算成分、用以描述程序中所包含的运算。控制成分、用以表达程序中的控制构造、传输成分。这些要素具体体现在sh编程中的各类命令当中。

    知识点总结

    1、命名和语法格式:命名要有意义(30个字解决)、以.sh结尾
    脚本格式:开头指针脚本运行环境,以#!组成(如#!/bin/bash),用于解释环境
    注释:#,最好加入说明字段:Author,Created Time,Script Description—注释说明
    2、特殊符号

    ~:家目录
    !:执行历史命令
    $:变量中取内容符
    &:后台执行
    ;:一行执行多个命令,以此为间隔
    |:管道符
    ``:反引号,命令中执行命令
    

    3、管道
    上一个命令的输出作为下一个命令的输入

    4、shell重定向
    <可用来作为命令的option项
    <<重定向输出就是当执行文件的时候,有些参数 要我们输入,此时可用(交互)
    格式化输出

    5、echo
    参数

    n:不要自动换行
    e:若出现某个字符。特殊处理
    a:发出警告声
    c:不换行
    
    :换行且光标移动到行首
    	:插入tab
    -help:显示版本信息
    

    6、程序交互
    read命令:默认接受键盘的输入,回车符代表输入结束

    p:打印信息
    t:打印时间(超时限制)
    s:不回显
    n:输入字符个数
    

    7、变量
    变量分类:
    本地变量:用户私有变量,只有本用户可以用,保存在家目录下的.bash_profile,.bashrc文件中
    全局变量,所有用户都可以使用,保存在etc下的.bash_profile,.bashrc文件中
    用户自定义变量,脚本中的变量
    变量定义:变量名=值
    注意:命名只能用英文字母,数字或下划线,首个字符不能以数字开头
    命名不能有空格,可以使用下划线
    不能使用标点符号
    不能使用bash里面的关键字

    8、运算
    数学比较运算

    eq:等于(equal)
    gt:大于(greater)
    lt:小于(less)
    ge:大于或等于(greater or equal)
    le:小于或等于(less or equal)
    ne:不等于(not equal)
    文件运算

    d:检查文件是否存在且为目录
    e:检查文件是否存在
    f:检查文件是否存在且为文件
    r:文件是否可读
    s:不为空
    w:是否可写
    x:可执行
    O:是否被当前用户拥有
    G:默认用户组为当前用户组
    字符串比较运算

    ==:等于
    !=:不等于
    -n:字符串长度是否大于0
    z:字符串长度是否为0
    逻辑运算

    &&
    ||

    赋值运算

    =

    9、控制结构
    有if选择、for、while、until循环等等,语句结构与C语言类似

    最有收获的内容

    最有收获的是关于sh编程语言和C语言体系的相互比较,这让我更加深入地了解了sh语言。例如在输入输出方面,有:
    read 命令:read variable,从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量。
    echo 命令:输出。
    显示命令执行结果:用反引号括起来。如 echo 反引号 某命令 反引号
    printf 命令,格式化输出字符:与 C 语言相同。

    问题和解决思路

    在学习本章后对一些sh命令进行了模拟练习,运行了shell脚本,截图如下:

    一个简单的打印程序,打印helloworld,sh脚本代码如下:

    #!/bin/sh
    a="hello world!"
    num=2
    echo "a is : $a num is : ${num}nd"
    

    遇到的问题:一开始执行sh脚本时发现执行失败,查看原因得知是权限不允许执行sh脚本

    解决思路:需要有权限命令来执行sh脚本,这里用的是chmod命令, chmod是权限管理命令change the permissions mode of a file的缩写。
    u代表所有者,x代表执行权限。 + 表示增加权限。
    chmod u+x file.sh 就表示对当前目录下的file.sh文件的所有者增加可执行权限。

    这个sh脚本对if语句进行了练习,查看bash、shadow两个文件是否存在,若存在则打印相关的信息。

    if [condition]
    	then 
    		commands
    else
    	commands
    fi		# 结束
    

    对于双分支的if语句,注意不要忘了结束语fi(finish)。
    sh脚本的代码如下:

    #!/bin/sh
    If [ "$SHELL" = "/bin/bash" ];then
    echo "your login shell is the bash 
    "
    echo "SHELL is : $SHELL"
    else 
    echo "your login shell is not bash but $SHELL"
    fi
    [ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
    if [ -f "/etc/shadow" ];then
    echo "电脑密码使用隐藏字符"
    else
    echo "并没有"
    fi
    

    遇到的问题:
    一开始键入代码发现程序报错,查找原因发现是if和[]中的空格输入有误。
    解决思路:应当将if和[]间的空格都打出来,才不会报错
    遇到的问题2:
    如何理解-f选项?

    解决思路:
    这些选项以及其它的选项释义可以通过查阅资料整理如下:

    #[ -f "somefile" ] : 判断是否是一个文件
    #[ -x "/bin/ls" ] : 判断/bin/ls是否存在并有可执行权限
    #{ -n "$var" } : 判断$var变量是否有值
    #[ "&a" = "$b" ] : 判断$a和$b是否相等
    
  • 相关阅读:
    表单重复提交问题
    Win8.1卸载64位Oracle Database 11g的详细图文步骤记录
    A1084. Broken Keyboard (20)
    A1088. Rational Arithmetic (20)
    A1089. Insert or Merge (25)
    A1034. Head of a Gang (30)
    A1013. Battle Over Cities (25)
    A1030. Travel Plan (30)
    A1003. Emergency (25)
    A1076. Forwards on Weibo (30)
  • 原文地址:https://www.cnblogs.com/20191211yss/p/15333848.html
Copyright © 2011-2022 走看看