`

shell编程入门 .

 
阅读更多

shell脚本程序不是复杂的程序,它是按行解释的。脚本程序总是以
#!/bin/sh
 开始,它通知shell使用系统上的Bourne shell解释器。其中#符号是注释。
脚本程序是从上到下执行的,运行脚本前需要改变该脚本程序的执行权限。确保正确建立脚本例径,只有

这样,脚本程序才能正确运行。

 下面通过一个脚本程序示例来看shell是如何工作的。
Linux系统中有好多种不同的shell,但通常使用bash(bourne again shell)进行shell编程,因为bash是

免费的并且很容易使用。所以在本文中提供的脚本都是使用bash进行shell编程。和其他程序设计语言一

样,可使用任意一中编辑器来编写shell程序,比如nedit,kedit,Emacs,vi等。
 但编辑好脚本程序后,要使脚本程序可执行,只需要改变脚本程序的权限,命令如下:
[root@barrymore /]chmod +x filename
然后,通过输入:
[root@barrymore /]./filename:
来执行程序。
下面是个简单的例子:
$vim firstscript
#!/bin/sh
echo "You are welcome to use bash."
echo "Current work directory is $PWD."
echo "You are $LOGNAME."
增加执行权限
$chmod +x firstscript
开始运行脚本程序:
$./firstscript
执行结果:
You are welcome to use bash.
Current work directory is /home/yangailin.
you are yangailin

环境变量与shell变量
 为使shell变成更加有效,系统提供了一些shell变量。shell变量可以保存诸如路径名,文件名或者一个

数字这样的变量。从这点上可以得出一个结论:在shell编程中,变量至关重要。
 下面有一些小的脚本程序来说明各种变量的使用。
1.显示变量
 使用echo命令输出单个变量的值
 $ hello="hello,world"
 $ echo ${hello}
 hello,world
 $ ANOTHER=100
 $ echo ${ANOTHER}
 100
2.清除变量
 使用unset命令清除变量
 $ TMP_VAR=foo
 $ echo ${TMP_VAR}
 foo
 $ unset TMP_VAR
 $ echo ${TMP_VAR}
 $
3.显示所有本地shell变量
 使用set命令显示所有本地定义的shell变量
 $ set
 ....
 TERM=vt100
 SHELL=bin/bash
 set输出可能很长。查看输出时可以看出shell已经设置了一些用户变量以使工作环境更加容易使用
4.结合变量值
 将变量结合在一起
 echo ${variable-name1}${variable-name2}
 $ TMP_VAR1="hello,"
 $ TMP_VAR2="World"
 $ echo ${TMP_VAR1}${TMP_VAR2}
 hello,World
5.测试变量是否已经设置
 有时要测试是否已设置或初始化变量。此命令格式为:
 $ {variable:-value}
 如果设置了变量值,则使用它;如果未设置,则取新值。例如
 $ COLOUR=blue
 $ echo 'This colour is ${COLOUR:-green}'
 This colour is blue
 变量colour取值blue,echo打印变量colour时,首先查看该变量是否已经赋值,如果查到,则使用该值。

现在清除该值,再来看看结果
 $ unset COLOUR
 $ echo 'This colour is ${COLOUR:-green}'
 This colour is green
 $ echo ${COLOUR}
 $
 上面的例子并没有实际值传给变量,需要使用下面的命令来完成此功能:
 ${variable:=value}
 例如:
 $ unset COLOUR
 $ echo 'This colour is ${COLOUR:=green}'
 This colour is green
 $ echo ${COLOUR}
 green
 $
6.使用变量来保存系统命令参数
 可以使用变量来保存系统命令参数的替换信息。
 在下面的例子中使用变量保存文件复制件的文件名信息。变量source保存passwd文件的路径,dest保存

cp命令中的文件目标。示例如下:
 $ SRC_FILE='/var/log/messages'
 $ DST_FILE='/var/log/messages_1'
 $ cp ${SRC_FILE} ${DST_FILE}
7.设置只读变量
 如果想设置变量后不再改变其值,可以将该变量设置成只读方式。格式如下:
 variable-name=value
 readonly variable-name
 下面的例子中,把变量设置成一个常量并将它设为只读,任何改变该变量值的操作都将返回错误信息。
 $ MAXVAL=65535
 $ echo ${MAXVAL}
 65535
 $ readonly MAXVAL
 $ MAXVAL=32767
 bash:MAXVAL:readonly variable
 要查看所有只读变量,可使用只读命令:
 $ readonly
 declare -ir euid="0"
 declare -r MAXVAL="65535"
 declare -ir PPID="24109"

8.设置环境变量
 VARIABLE-NAME=value
 export VAROABLE-NAME
9.显示环境变量
 $ MYSHELL='bash'
 $ export MYSHELL
 $ echo ${MYSHELL}
 bash
 $
使用env命令可以查看所有的环境变量
 $ env

10.清除环境变量
 使用unset命令可以清除环境变量
 $ unset MYSHELL
 $ echo ${MYSHELL}
 $
11.set命令
 在$ HOME.profile文件中设置环境变量时,还有另外一种方法导出这些变量。使用set命令-a选项,即

set -a指明所有变量直接被导出。不要在/etc/profile中使用这种方法,最好只在自己的$ HOME.profile

文件中使用。
 $ cat yangailin.profile
 set -a
 MAIL='/var/spool/mail/yangailin'
 PATH=$HOME:$PATH
12.将变量导出到子进程
 shell新用户碰到的问题之一是任何把定义过的变量导出到子进程。其实根据前面讨论过的环境变量的工

作方式,只要使用export命令就可以。可以用脚本程序来实现,并在脚本中调用另一脚本。只要使用

export命令导出变量,就可以在任意的脚本中使用该变量,他们均将继承导出变量的所有权限。当然,不

可以将变量从子进程导出到父进程中,但可以通过重定向做到。
13.向系统命令传递参数
 可以在脚本中向系统命令传递参数,下面的例子是,在find命令里使用$l 参数指定查找的文件名。
 $ cat findfile
 #!/bin/sh
 find / -name $l -depth
 $ ./findfile passwd
 /etc/passwd
 /etc/pam.d/passwd
 /etc/uucp/passwd
 /usr/bin/passwd
14.特定变量参数
 既然已经知道了任何访问和使用shell脚本中的参数,就要必须知道脚本运行时的一些相关控制信息,共

有7个特定变量
 $# 传递到脚本的参数个数
 $* 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,次选项参数可超过九个
 $$ 脚本运行的当前进程ID号
 $! 后台运行的最后一个进程的进程ID号
 $@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
 $- 显示shell使用的当前选项,与set命令功能相同
 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics