一叶笑天
雄关漫道真如铁, 而今迈步从头越。 从头越, 苍山如海, 残阳如血。
posts - 73,comments - 7,trackbacks - 0
Bourne shell语法和结构:

Shbang

"shbang" 是脚本起始行,告诉kernel那个shell解析. #!位于行头。#!/bin/sh

注释

行注释用#符号.例如:

# this text is not

# interpreted by the shell

通配符

*,?, 和 [ ]用于文件名扩展.例如<, >, 2>, >>, 和 | 用于IO和重定向.为了保证这些符号不被解析,这个字符要被引起来。 例如:文件名扩展:rm *; ls ??; cat file[1-3];引用保护:echo "How are you?"

输出显示

输出屏幕:echo "What is your name?"

局部变量

局部变量作用于当前shell,shell结束时局部变量失效.例如variable_name=value 

name="John Doe"  

x=5

全局变量

全局变量也称为环境变量. 例如:

VARIABLE_NAME=value

export VARIABLE_NAME

PATH=/bin:/usr/bin:.

export PATH

从变量中提取值

使用$.例如:

echo $variable_name

echo $name

echo $PATH

读取用户输入

使用read。例如:

echo "What is your name?"

read name

read name1 name2 ...

参数 (位置参数)

可以从命令行传入参数。位置参数用于从脚本中接收值。例如:

$ scriptname arg1 arg2 arg3 ...

脚本中:

echo $1 $2 $3

位置参数

echo $*

所有的位置参数

echo $#

位置参数号

数组 (位置参数)

Bourne shell不支持数组, 但是词列表可以用位置参数取得. 使用内建set命令来建造列表。用shift移除左边第一个词。位置索引从1开始.例如:

set word1 word2 word3

echo $1 $2 $3

显示 word1, word2, and word3

set apples peaches plums

shift

移走apples

echo $1

显示列表第一个值

echo $2

显示列表第二个值

echo $*

显示所有值

命名替代

为了制定命令的输出或者在字符串中使用命令,使用反引号`.例如:variable_name=`command`

echo $variable_name

now=`date`

echo $now

echo "Today is `date`"

算术

Bourne shell不支持算式.要使用命令来完成计算.例如:

n=`expr 5 + 5`

echo $n

操作符

Bourne shell使用内建test命令操作符来测试数字和字符串.例如:

相等:

=

字符串

!=

字符串

-eq

数值

-ne

数值

逻辑:

-a

And

-o

Or

!

Not

关系的:

-gt

大于

-ge

大于等于

-lt

小于

-le

小于等于

条件语句

If结构. 也可以包含在[]中. then用在结尾. If必须用fi结束.例如:

The if construct is:

The if/else construct is:

if command

then

   block of statements

fi

if [ expression ]

then

   block of statements

fi

The if/else/else if construct is:

if command

then

   block of statements

elif command

then

   block of statements

elif command

then

   block of statements

else

   block of statements

fi

--------------------------

if [ expression ]

then

   block of statements

elif [ expression ]

then

   block of statements

elif [ expression ]

then

   block of statements

else

   block of statements

fi

if [ expression ]

then

   block of statements

else

   block of statements

fi

The case command construct is:

case variable_name in

   pattern1)

      statements

         ;;

   pattern2)

      statements

         ;;

   pattern3)

         ;;

   *) default value

         ;;

esac

case "$color" in

   blue)

      echo $color is blue

      ;;

   green)

      echo $color is green

      ;;

   red|orange)

      echo $color is red or orange

      ;;

   *) echo "Not a color" # default

Esac

循环

3种循环类型: while, until 和 for.

例如:

while command

do

   block of statements

done

while [ expression ]

do

   block of statements

done

until command                                for

 variable in word1 word2 word3 ...

do                                           do

   block of statements                          

 block of statements

done                                         done

until [ expression ]

do

   block of statements

done

文件测试

Bourne shell使用内建的测试命令。例如:

-d

文件是目录

-f

文件存在而且不是目录

–r

当前的用户读文件

–s

文件是非0大小

–w

当前用户可以写文件

–x

当前用户可以执行文件

Example 2.3.

    #!/bin/sh

1   if [ –f file ]

    then

         echo file exists

    fi

2   if [ –d file ]

    then

          echo file is a directory

    fi

3   if [ -s file ]

    then

         echo file is not of zero length

    fi

4   if [ -r file -a -w file ]

    then

          echo file is readable and writable

    fi

函数

用一个给定的名字定义代码. Bourne shell引入了函数的概念. C 和 TC不容许有函数.例如:

function_name() {

   block of code

}

-----------------------

lister() {

   echo Your present working directory is `pwd`

   echo Your files are:

   ls

}

Bourne shell 例子:
1   #!/bin/sh
2   # The Party Program––Invitations to friends from the "guest" file
3   guestfile=/home/jody/ellie/shell/guests
4   if [ ! –f "$guestfile" ]
5   then
6        echo "`basename $guestfile` non–existent"
7        exit 1
8   fi
9   PLACE="Sarotini's"; export PLACE
10 Time=`date +%H`
    Time=`expr $Time + 1`
11 set cheese crackers shrimp drinks "hot dogs" sandwiches
12 for person in `cat $guestfile`
    do
13       if [ $person =~ root ]
         then
14             continue
15       else
16       #     mail –v –s "Party" $person <<- FINIS
17             cat <<-FINIS
               Hi ${person}! Please join me at $PLACE for a party!
               Meet me at $Time o'clock.
               I'll bring the ice cream. Would you please bring $1 and
               anything else you would like to eat? Let me know if you
               can make it. Hope to see you soon.
                   Your pal,
                   ellie@`hostname`
               FINIS
18             shift
19             if [ $# –eq 0 ]
               then
20                set cheese crackers shrimp drinks "hot dogs" sandwiches
               fi
         fi
21   done
     echo "Bye..."

解释:

1.    让kernel知道是在运行Bourne shell。

2.    注释。

3.    变量guestfile被设置为文件的全路径名,叫做guests.

4.    行读入。

5.    then关键字.

6.    UNIX basename命名删除所有不再搜索路径里的文件.

7.    如果文件不存在,程序退出。

8.    fi关键字表示if结束

9.    变量指定值place和time. PLACE是环境变量

10.Time变量值做了命名替换

11.foods列表指定特定的变量。

12.for循环。

13.如果变量person匹配user root,loop控制将会到达for循环的头,处理下一个person。

14.continue语句是loop控制从12行开始,而不是16行。

15.else语句。

16. 

17.next语句,使用cat命令。

18.,循环,移动到下一个人。

19.$#值是位置参数号.如果号码为0,则food列表为空。

20.重置food列表。

21.done关键字表明for循环结束。

posted on 2008-06-25 18:29 一叶笑天 阅读(347) 评论(0)  编辑  收藏 所属分类: Shell技术

只有注册用户登录后才能发表评论。


网站导航: