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
一叶笑天 阅读(348)
评论(0) 编辑 收藏 所属分类:
Shell技术