zoukankan      html  css  js  c++  java
  • Shell程序设计

    一、Shell程序概述

      一般步骤如下:

        (1)编辑文件;

        (2)保存文件;

        (3)将文件赋予可以执行的权限;

        (4)运行及排错;

      常用到命令如下:

        (1)vi:编辑保存文件;

        (2)ls -l:查看文件权限;

        (3)chmod:改变程序执行权限;

        (4)直接键入文件名执行文件;

    二、bash程序设计

    bash是一个优秀的shell./总是安装在Linux系统上,而且他是开源的可以被移植到几乎所有的类UNIX系统上。

    bash程序 包括shell类型说明、注释、函数定义和程序主过程。通常脚本第一行是Shell类型说明,它告诉系统以下是什么类型的Shell程序,用哪个Shell来运行。例如#!/bin/bash表示用bash来运行程序,也可以写成#!/bin/sh。

     

    1、变量的声明和使用

    bash中有如下四种变量:用户自定义变量、位置变量、环境变量和预定义变量。

    (1)用户自定义变量

    bash的变量属于弱类型的变量,弱类型变量的特点是声明变量不用声明类型和可以存储不同类型的值,使用起来非常灵活。用户自定的变量是bash脚本程序里用户自己声明的变量,大小写区分。变量的声明的格式及赋值如下:

      变量=值(注意:等号两边不能有空格。)

      例如:a=“Red Hat Enterprise Linux"

         bc=5

    对用户自定义变量进行调用需要在变量前加$,而且有时候需要用{}括起来,同其他字符分开。

      例如:echo $a

           echo RHEL5 is ${a}${bc}

     变量的使用过程通常配合引号的应用,引号分为双引号、单引号和倒引号:

      双引号:如果把一个带$字符的变量放在双引号中,程序执行到该行时会把变量替换为它的值。另外,如果在参数中包含一个或多个空白字符,必须给参数加双引号。

      单引号:如果把一个带$字符的变量放在单引号中,不会发生替换现象。这相当于用字符取消$的特殊含义。

      倒引号:用于命令替换。在倒引号内部的Shell命令首先被执行,其输出结果代替用倒引号括起来的文本。

    bash脚本:

     

    运行结果:

     

    (2)位置变量

    位置变量也称为参数变量,bash在解释用户命令时,会把所输入的命令后面的参数使用位置变量传递给bash脚本程序,$1、$2...$n分别代表参数一,参数二、参数n,而$0则代表脚本的名字,例如:mv old.txt new.txt。这里的mv命令带有两个参数,这两个参数通过位置变量保存起来,$1的值等于old.txt,$2的值等于new.txt,在mv程序中,可以使用$1和$2获取两个参数的值。有关位置变量还有另外三个:

      $*:这个变量包括参数的列表,将所有参数看作一个整体。

      $@:这个变量包括参数的列表,将每个参数区别对待。

      $#:这个变量包括参数的个数。

    (3)环境变量

    Shell运行时系统自动设置的一些变量称为环境变量,这些变量命名通常大写字母或数字组成,以便与用户自定义变量区分开来。这些环境变量有Shell维护和管理,比较重要的环境变量说明如下:

      环境变量      说明

      $HOME      用户的主目录

      $IFS           内部的域分隔符,一般为空格符、制表符或换行符

      $PATH      寻找命令或可执行文件的搜索路径列表,路径以冒号分隔

      $PS1       主命令提示符,默认为$

      $PS2       从命令提示符,默认为“>"

      $TERM     使用的终端类型

    另外,Shell脚本程序运行过程中会有一些特殊的变量,其变量名和变量值只有Shell脚本程序本身环境中可以使用,这些变量说明如下:

      环境变量      说明

      $$         Shell脚本的进程号

      $?            紧邻的前驱命令的返回值

      $*          参数列表,各个参数之间用环境变量IFS中的第一个字符分隔开

      $@          参数列表,他是$*的一种变体,他不使用IFS的环境变量,所以当IFS为空时,参数的值不会结合在一起

      $0           Shell脚本名称

      $n                位置参数1,2,...n

    2、算术运算

    高级语言中变量是具有类型的,即变量将被限制为某一数据类型,如整数或字符类型。Shell变量是弱类型变量,通常按字符进行存储,为了对Shell变量进行算术运算,必须使用expr命令和let命令。

    expr命令把一个算术表达式作为参数,通常形式如下:

      expr  arg

      其中arg通常为“[操作数][运算符][操作数]"格式的表达式,这里的运算符和操作数之间要有空格隔开,用户必须保证参加算数运算符的操作数必须为数值。有效的算数操作符主要有:+、-、*、/、%。例如:

     

    运行结果:

     

    特别介绍下expr1 | expr2,如果expr1非零,则等于expr1,否则等于expr2

     

     运行结果:

     

     除了expr命令外,还可以使用let命令实现运算,let命令格式为:

    let arg1[arg2...]

    let命令是bash内置的整数运算命令,相比expr命令,书写更接近人的习惯。例如: 

     

    使用expr命令和let命令完成表达式计算,效率比较慢,因为他们需要一条新的Shell来处理命令,如果使用$((...))扩展,把准备求值的表达式括在$((...))中能够有效的完成简单的算数运算。

     

    3、条件判断

    bash程序的条件判断与C语言等常规编程语言在用法和判断结果的定义上有一些区别,条件判断结果为0表示真,为1表示假,正好与C语言相反。

    条件判断的格式有两种(1)test condition   (2) [ condition ](利用中括号[]进行判断时,左右中括号和判断条件之间要用空格隔开)

     

    1表示假

     

    -n表示如果字符串不为空则结果为真,0表示真。

    Shell编程中具体条件判断命令见以下链接:https://blog.csdn.net/zhouguangcai8/article/details/79643012

    4、控制结构

    程序控制结构主要有顺序、分支和循环三种,bash支持的分支结构有if分支和case分支,支持的循环结构有for循环、while循环、和until循环。他们使用方法与其他编程语言类似,细节上有区别。

    (1)if分支语句

     

    当条件为真时,执行then后面的语句,负责执行else后面的语句。elif是else-if的缩写,它表示是if语句的继续,常用于代替嵌套if,每个if语句结构要以fi作为if结构的结束。

    上述例子使用了一个if分支结构,程序有三个分支,程序开始提示用户输入Linux或Windows,输入的内容保存在变量answer中,然后通过条件判断answer变量的值,如果值等于Linux则执行第六行语句,否则进入第七行判断。第七行判断中then关键字与条件判断同一行,需要在右中括号末尾添加分号作为分隔符,否则程序会报错。如果第七行条件不成立,则执行第10、11行的语句,第12行为整个if结构的结束。

    程序的第11行和第13行采用了exit[n]语句,该语句的功能是将n的值返回给调用的进程,exit命令允许我们用受限方式在两个脚本间进行通信。exit语句也使用户方便的知道脚本的运行情况

    运行结果:

     

    (2)case分支语句

     

    上面程序使用case改写,使用变量answer作为条件,条件的匹配有三个模式,第一种模式匹配Linux和linux两个字符串,第二种匹配模式采用通配符来匹配,表示以大小写w开头的任意字符串,第三种匹配是*,如果前两种模式匹配不成功,其他输入都会匹配*模式。通常会把最精确的匹配放在最开始,把最一般化的匹配放在最后,case的模式匹配可以更灵活,下面列举一些常用的匹配规则:(1)?:仅与一个任意字符匹配。(2)*:匹配任意字符。(3)[...]:同方括号中任意一个字符相匹配。这些字符可以用字符范围(比如1-9)或者离散值或者同时使用两者表示。例如:[a-zBE5-7]同所有a到z之间的字符和B、E、5、6、7相匹配。(4)[!...]:与所有不在方括号中的某个字符匹配。(5){c2,c2}:同c1或者c2相匹配。其中c1和c2也是通配符。

     运行结果:

     

    (3)for语句

    for语句循环遍历列表中的各个值,对每个值执行一次语句块。如果中括号中的部分省略掉,bash则认为是"in$@“,即执行该程序时通过命令行传给程序的所有参数的列表。

     

    上述程序变量n遍历了1到9个数,循环9次得到结果。

     

     4、wile循环和until语句

    while循环中,只要条件为真,就执行do和done之间的循环命令。until循环中,只要条件不为真,就执行do和done之间的循环命令,或者说,在until循环中,一直执行do和done之间的循环命令,知道条件为真。

    while循环:

     运行结果:

    until循环:

    运行结果:

     以上两个程序的输出结果是完全一样的,只是循环条件的判断有差别。与循环相关的命令还有break、continu、和shift。其中break和continue的意义与其他编程语言的基本相同,break表示跳出循环,continue则表示跳出本次循环,进入下一轮循环。shift命令是用于调整位置变量的,每执行一次shift,就使位置变量左移一个位置,如$3的值赋给$2,$2的值赋给$1,原来$1的值左移出去后就不在位置变量列表中,同时,$#,$*,$@的值随着

    变量左移做相应的变动。

    shift命令实例:

    执行结果:

     从上可知,shift每执行一次,变量的个数减1,位置变量左移一位。

  • 相关阅读:
    Excelファイルを扱う方法
    BINARYSEARCH有り無しのパフォーマンスの違い
    権限チェック
    ラジオボタンで選択項目を動的に変更
    ALVのイベントを取得する方法
    LOOP AT SCREEN
    MOVE-PERCENTAGE(文字列の部分の代入)
    Java快捷键与搜狗输入法快键的冲突
    Android之RadioButton多行
    Android之socket服务端
  • 原文地址:https://www.cnblogs.com/RanWhoo/p/9999587.html
Copyright © 2011-2022 走看看