shell 编程了解

来源:互联网 发布:显示器推荐2017知乎 编辑:程序博客网 时间:2024/04/30 06:52

 

1.程序必须以下面的行开始(必须方在文件的第一行):

    #!/bin/sh

符号#!用来告诉系统它后面的参数是用来执行该文件的程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。

    chmod +x filename

2.注释

    在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。不要忽略注释的重要性。

3.变量

    shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。

       变量名= ega="helloworld"   #"="左右没有空格,语句后面不加分号

    取出变量值可以加一个美元符号($)在变量前面:

       echo "a = ${a}!"

4.特殊参数

 

    shell对几个参数进行特别处理。这些参数可能只能被引用;对它们赋值是不允许的。

       $#:传入脚本命令行参数个数

       $*:所有命令行参数的值,在各个参数之间留有空格

       $@:所有命令行参数的值

       $0:shell文件名

       $1:第一个命令行参数

       $?:表示上一条命令的退出状态

    - - - - - - - - - -filename specVar.sh- - -- - - - - - -

       #!/bin/sh

       echo "/$# means $#"

       echo "/$* means $*"

       echo "/$@ means $@"

       echo "/$0 means $0"

       echo "/$1 means $1"

    - - - - - - - - - -out- - - - - - - - --./specVar.sh 1 2 3- - - - - - - - - -

       $# means 3

       $* means 1 2 3

       $@ means 1 2 3

       $0 means ./specVar.sh

       $1 means 1

5.局部变量

    #!/bin/sh

    hello="var1"

    echo ${hello}

    function func{

       local hello="var2"

       echo ${hello}

    }

    func

    echo ${hello}

    - - - - - - - - - 

    在虚拟机(RedHat企业版5)上运行提示错误syntaxerror near unexpected token `local'

在网上搜索出来:

long long ago..... 老式的电传打字机使用两个字符来另起新行。一个字符把滑动架移回首位 (称为回车,<CR>ASCII码为0D),另一个字符把纸上移一行 (称为换行, <LF>ASCII码为0A)。当计算机问世以后,存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行尾。UNIX 开发者决定他们可以用 一个字符来表示行尾,Linux沿袭Unix,也是<LF>Apple开发者规定了用<CR>。开发 MS-DOS以及Windows 的那些家伙则决定沿用老式的<CR><LF>   
  
因为MS-DOSWindows是回车+换行来表示换行,因此在Linux下用Vim查看在Windows下用VC写的代码,行尾后的“^M”符号,表示的是符。 

long long ago..... 老式的电传打字机使用两个字符来另起新行。一个字符把滑动架移回首位 (称为回车,<CR>ASCII码为0D),另一个字符把纸上移一行 (称为换行, <LF>ASCII码为0A)。当计算机问世以后,存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行尾。UNIX 开发者决定他们可以用 一个字符来表示行尾,Linux沿袭Unix,也是<LF>Apple开发者规定了用<CR>。开发 MS-DOS以及Windows 的那些家伙则决定沿用老式的<CR><LF>

因为MS-DOSWindows是回车+换行来表示换行,因此在Linux下用Vim查看在Windows下用VC写的代码,行尾后的“^M”符号,表示的是符。

 

解决办法:

1)vi -b back.sh

2)%s/^M//g

///////注意:上述命令行中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”“Ctrl+M”

 

用上面的方法没有发下^M,在敲一遍,还是错误...不解???????????????????????

======

后来将

    function func{

修改为

    function func

    {

   

    functionfunc <space>{

OK,通过。汗~~~格式要求太严格了

 

6.常用语句

    (1)if语句格式:

       if [ expression ]   #"["两边有空格

       then

           #code block

       else if [ expression ]   #elif [ expression ]

           then

              #code block

           else

              #code block

           fi

       fi

    - - - - - - - - - -

       if

           command/function     #command 执行成功返回0/函数返回0,执行then中的语句(C语言不同)

       then

    - - - - - - - - - -

    常用的比较操作符

    比较操作      整数操作      字符串操作

      相同       -eq               =

      不同       -ne              !=

      大于       -gt               >

      小于       -lt               <

    大于等于        -ge

    小于等于        -le

      为空        -z

    不为空       -n

    - - - - - - - - - -

    例:比较整数ab是否相等      if [ $a = $b ]   或者 if [ $a -eq $b ]       #"=""-eq"左右有空格

    判断字符串a是否为空        if[ -z $a ]

    - - - - - - - - - -

    特殊判断

       -e  文件已经存在

       -f    文件是普通文件(相对于链接文件及目录文件而言)

       -s  文件大小不为零

       -d  文件是一个目录

       -r  文件对当前用户可读

       -w  文件对当前用户可写

       -x  文件对当前用户可执行

    - - - - - - - - - -

    例:

       #!/bin/sh

       folder=/home

       [ -r $folder ] && echo"$folder can be read"         #&&前面的条件为真的时候执行后面的语句

       [ -f $folder ] || echo "$folder isnot a normal file"       #||前面的条件为假的时候执行后面的语句

    (2)For 循环结构

       for var in [list]

       do

           #code block

       done

    - - - - - - - - - -

       例:i)#!/bin/sh -x              #采用./filename.sh方式运行可以查看运行次数

       for day in sun mon tue

       do

           echo $day

       done

       ii)#!/bin/sh -x

       for day in "sun mon tue"

       do

           echo $day

       done

    (3)while/until循环结构

       while [expression]

       do

           #code block

       done

 

       until [expression]

       do

           #code block

       done

       whileuntil的区别在于whileexpression为真的时候执行,until为假的时候执行。

    (4)case语句

       case "$var" in

           condition1 )

              #code

              ;;     #break

           conditon2 )

               #code

              ;;

           * )

              #default code

              ;;

           esac

       - - - - - - - - - - 

           例:#!/bin/sh

           echo "hit a key,then hitreturn"

           read Keypress

           case "$Keypress" in

              [A-Z] ) echo "Uppercaseletter";;

              [a-z] ) echo "Lowercaseletter";;

              [0-9] ) echo "Digit";;

              * ) echo "Other key";;

           esac

=======================================================

另:

 

 

 

 

原创粉丝点击