zoukankan      html  css  js  c++  java
  • 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乘法表

    补充:


     



         

             

          

  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/liuwei6/p/6666847.html
Copyright © 2011-2022 走看看