Chinaunix首页 | 论坛 | 博客
  • 博客访问: 202575
  • 博文数量: 37
  • 博客积分: 4624
  • 博客等级: 上校
  • 技术积分: 433
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-10 14:06
文章分类

全部博文(37)

文章存档

2012年(6)

2011年(25)

2008年(6)

我的朋友

分类: LINUX

2011-12-22 12:53:27

1.1.        退出状态

任何命令运行时都将返回一个退出状态。如要观察其退出状态,使用最后状态命令:

$ echo $?

 

要退出当前进程,shell提供命令exit,一般格式为:

exit n

其中,n为一数字。

如果只在命令提示符下键入exit,假定没有在当前状态创建另一个shell,将退出当前shell

如果在脚本中键入exitshell将试图返回上一个命令返回值。

有许多退出脚本值,但其中相对于脚本和一般系统命令最重要的有两种,即:

退出状态0 退出成功,无错误。

退出状态1 退出失败,某处有错误。

可以在shell脚本中加入自己的退出状态。

 

1.2.        控制结构

流控制

if then else

case

 

循环

for 每次处理依次列表内信息,直至循环耗尽。

Until 循环直至条件为真。条件部分在循环末尾部分。

While 当条件为真时,循环执行,条件部分在循环头。

 

 

1.3.        if then else语句

if语句测试条件,测试条件返回真(0)或假(1)后,可相应执行一系列语句。

if语句结构对错误检查非常有用。

if 条件1

then 命令1

elif 条件2

then 命令2

else 命令3

fi

 

使用if语句时,必须将then部分放在新行,否则会产生错误。

如果要不分行,必须使用命令分隔符分号:

if 条件; then

命令

fi

 

例如:

#!/bin/sh

#filename:ifelse.sh

 

if [ 10 -gt 5 ]

then

echo "10 > 5"

else

echo "10 < 5"

fi

 

if [ 10 -gt 5 ]; then

echo "10 > 5"

else

echo "10 < 5"

fi

 

If 后面还可以是任意的命令,此时无需[],直接写命令即可。

如果命令执行成功,则执行then,否则执行else

#!/bin/sh

#filename:ifelse.sh

 

if ls ; then

echo "true"

else

echo "false"

fi

 

执行:

$ ./ifelse.sh

5  dst.txt  ifelse.sh  mydir  my.sh  myshln  sort.txt  src.txt

true

 

一些条件判断:

精确匹配:

$ grep "filename\>" ifelse.sh

#filename:ifelse.sh

标准输出和错误输出都重定向到空:

cp aaa bbb > /dev/null 2>&1

脚本是否为交互模式(终端模式)还是非交互模式(cronat):

[ -t ]

判断登录名:

[ $LOGNAME = "wuzhiguo" ]

 

if语句各部分不能为空。

shell提供了:空命令。

#!/bin/sh

#filename:ifelse.sh

 

if ls ; then :

#echo "true"

else :

#echo "false"

fi

 

一个例子:(动手写的时候才知道各种各样的问题)

#!/bin/sh

#filename:example.sh

#a example script

 

PARAM_COUNT=$#

DIR=$1

echo $PARAM_COUNT

echo $DIR

if [ $PARAM_COUNT -eq 1 ] ; then

         echo "check param..."

         if [ -z $DIR -o $DIR = "" ] ; then

                   echo "dir param is null."

                   exit 3;

        

         echo "mkdir..."

         mkdir $DIR

         if [ $? -eq 0 ] ; then

                   echo "cp..."

                   if cp *.sh $DIR ; then

                            echo "successful."

                            exit 0

                   else

                            echo "copy file failed."

                            exit 5

                   fi

                  

         else

                   echo "make dir failed."

                   exit 4

         fi

elif [ $PARAM_COUNT -gt 1 ] ; then

         echo "input too many params."

         exit 1

else

         echo "input none params."

         exit 2

fi

 

1.4.        case语句

case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

格式如下:

case in

模式1)

命令1

;;

模式2)

命令2

;;

esac

取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。

匹配发现取值符合某一模式后,其间所有命令开始执行直至;;

取值将检测匹配的每一个模式,一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。

如果无一匹配模式,使用星号*捕获该值,再接受其他输入。

模式部分可能包括元字符,即:

* 任意字符。

? 任意单字符。

[..] 类或范围中任意字符。

 

 

一个例子:

#!/bin/sh

#filename:case.sh

 

echo -n "please input score:"

read score

base=`expr $score / 10`

echo "base=$base"

 

case $base in

0|1|2|3|4|5)

echo "your score is lower."

;;

[6-9])

echo "your score is ok."

;;

10)

echo "you are great."

;;

*)

echo "you input a error score."

;;

esac

 

 

1.5.        for循环

for循环一般格式为:

for 变量名 in 列表

do

命令1

命令2

done

 

一个例子:

#!/bin/sh

#filename:case.sh

 

for item in 1 2 3 4 5

do

echo $item

done

 

for item in aaa bbb ccc ddd

do

echo $item

done

 

filecount=0

for item in *

do

echo $item

filecount=`expr $filecount + 1`

done

echo "there are $filecount files."

 

filecount=0

for item in `ls`

do

echo $item

filecount=`expr $filecount + 1`

done

echo "there are $filecount files."

 

paramcount=0

for item in $@

do

echo $item

paramcount=`expr $paramcount + 1`

done

echo "there are $paramcount params."

 

 

1.6.        until循环

until循环执行一系列命令直至条件为真时停止。

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次。

这句话是错误的,其实和while循环一样,也是一开始就判断条件,不存在至少执行一次的说法。

不同的是当条件为假执行循环,为真才退出。

until循环格式为:

until 条件

do

命令1

done

 

一个例子:

#!/bin/sh

#filename:until.sh

 

# 这里不能为空,否则在until条件中替换成空会有语法错误

CMD="AAA"

echo "CMD=$CMD"

 

# 要使用括号需要转意

until [ -n $CMD -a \( $CMD = "q" -o $CMD = "Q" \) ]

do

    echo "please input cmd:"

    read CMD

    echo "your input:$CMD"

done

 

echo "bye."

exit 0

 

1.7.        while循环

while 循环用于不断执行一系列命令。

命令通常用作测试条件。

只有当命令的退出状态为0时,命令才被执行,如果退出状态不是0,则循环终止。

while 命令

do

命令1

done

 

一个例子:

#!/bin/sh

#filename:while.sh

 

# 这里不能为空,否则在until条件中替换成空会有语法错误

CMD="AAA"

echo "CMD=$CMD"

 

# 要使用括号需要转意

while [ -z $CMD -o \( $CMD != "q" -a $CMD != "Q" \) ]

do

    echo "please input cmd:"

    read CMD

    echo "your input:$CMD"

done

 

echo "bye."

exit 0

 

拷贝文件:

#!/bin/sh

#filename:while_copyfile.sh

 

exec 3<"file.txt"

exec 4>"file.bak"

 

echo "copy file..."

if [ -s "file.txt" ];then

    while :

    do

        read line<&3

        echo "line=$line"

        if [ $? -ne 0 -o -z $line ];then

            echo "copy completed."

            exit 0

        fi

        echo $line>&4       

    done

fi

 

1.8.        使用breakcontinue控制循环

break命令允许跳出循环。break通常在进行一些处理后退出循环。如果是在一个嵌入循环里,可以指定跳出的循环个数。例如如果在两层循环内,用break 2刚好跳出整个循环。

continue命令类似于break命令,只有一点重要差别,它不会跳出循环,只是跳过这个循环步。

#!/bin/sh

#filename:break_continue.sh

 

for item in 10 20 30 40 50

do

    echo "item:$item"

   

    echo -n "jtem:"

    for jtem in 1 2 3

    do

        if [ $item -eq 20 ] ; then

            continue;

        fi

        if [ $item -eq 40 ] ; then

            break 2

        fi

        echo -n "$jtem "

    done

    echo

done

 

输出:

$ ./break_continue.sh

item:10

jtem:1 2 3

item:20

jtem:

item:30

jtem:1 2 3

item:40

 

1.9.        菜单

创建菜单时,在while循环里null空命令很合适。while加空命令null意即无限循环,这正是一个菜单所具有的特性。

要注意实际屏幕显示,这里使用本地文档,在分界符后面接受输入,直至分界符被再次定位。格式为:

command << WORD

Any input

WORD

此技术用于菜单屏幕,也将用于帮助屏幕。

 

例子:

#!/bin/sh

#filename:menu.sh

 

TITLE="这是一个菜单:"

MESSAGE="请输入选项进入。"

 

while :

do

 

cat << AAAAA

$TITLE

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

1 : AAAAAAAAAA

2 : BBBBBBBBBB

3 : CCCCCCCCCC

4 : DDDDDDDDDD

5 : EEEEEEEEEE

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

$MESSAGE

AAAAA

 

    echo -n "please input:"

    read item

    case $item in

    1)

    echo "You selected:$item"

    ;;

    2)

    echo "You selected:$item"

    ;;

    3)

    echo "You selected:$item"

    ;;

    4)

    echo "You selected:$item"

    ;;

    5)

    echo "You selected:$item"

    ;;

    *)

    echo "You selected error"

    break

    ;;

    esac

done

echo "completed."

阅读(499) | 评论(0) | 转发(0) |
0

上一篇:条件测试

下一篇:shell函数

给主人留下些什么吧!~~