zoukankan      html  css  js  c++  java
  • shell语法基础

    一、变量

    1、linux大小写敏感,变量取名要注意大小写。可以通过变量名前面加$来访问变量的内容。可以通过使用read命令来将用户输入的值赋给一个变量。

    2、给变量赋值时,如果字符串中包含空格,就必须用引号把他们引起了,还要注意在等号两边不能有空格。

    3、变量在双引号中会用变量值替换,而在单引号中就不会替换,也可以通过转义字符来取消$的特殊含义。

    例:myvar=“Hi there!”

        echo $myvar

        echo "$myvar"

        echo ' $myvar'

        echo $myvar

    将会输出如下:Hi there!

                  Hi there!

                  $myvar

                  $myvar

    4、环境变量:环境变量通常用大写字母做名字,为了与环境变量区别开来,用户自定义变量一般都用小写字母。

           常用的环境变量有:

             

           

    二、控制结构

    1、shell的布尔判断命令[或test。test的三种条件类型:字符串比较、算术比较和文件有关的条件测试。

     

     

     

     

     

    2、控制结构

    Ø if语句:

          if  condition

          then

               statements

          else

                Statements

           Fi

    例:#!/bin/sh

        if [ -f /root/cherie_test/test_path.sh ];then

           echo "/root/cherie_test/test_path.sh exists"

        fi

     

        if [ -d /root/cherie_test/test_path.sh ];then

           echo "/root/cherie_test/test_path.sh is a director"

       else

          echo "/root/cherie_test/test_path.sh  is not a directory"

       fi   

    解析:[ ]前后都要有空格,不然会报[: missing `]'错误;if与[之间也需要有空格,没有的话会报syntax error near unexpected token `then'错误。

     

    Ø  elif语句。对if语句的进一步测试。

         例:#!/bin/sh

     

             echo "Is it morning? Please answer yes or no "

             read timeofday

     

             if[ $timeofday = "yes"]; then

                echo "Good morning"

                exit 0

             elif [ $timeofday = "no" ];then

                echo "Good afternoon"

                exit 0

             else

                echo "Sorry,$timeofday not recognized. Enter yes or no "

                exit 1 //异常退出

            fi

    解析:elif会对在第一个if条件不满足的情况下进行进一步测试,如果两次测试的结果都不成功,就打印出一条错误信息并以1为退出码退出。

     

    Ø  for 语句。语法格式:for variable invalues

                             do

                                 Statements

                              done

    例:#!/bin/sh

        for file in $(ls f*.sh); do

            lpr $file

    done

    exit0

    解析:打印当前目录中所有以字母f开头的脚本文件。for的参数来着$()中的命令的输出结果,shell扩展f*.sh给出所有匹配此模式的文件的名字。此例中可能会报错lpr: error - scheduler not responding!这是vim配置问题。

     

    Ø while 语句。语法格式: while condition do

                                     Statements

                               Done

    例:#!/bin/sh

       foo=1

       whlie [ "$foo" -le 20 ]

       do 

          echo "Here we go again"

          foo=$(($foo+1))

       done

       exit 0

    解析:测试foo的值,如果它小于20就执行循环体,-le表示小于。

    算表达式的使用: count=1

                     count=$[${count} + 1] 变量加1

     

    Ø until语句。语法格式:until condition

                             do

                               Statements

                             Done

      它与while循环很相似,只是把条件测试反过来,循环将执行直达条件为真为止,而不是条件为真时反复执行。

     

    Ø case 语句。语法格式case variable in

                           pattern statements;;

                           pattern statements;;

                           ...

                           esac 

     注意,每个模式行都以双分号结尾。

    例:#!/bin/sh

        echo "Is it morning?Please answer yes or no"

        read timeofday

        case "$timeofday" in

             yes|y|Yes|YES) 

                      echo "Good morning"

                      echo  "Up bright and early this morning"

                       ;;

          n*|N*) echo "Good afternoon";;

          *)   echo "Sorry ,answer not recognized";;

        esac

     

    exit 0

    解析:case语句被执行时,会把timeofday的内容与各个字符串依次进行比较。一旦某个字符串输入匹配成功,case命令就会执行紧随右括号后面的代码。case命令会对用来做比较的字符串就行正常的通配符扩展,因此可以指定字符串的一部分在其后加上*通配符,如n*;只使用一个单独的*表示匹配任何可能的字符串。

     

    三、函数

    1、函数的定义。我们只需简单的写出它的名字,然后是一对空括号,再把有关的语句放在一对花括号中,如:function_name () {

                                      Statements

                                     }

    例:#!/bin./sh

    foo () {

           echo "Function foo is executing"

      }

    echo"script starting"

    foo

    echo "script ended"

    exit 0

     

    运行结果如下: script starting 

                   Function foo is executing

                   script ended

     

    解析:当遇到foo()结构时,它知道定义了一个名为foo的函数。当执行到foo行时,shell就知道应该去执行刚才定义的函数。

    注:在调用一个函数之前必须先对它进行定义。

     

    四、命令

    Ø break 命令。终止循环

    Ø :命令。冒号(:)命令是一个空命令。它偶尔会被用于简化条件逻辑,相当于true的一个别名。由于它是内置命令,所以它运行的比true快,但它的输出可读性较差。 

    Ø continue命令。使for、while或until循环跳到下一次循环继续执行。continue可以带一个可选的参数以表示希望继续执行的循环嵌套层数,也就是说你可以部分的跳出嵌套循环。

    Ø .命令。点(.)命令用来执行当前shell中的命令。

    Ø  echo命令。使用echo命令来输出结尾带有换行符的字符串。 常用 echo -n来去掉换行符。

    Ø eval命令。eval命令允许你对参数进行求值,有点像一个额外的$。

    Ø exec命令。将当前shell替换为一个不同的程序,脚本程序中exec命令后面的代码都不会执行。

    Ø exit n命令。exit命令使脚本程序以退出码n结束运行。,退出码0表示成功,退出码1~125是脚本程序使用的错误代码。

    Ø export命令。export命令将作为它参数的变量导出到子shell中,并使之在子shell中有效。在默认情况下,在一个shell中被创建的变量在这个shell调用的下级(子)shell中是不可用的。export命令把自己的参数创建为一个环境变量,而这个环境变量可以被其他脚本和当前程序调用的程序看见。

    例:脚本export 2                      

           

       脚本export1

     

    第一个空行的出现是因为变量foo在export2中不可用,所以$foo被赋值为空,echo一个空变量将输出一个空行。Bar用export声明后在export1中仍然有效。

    Ø expr命令。expr命令将它的参数当作一个表达式来求值。

    Ø printf命令。语法:printf “format string” paremeter1 paremeter2

    它支持的转义序列:

     

    Ø return命令。return命令的作用是使函数返回。

    Ø set命令。set命令的作用是为shell设置参数变量。还可以通过set命令和它的参数来控制shell的执行方式。其中最常用的命令格式是set -x,它让一个脚本程序跟踪显示它当前执行的命令。

    Ø shift命令。shift命令把所有参数变量左移一个位置,使$2变成$1,$3变成$2,依此类推。

    Ø trap命令。用于指定在接收到信号后将要采取的行动。trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名,trap command signal。

    Ø unset命令。unset命令的作用是从环境中删除变量或函数。

    Ø find 命令。查找文件的功能。语法格式:find [path] [option] [tests] [actions] 

    一些常用的选项:

     

     

    测试部分,可以提供给find命令的测试非常多,每种测试返回的结果有两种可能:true或false。find命令开始工作时,它按照顺序将定义的每种测试依次应用到它搜索到的每个文件上。

     

     

    我们还可以用操作符来组合测试。大多数操作符有两种格式:短格式和长格式,

     

    常见的动作:

     

     

    Ø grep命令。使用grep命令在文件中搜索字符串。grep语法格式:grep[option] pattern [FILES] 如果没有文件名,则搜索标准输入。

    grep命令的一些主要选项:

     

     

    五、正则表达式

    特殊字符:

     

    如果你想将上述字符用作普通字符,就需要在它们前面加上字符。所以,如果你想使用$字符,只需要简单的将它写为$。 

    在方括号中还可以使用一些有用的特殊匹配模式,

     

     

    匹配字符:

     

     

    跟踪脚本程序中复杂错误的主要方法是设置各种shell选项。为了完成这一任务,你可以在调用shell时加上命令行选项,各种shell选项:

     

     

     

  • 相关阅读:
    go语言xrom使用
    go语言算法
    go语言递归
    go语言map(字典)
    GO语言实现小技巧
    偶遇递归树
    Python中字典对象根据字典某一个key和values去重
    python中将字符串格式转字典
    Azure媒体服务的Apple FairPlay流功能正式上线
    SVG裁剪和平移的顺序
  • 原文地址:https://www.cnblogs.com/Cherie/p/3309194.html
Copyright © 2011-2022 走看看