• shell script 学习笔记~~~~


    什么是shell script:

        shell script是利用shell的功能所写的一个“程序”(program), 这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令和数据流重定向等功能,以达到我们想要的处理目的。

    shell script编写中的注意事项:

        1、命令的执行是从上到下,从左到右地分析执行

        2、命令与参数间的多个空格都会被忽略

        3、空白行也将被忽略,并且【tab】键所得的空白同样视为空格

        4、如果读取到一个Enter符号(CR),就尝试开始执行改行(或该串)命令

        5、可以使用“[Enter]”来扩展至下一行

        6、#号可作为注释,任何加在#后面的数据将全部被视为批注文件而被忽略(我觉得#!/bin/bash不是)

    编写第一个script:

      #!/bin/bash

      # print "Hello World!"

      PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

      export PATH

      echo -e "Hello World! "

      exit 0

    1、文件开头指定一个或多个解释脚本程序的shell,如#!/bin/bash

    *如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。

    *不指定的话一般默认以/bin/sh执行shell脚本

    2、常见的两种执行方式

                sh +filename

                ./filename 

    变量

    运行shell时,会同时存在三种变量:

    1) 局部变量

        局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

    2) 环境变量

        所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

    3) shell变量

        shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行.

    变量的定义:

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

    variableName="value"

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

    •               首个字符必须为字母(a-z,A-Z)。

    •               中间不能有空格,可以使用下划线(_)。

    •               不能使用标点符号。

    •               不能使用bash里的关键字(可用help命令查看保留关键字)。

    变量定义举例

    mywork="/home/chenht/share/linux"

    myNum=100

    使用变量

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

    name="zhiwei"

    echo $name

    echo ${name}

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。

    重新定义变量

    已定义的变量,可以被重新定义,如:

                    mywork="/home/yinzw/share/linux"

    echo ${mywork}

    这样写是合法的,但注意,第二次赋值的时候不能写 $mywork="/home/yinzw/share/linux" , 使用变量的时候才加美元符($)。

    只读变量

    使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

    下面的例子尝试更改只读变量,结果报错:

    #!/bin/bash

    mywork="/home/yinzw/share/linux"

    readonly mywork

    mywork="/home/yinzw/share"

    运行脚本,结果如下:

    /bin/sh: NAME: This variable is read only.

    删除变量

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

    unset variableName

    变量被删除后不能再次使用;unset 命令不能删除只读变量。

    举个例子:

    #!/bin/sh

    mywork="/home/yinzw/share"

    unset mywork

    echo $mywork

    上面的脚本没有任何输出。

    shell 特殊变量:

    前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

    特殊变量列表

    变量        含义

    $0           当前脚本的文件名

    $n           传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

    $#           传递给脚本或函数的参数个数。

    $*            传递给脚本或函数的所有参数。

    $@          传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

    $?           上个命令的退出状态,或函数的返回值。

    $$           当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

     命令行参数

         运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

    #!/bin/bash

    echo "File Name: $0"

    echo "First Parameter : $1"

    echo "First Parameter : $2"

    echo "Quoted Values: $@"

    echo "Quoted Values: $*"

    echo "Total Number of Parameters : $#"

    $* 和 $@ 的区别

        $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

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

    退出状态

        $? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

        退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

    Shell替换:

    Shell运算符

    Shell注释

    Shell字符串

    Shell数组

    Shell echo命令

        echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串。命令格式:

    显示转义字符

    echo ""It is a test""

    结果将是:"It is a test"

    双引号也可以省略。

    显示变量

    name="OK"

    echo "$name It is a test"

    结果将是:OK It is a test

    同样双引号也可以省略。

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

    mouth=6

    echo "${mouth}-1-2009"结果将是:

    6-1-2009

    显示换行

    echo  "OK "

    echo "It is a test"

    输出:    OK

    It is a test

    显示不换行

    echo "OKc"

    echo "It is a test"

    输出:OK It is a test

    显示结果重定向至文件

    echo "It is a test" > myfile原样输出字符串

    若需要原样输出字符串(不进行转义),请使用单引号。例如:

    echo '$name"'显示命令执行结果

    echo `date`结果将显示当前日期

    Shell if else语句

    if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:

    • if ... fi 语句;
    • if ... else ... fi 语句;

    •      if ... elif ... else ... fi 语句。

    1) if ... else 语句

    if ... else 语句的语法:

    if [ expression ]

    then

       Statement(s) to be executed if expression is true

    fi

    如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。

    最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。

    注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。

    举个例子:

    #!/bin/sh

    a=10

    b=20

    if [ $a == $b ]; then

    echo "a is equal to b"

    fi

    if [ $a != $b ];  then

    echo "a is not equal to b"

    fi

    运行结果: a is not equal to b

    2) if ... else ... fi 语句

    if ... else ... fi 语句的语法:

    if [ expression ]

    then

       Statement(s) to be executed if expression is true

    else

       Statement(s) to be executed if expression is not true

    fi如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。

    3) if ... elif ... fi 语句

    if ... elif ... fi 语句可以对多个条件进行判断,语法为:

    Shell case esac语句

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

    case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

    case 值 in

    模式1)

        command1

        command2

        command3

        ;;

    模式2)

        command1

        command2

        command3

        ;;

    *)

        command1

        command2

        command3

        ;;

    esac

    case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。

    取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

    下面的脚本提示输入1到4,与每一种模式进行匹配:

    echo 'Input a number between 1 to 4'

    echo 'Your number is:c'

    read aNum

    case $aNum in

                                    1)  echo 'You select 1'

                                     ;;

                                     2)  echo 'You select 2'

                                     ;;

                                    3)  echo 'You select 3'

                                    ;;

                                    4)  echo 'You select 4'

                                     ;;

                                    *)  echo 'You do not select a number between 1 to 4'

                                    ;;

    Shell for循环

    与其他编程语言类似,Shell支持for循环。(注意for后面变量名没有$)

    for循环一般格式为:

    for 变量 in 列表

    do

        command1

        command2

        ...

        commandN

    done

    列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。

    in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

    例如,顺序输出当前列表中的数字:

    for loop in 1 2 3 4 5

    do

        echo "The value is: $loop"

    done

    运行结果:

    The value is: 1

    The value is: 2

    The value is: 3

    The value is: 4

    The value is: 5

    顺序输出字符串中的字符:

    for str in 'This is a string'

    do

        echo $str

    done运行结果:

    This is a string

    显示主目录下以 .bash 开头的文件:

    #!/bin/bash

    for FILE in $HOME/.bash*

    do

       echo $FILE

    done运行结果:

    /root/.bash_history

    /root/.bash_logout

    /root/.bash_profile

    /root/.bashrc

    Shell while循环

    while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

    while command

    do

       Statement(s) to be executed if command is true

    done

    命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。

    以下是一个基本的while循环,测试条件是:如果COUNTER小于5,那么返回 true。COUNTER从0开始,每次循环处理时,COUNTER加1。运行上述脚本,返回数字1到5,然后终止。

    COUNTER=0

    while [ $COUNTER -lt 5 ]

    do

        COUNTER='expr $COUNTER+1'

        echo $COUNTER

    done

    运行脚本,输出:

    1

    2

    3

    4

    5

    while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

    echo 'type <CTRL-D> to terminate'

    while read FILM

    do

        echo "Yeah! great film the $FILM"

    done

    运行脚本,输出类似下面:

    type <CTRL-D> to terminate

    enter your most liked film: Sound of Music

    Yeah! great film the Sound of Music

    Shell until循环

    until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。

    until 循环格式为:

    until command

    do

       Statement(s) to be executed until command is true

    done

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

    Shell跳出循环

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环。

    break命令

    break命令允许跳出所有循环(终止执行后面的所有循环)。

    在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。例如:

    break n表示跳出第 n 层循环。

    continue命令

    continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

    Shell函数

    函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。

    Shell 函数的定义格式如下:

    function_name () {

        list of commands

        [ return value ]

    }

    如果你愿意,也可以在函数名前加上关键字 function:

    function function_name () {

        list of commands

        [ return value ]

    }

    函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。

    Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:“numeric argument required”。

    如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。

    先来看一个例子:

    另外,还有几个特殊变量用来处理参数,前面已经提到:

    特殊变量 说明

    $# 传递给函数的参数个数。

    $* 显示所有传递给函数的参数。

    $@ 与$*相同,但是略有区别,请查看Shell特殊变量。

    $? 函数的返回值。

    Shell输入输出重定向

    Shell文件包含

  • 相关阅读:
    Qt 数据库篇
    js字符串函数(转)
    如何解决IE无法识别html5中的新标签(article、abbr、header等)
    web多页打印问题
    诡异的Spinner级联样式
    discuz x2用户删除了,帖子不能用了,恢复帖子的办法
    创业公司如何招聘优秀工程师
    清除目录下的SVN信息
    .NET 项目SVN 全局排除设置
    编程技术面试的五大要点
  • 原文地址:https://www.cnblogs.com/wisdomyzw/p/5546284.html
Copyright © 2020-2023  润新知