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选项:

 

 

 

posted @ 2013-09-09 09:36  gxcherie  阅读(8469)  评论(0编辑  收藏  举报