• 【linux】shell编程 脚本语法


    1.对shell的认识

            shell是linux中一个重要的层次,他是用户与系统交互作用的界面。最常见的使用方式:在介绍linux命令时,shell都是作为命令解释程序出现:他接收用户打入的命令,进行分析,创建子进程实现命令所规定的的功能,等子进程终止工作后,发出提示符。

            shell除了作为命令结束程序以外,还是一种高级程序设计语言,他有不变量,关键字,有各种控制语句,如if,case,while,for等语句,有自己的语法结构。利用shell程序设计语言可以编写出功能很强、但代码简单的程序,特别是它把相关的linux命令有机的组合在一起,可以大大提高编程的效率,充分利用linux系统的开放性能,设计出适合自己要求的命令。

            由于历史原因,Unix系统上有许多种shell,在linux下,最常用的一种是bash:

                    bash ( Bourne Again Shell): 由GNU 开发的 Shell, 主要目标是与 POSIX 标准保持一致,同时兼顾对 sh 的兼容,bash csh ksh 借鉴了很多功能,是各种 Linux 发行版标准配置的 Shell, Linux 系统 上/bin/sh 往往是指向 /bin/bash 的符号链接。虽然如此, bash sh 还是有很多不同的,一方面, bash 扩展了一些命令和参数,另一方面, bash 并不完全和 sh 兼容,有些行为并不一致,所以 bash需要模拟 sh 的行为 : 当我们通过 sh 这个程序名启动 bash 时, bash 可以假装自己是 sh 不认扩展 的命令,并且行为与sh 保持一致。
            凡是用which命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册中查看内建命令,应该执行 man bash-builtins
             内建命令虽然不创建新的进程,但也会有ExitStatus,通常也用0表示成功非零表示失败,虽然内建命令不创建新的进程,但执行结束后也会有一个状态码,也可以用特殊变量¥?读出。  

     2.执行脚本

            编写一个简单的脚本shell.sh

    1. #!/bin/bash
    2. date
    3. echo "helloworld"
    4. echo
    5. echo "we are BSP2208 class"
    6. echo
    7. /bin/pwd
    8. echo
    9. echo "this is shell脚本"
    10. /bin/ls
    shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是#!(称为shebang)例外,他表示该脚本使用后指定的解释器/bin/sh解释执行。如果把这个脚本加上可执行权限然后执行:

     

            执行方法有三种:

                            1》./shell.sh

                            2》. shell.sh

                            3》source shell.sh

                            4》特例:用bash程序直接执行文件时,不需要脚本文件有可执行权限

                                            /bin/bash ./shell.sh

     如果将命令行下输入的命令用括号括起来,那么一会fork出一个子shell执行小括号中的命令,一行中可以输入由分号隔开多个命令

                    (cd ..; ls -l)   //不会改变工作目录         与不带括号   cd ..; ls -l    执行结果一样

     3.shell语法

            数据类型只有字符串Shell 变量名通常是以字母或下划线打头的字母、数字和下划线字符序列,并且大小写字母意义不同

    有两种类型的Shell变量:环境变量和临时变量

            环境变量:可以从父进程传给子进程,因此Shell进程的环境变量可以从当前Shell进程传给fork出来的子进 程。用printenv命令可以显示当前Shell进程的环境变量。 与env查看环境变量一致

            临时变量:只存在于当前Shell 进程,用set命令可以显示当前Shell进程中定义的所有变量(包括临时变量和环境变 量)和函数。

    环境变量是任何进程都有的概念,而临时变量是 Shell 特有的概念。在 Shell 中,环境变量和临时变量的定 义和用法相似。在Shell中定义或赋值一个变量:

     

     注意:等号两边不能有空格,否则会被shell解释成命令和命令行参数

    5,文件名代换

            这些用于匹配的字符称为通配符,如:*?[ ] 具体如下:

                    *:匹配0个或多个任意字符

                    ?:匹配一个任意字符

                    [若干字符]:匹配方括号中任意一个字符的次出现一次的文件名 

     

                    注意,Globbing 所匹配的文件名是由 Shell 展开的,也就是说在参数还没传给程序之前已经展开了,比如上述Is ch0[012].doc 命令,如果当前目录下有 cho00.doc ch02.doc ,则传给 Is 命令的参数实际上是 这两个文件名,而不是一个匹配字符串
    6.命令代换
            由“ ' ”反引号括起来的也是一条命令,shell先执行命令,然后将输入结果立刻代换到的那个钱命令行中。
            例如:定义一个变量存放date命令的输出:
                    

             命令代换也可以用 $()表示   命令:DATE=$(date)     (例程见上图)

    7.算数代换

            使用$(()),用于算数计算,(())中的shell变量取值将转换成整数,同样含义的$[ ]等价:

            例如:    echo $(($var+3))      等价于$((var+3))或$[var+3]  

            $(())中只能用 +-*/ () 运算符,并且只能做整数运算
            $[base#n],其中 base 表示进制, n 按照 base 进制解释,后面再有运算数,按十进制解释
    7.转义字符
            和C语言类似,\在shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值
    例如:echo \$PATH           或者   echo \\
            

             创建文件  --test

                    touch --test    //报错

            因为各种Unix命令都把-号开头的命令行参数当做命令的选项,而不会当做文件名,如果非要处理以-号开头的文件名,可以两种方法

            touch -- --test     或者touch ./--test

             \ 还有一种用法,在\ 后敲回车表示续行, Shell 并不会立刻执行命令,而是把光标移到下一行,给出一 个续行提示符> ,等待用户继续输入,最后把所有的续行接到一起当作 - 一个命令执行。例如 :

      8.单引号

            Shell 脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内 所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。如果引号没有配对 就输入回车,Shell 会给出续行提示符,要求用户把引号配上对。例如:

                            echo "abcde"

                            echo 'abcde'

     9.双引号

            被双引号括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。单引号不能展开变量。

     10.条件测试

    命令 test [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的 Exit Status 0 ,如果测试结 果为假,则命令的Exit Status 1 。例如测试两个数的大小关系:
    user02$ VAR=2
    user02$ test $VAR -gt 1
    user02$ echo $?

     

    虽然看起来很奇怪,但左方括号 [ 确实是一个命令的名字,传给命令的各参数之间应该用空格隔开,比 如:$VAR -gt 3 ] [ 命令的四个参数,它们之间必须用空格隔开。命令 test [ 的参数形式是相同 的,只不过test 命令不需要 ] 参数。以[命令为例,常见的测试命令如下表所示:

     C语言类似,测试条件之间还可以做与、或、非逻辑运算:

     例程:

    11.分支

            if/then/elif/fi和C语言类似,在Shell中用ifthenelif else fi 这几条命令实现分支控制。这种流程控制语句本质 上也是由若干条Shell命令组成的

    1. #! /bin/bash
    2. if [ -f shell.sh ];then
    3. ./shell.sh
    4. echo "shell.sh is a file and exsit"
    5. else
    6. echo "shell.sh is not exsit"
    7. fi

     

  • 相关阅读:
    暗物质探测器认知教学VR元宇宙平台打破传统束缚
    Flutter 3.19.0 版本新特性
    口袋参谋:如何实时监控对手数据?
    asp毕业设计——基于asp+access的学生排课管理系统设计与实现(毕业论文+程序源码)——学生排课管理系统
    【力扣】杨辉三角问题
    一文详解ATK Loss论文复现与代码实战
    深度强化学习极简入门(十一)——策略梯度方法REINFORCE【附代码】
    python基于django仓库进销存管理系统 计算机毕业设计
    工作笔记记录
    new和malloc的区别
  • 原文地址:https://blog.csdn.net/m0_73189710/article/details/127648902