三分钟复习Shell脚本语言

时间:2023-02-13 09:36:57

http://c.biancheng.net/cpp/view/6994.html

bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。

因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,Shell脚本只要“用心写”一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于:

    简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。
    可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。
    开发容易:可以在短时间内完成一个功能强大又妤用的脚本。


但是,考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell:

    资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)。
    需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)。
    有跨平台(操作系统)移植需求(一般使用C 或Java)。
    复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)。
    对于影响系统全局性的关键任务应用。
    对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵、破解、恶意破坏等等。
    项目由连串的依赖的各个部分组成。
    需要大规模的文件操作。
    需要多维数组的支持。
    需要数据结构的支持,比如链表或数等数据结构。
    需要产生或操作图形化界面 GUI。
    需要直接操作系统硬件。
    需要 I/O 或socket 接口。
    需要使用库或者遗留下来的老代码的接口。
    私人的、闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)。


运行Shell脚本有两种方法。
    作为可执行程序
    作为解释器参数

 定义变量
定义变量时,变量名不加美元符号($),如:

    variableName="value"

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

    首个字符必须为字母(a-z,A-Z)。
    中间不能有空格,可以使用下划线(_)。
    不能使用标点符号。
    不能使用bash里的关键字(可用help命令查看保留关键字)。


变量定义举例:

    myUrl="http://see.xidian.edu.cn/cpp/linux/"
    myNum=100

使用变量
使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:

 删除变量
使用 unset 命令可以删除变量。语法:

    unset variable_name

**************************************************************************************
三分钟复习Shell脚本语言

**************************************************************************************

它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

**************************************************************************************
三分钟复习Shell脚本语言


**************************************************************************************
三分钟复习Shell脚本语言
**************************************************************************************
三分钟复习Shell脚本语言


**************************************************************************************
三分钟复习Shell脚本语言


**************************************************************************************
三分钟复习Shell脚本语言



**************************************************************************************

三分钟复习Shell脚本语言


**************************************************************************************
三分钟复习Shell脚本语言

注释:
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

双引号的优点:

    双引号里可以有变量
    双引号里可以出现转义字符

如果变量与其它字符相连的话,需要使用大括号({ }):


注意,根据POSIX标准,浮点格式%e、%E、%f、%g与%G是“不需要被支持”。这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建于bash、ksh93和zsh中的printf命令都支持浮点格式。


Shell case esac语句
;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。

command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项,如下所示:
如果你希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用。


 重定向深入讲解
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

    标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
    标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
    标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。


Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:

如果希望屏蔽 stdout 和 stderr,可以这样写:

    $ command > /dev/null 2>&1

Shell 中包含脚本可以使用:

    . filename



    source filename

两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。