首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

shell编程入门

2012-08-25 
shell编程入门 .shell脚本程序不是复杂的程序,它是按行解释的。脚本程序总是以#!/bin/sh?开始,它通知shell

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表示没有错误,其他任何值表明有错误

热点排行