全部博文(37)
分类: LINUX
2011-12-22 12:53:27
1.1. 退出状态
任何命令运行时都将返回一个退出状态。如要观察其退出状态,使用最后状态命令:
$ echo $? |
要退出当前进程,shell提供命令exit,一般格式为:
exit n 其中,n为一数字。 |
如果只在命令提示符下键入exit,假定没有在当前状态创建另一个shell,将退出当前shell。
如果在脚本中键入exit,shell将试图返回上一个命令返回值。
有许多退出脚本值,但其中相对于脚本和一般系统命令最重要的有两种,即:
退出状态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 脚本是否为交互模式(终端模式)还是非交互模式(cron或at): [ -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. 使用break和continue控制循环
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." |