• Linux(五)shell编程基础


    一、Linux shell简介

          1、shell概述        

              Shell 是用户与内核进行交互操作的一种接口,目前最流行的 Shell 称为 bash Shell
              Shell 是一门编程语言<解释型的编程语言>,即 shell 脚本<就是在用 linux 的 shell 命令编程>,
              Shell 是一种脚本语言,那么,就必须有解释器来执行这些脚本。
              Unix/Linux 上常见的 Shell 脚本解释器有 bash、sh、csh、ksh 等,习惯上把它们称作一种 Shell。
              我们常说有多少种 Shell,其实说的是 Shell 脚本解释器, 可以通过 cat /etc/shells 命令查看系 统中安装的 shell,不同的 shell 可能支持的命令语法是不相同的
           2、shell基本格式

               代码写在普通文本文件中,通常以.sh 结尾

               vi helloworld.sh       

               #!/bin/bash                                    ## 表示用哪一种 shell 解析器来解析执行我们的这个脚本程序
               echo "hello world"                            ## 注释也可以写在这里
               保存退出即可
               在这里,我们就写好了一个 shell 脚本, 第一行是固定需要的,表明用哪一种 shell 解析器来 执行我们的这个脚本程序。 本质上, shell 脚本里面的代码都是就是一些流程控制语句加一 些特殊语法再加 shell 命令组成。 其中,我们可以当做每一个命令就是 shell 编程当中的关键 字。
           3、shell执行方式

              (1) sh 方式

                  sh helloworld.sh           ## 直接指定用系统默认的 bash shell 解释执行

              (2) source 方式

                 source 命令也称为“点命令”,也就是一个点符号( .) ,是 bash 的内部命令。
               功能:使 Shell 读入指定的 Shell 程序文件并依次执行文件中的所有语句  source 命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
               用法:source filename   或者. filename         例:source helloworld.sh  或者. helloworld.sh

                 注意:点和脚本之间是有空格的

              (3)直接执行该脚本文件                

                 可以有两种方式,不过这两种方式的执行,都需要该文件有执行权限 所以在执行之前,我们要更改他的执行权限
                 chmod 755 helloworld.sh

                切换到该文件所在的路径下执行命令:./helloworld.sh  或者helloworld.sh

                直接以绝对路径方式执行:/root/bin/helloworld.sh

    二、shell基本语法

          1、系统变量           

             Linux Shell 中的变量分为“系统变量”和“用户自定义变量”
              系统变量可以通过 set 命令查看                       常用系统变量: $PWD $SHELL $USER $HOME

          2、自定义变量

             (1)语法: 

              变量=值 (例如 STR=abc)     等号两侧不能有空格      变量名称一般习惯为大写
              
              使用变量: $STR
              双引号和单引号有区别: 双引号仅将空格脱意, 单引号会将变量引用比如$param 脱意
             (2)示例:
               

                  解释:
                  命令: ABC=huang bo,定义变量时中间带有空格,那么一定要带引号,不然会定义不成 功
                  命令: ABC='huang bo', 带了单引号则原样输出。 表示引号中间的值是整体字符串 在引号当中要引用变量的时候,单引号和双引号就有区别啦:
                  命令: echo 'xu zheng $ABC' 和 echo "xu zheng $ABC"
                  请看区别:
                          如果是单引号,则引号当中的任何东西都当做字符串,即特殊字符会被脱意
                          如果是双引号, 那么$ABC 能打印出变量的值

                 那假如命令是这样的: echo "xu zheng $ABCabc",请问还能不能打印出变量 ABC 的值呢? 请看结果:
     

             (3)变量高级用法         

                   撤销变量: unset ABC
                   声明静态变量: readonly ABC= 'abc' 特点是这种变量是只读的,不能 unset
                   请先看一个例子, 我现在写两个脚本,在 a.sh 中调用 b.sh 执行,那我们想知道 a 脚本能 不能获取到 b 脚本的变量, b 脚本能不能获取到 a 脚本的变量?
                  

           在 a.sh 中只打印出了变量 A 的值,这个好理解,因为 shell 是顺序解析执行的,在打印 变量 B 的时候,就算它能获取到 b.sh 当中的变量,它也还没执行,所以,肯定获取不到
           再看 b.sh 打印出来的结果: 可以发现虽然 a.sh 当中的语句执行完了再调用 b.sh 来执 行,但是 b.sh 脚本依然也没法获取到 a.sh 的变量
           那怎么解决?

           使用 export 关键字
           export A="A in a.sh"
           意味着把变量提升为当前 shell 进程中的全局环境变量,可供其他子 shell 程序使用, A 变量就成了 a.sh 脚本所在 bash 进程的全局变量,该进程的所有子进程都能访问到变 量 A

           

           另外一种使用方式:
           如果在 a.sh 脚本中用如下方式调用 b.sh:  . /root/bin/b.sh ## 注意:重点关注最前面那个“ .”号  或者   source /root/bin/b.sh
           用上述两种方式意味着: b.sh 就在 a.sh 所在的 bash 进程空间中运行
           

           总结:
                 1、 a.sh 中直接调用 b.sh,会让 b.sh 在 A 所在的 bash 进程的“子进程”空间中执行
                 2、而子进程空间只能访问父进程中用 export 定义的变量
                 3、一个 shell 进程无法将自己定义的变量提升到父进程空间中去
                 4、 source 或者“ .”号执行脚本时,会让脚本在调用者所在的 shell 进程空间中执行

              (4)反引号赋值              

                 a=`ls -l /root/bin`         ##反引号,运行里面的命令,并把结果返回给变量 a
                另外一种写法: a=$(ls -l /root/bin)

              (5)特殊变量

                       先来看看各个常用的特殊变量的概念:
                         $? 表示上一个命令退出的状态码
                         $$ 表示当前进程编号
                         $0 表示当前脚本名称$n 表示 n 位置的输入参数( n 代表数字, n>=1)
                         $# 表示参数的个数,常用于循环
                         $*和$@ 都表示参数列表

         

              注: $*与$@区别
                    $* 和 $@ 都表示传递给函数或脚本的所有参数
                   不被双引号" "包含时——          $* 和 $@ 都以$1 $2 „ $n 的形式组成参数列表
                    当它们被双引号" "包含时——        "$*" 会将所有的参数作为一个整体,以"$1 $2 „ $n"的形式组成一个整串;
                   "$@" 会将各个参数分开,以"$1" "$2" „ "$n" 的形式组成一个参数列表

    三、运算符

         1、算数运算符

           (1)用expr            

                  格式 expr m + n 或 $((m+n)) 注意 expr 运算符间要有空格
                  例如计算( 2+3)×4 的值
                       1、 分步计算    S=`expr 2 + 3`
                                           expr $S * 4 ## *号需要转义
                        2、 一步完成计算
                               expr `expr 2 + 3 ` * 4
                               echo `expr \`expr 2 + 3\` * 4`

             (2)用(())

                   ((1+2))
                  (((2+3)*4))
                  count=1
                  ((count++))
                 echo $count
                 但是要想取到运算结果,需要用$引用   a=$((1+2))
             (3)用$[]

    四、流程控制

         1、if

             语法格式:               

                if condition
                    then
                         statements

                   [elif condition
                   then statements. ..]
                   [else
                       statements ]
                fi

     

       

    []  =  两侧都有空格

       

             

          短路运算符(理解为三元运算符) [ condition ] && echo OK || echo notok    条件满足,执行&&后面的语句;条件不满足,执行||后面的语句

    条件判断组合 
    条件判断组合有两种使用方式: [] 和 [[]]
    注意它们的区别:
    [[ ]] 中逻辑组合可以使用 && || 符号
    [] 里面逻辑组合可以用 -a -o

         

    常用判断运算符:
    (1) 字符串比较
           = 判断相等     != 判断不相等       -z 字符串长度是为 0 返回 true         -n 字符串长度是不为 0 返回 true

    (2) 整数比较
    -lt 小于
    -le 小于等于
    -eq 等于
    -gt 大于-ge 大于等于
    -ne 不等于

    (3)文件判断

    -d 是否为目录
    if [ -d /bin ]; then echo ok; else echo notok;fi
    -f 是否为文件
    if [ -f /bin/ls ]; then echo ok; else echo notok;fi
    -e 是否存在
    if [ -e /bin/ls ]; then echo ok; else echo notok;fi

         2、while 

        3、case

          4、for三种方式

           

            5、函数使用

    函数调用方式:function hello()   或 function hello  或 hello

    注意:
    1、 必须在调用函数地方之前,先声明函数, shell 脚本是逐行运行。不会像其它语言一样先 预编译
    2、 函数返回值,只能通过$? 系统变量获得,可以显示加: return 返回,如果不加,将以最 后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)

          6、函数参数

    案例:打印9*9乘法表

    补充:


     



         

             

          

  • 相关阅读:
    数据结构
    java web
    C++
    SQL(结构化查询语言)
    网站协议
    python
    爬虫
    select 多选
    List 去除重复数据的五种方式
    oracle锁表SID查询
  • 原文地址:https://www.cnblogs.com/liuwei6/p/6666847.html
Copyright © 2020-2023  润新知