shell程序设计(2)

来源:互联网 发布:ios 新闻app源码 编辑:程序博客网 时间:2024/05/16 18:55

shell程序设计(2)

Shell的语法

变量

在shell里,使用变量之前通常并不需要实现为他们做出声明。默认情况下,所以变量都被看做字符串来存储,即使它们被赋值为数值也是如此。shell和一些工具程序会在需要时把数值型字符串转换为对应的数值以对它们进行操作。Linux大小写敏感。

在shell中,我们可以通过在变量名前加一个$符号来访问它的内容。无论何时想获取变量的内容,我们都需要在它前面加上一个$字符。当为变量赋值时,我们只需要使用变量名。

如果字符串里包含空格,就必须用引号把他们括起来。还要注意在等号两边不能有空格。

我们可以通过使用read命令将用户的输入赋值给一个变量。这个命令需要一个参数,即准备读入用户的数据的变量名,然后它会等待用户输入数据。通常情况下,用户按下回车键时,read命令结束。

1.      使用引号

如果在一个参数中包含一个或多个空白符(例如,空格,制表符或者换行符),就必须给参上加上引号。像$myvar这样的变量在引号中的行为取决于你所使用的引号类型。如果你把一个带有$字符的变量放在双引号中,程序执行到这一行就会把变量替换为它的值;如果你把它放在单引号中,就不会发生替换现象。还可以通过在$字符前机上一个\字符取消它的特殊含义。

字符串通常放在双引号中,以防止他们被空白符分开。

#! /bin/bash

myvar="Hi there"

echo $myvar

echo "$myvar"

echo '$myvar'

echo \$myvar

 

echo Enter some text

read myvar

echo '$myvar' now equals $myvar

exit 0

输出结果如下:

Hi there

Hi there

$myvar

$myvar

Enter some text

HelloWorld

$myvar now equals Hello World

2.      环境变量

当一个shell脚本程序开始运行时,一些变量会根据环境设置中的值进行初始化。这些变量通常用大写字母做名字,以便区分用户在脚本程序里定义的变量,后者按惯例用小写字母做名字。

#HOME                       当前用户的主目录

#PATH                         以冒号分隔的用来搜索命令的目录列表

#PS1                                      命令提示符,通常是$字符,但在bash中,你可以使用一些更复杂的值。#PS2                             二级提示符,用来提示后续的输入,通常是>字符

#IFS                              输入域分隔符

$0                                 SHELL脚本的名字

$#                                 传递给脚本的参数个数

$$                                 shell脚本的进程号

3.      参数变量

$1,$2…                    脚本程序的参数

$*                                          在一个列表中列出所有的参数,各个参数之间用环境变量IFS的第一个字符分隔开

$@                                        它是$*的一种精巧的变换,不使用IFS,使用当IFS为空时,参数的值也不会结合在一起。

可以通过下面这个例子看出$*和$@的区别

chen123@ubuntu:~/C++$ IFS=''

chen123@ubuntu:~/C++$ set foo bar bam

chen123@ubuntu:~/C++$ echo "$@"

foo bar bam

chen123@ubuntu:~/C++$ echo "$*"

foobarbam

chen123@ubuntu:~/C++$ unset IFS

chen123@ubuntu:~/C++$ echo "$*"

foo bar bam

chen123@ubuntu:~/C++$

 

实验:参数和环境变量

脚本程序:

#! /bin/sh

salutation="Hello"

echo $salutation

echo "The program $0 is nowrunning"

echo "The second parameter was$2"

echo "The first parameter was $1"

echo "The parameter list was $*"

echo "The user's home directory is$HOME"

 

echo "Please enter a newgreeting"

read salutation

 

echo $salutation

echo "The script is now complete"

exit 0

输出结果:

Hello

The program ./hird is now running

The second parameter was

The first parameter was

The parameter list was

The user's home directory is /home/chen123

Please enter a new greeting

SIre

SIre

The script is now complete

条件

test或[命令

为增强可读性,当使用[时,我们还是用符号]来结尾。

我们以一个最简单的条件为例来介绍test命令的用法:检查一个文件是否存在。用于实现这一操作的命令是test –f <filename>,所以在脚本程序里我们写出如下的代码:

if test –f fred.c

then

fi

或用[可以写成如下:

if [ -f fred.c ]

the

fi

注意必修在[符号和被检查的条件之间留出空格。

test命令可以使用的条件类型可以归为三类:字符串比较、算术比较和与文件有关的条件测试。

举例如下:

#! /bin/sh

if [ -f /bin/bash ]

then

       echo "file /bin/bash exits"

fi

 

if [ -d /bin/bash ]

then

       echo "/bin/bash is a directory"

else

       echo "/bin/bash is NOT a directory"

fi

输出:

file /bin/bash exits

/bin/bash is NOT a directory

控制结构

if语句:

if condition

then

         statements

else

         statements

fi

elif语句

if condition

then

         statements

elif condition

         statements

else

         statements

fi

for语句

for variable in values

do

         statements

done

 

实验:使用固定字符串的for循环

for variable in values

do

         statements

done

输出:

bar

fud

43

 

实验:使用通配符扩展的for循环

#! /bin/sh

for file in $(ls f*.sh);

do

         lpr$file

done

exit 0

这个例子演示了$(command)用法。for命令的参数表来自括在$()中的命令的输出结果。

while语句

while condition do

statements

done

until语句

until condition

do

         statement

done

case语句

case variable in

         pattern[ | pattern]…) statements;;

         pattern[ | pattern]…) statements;;

esac

命令列表

AND列表

statement  && statement2  && statements  && …

OR列表

statement || statement || statement || …

语句块

如果你想在某些只允许使用单个语句的地方使用多条语句,可以把它们括在括号{}中构造一个语句块。


0 0
原创粉丝点击