1.5 一些特殊shell变量- #和*
# 命令行参数的数量
* 完全的参数字符串
例子:
$ cat color4 echo There are $# comand line argument echo They are $* ehco The first command line argument is $1 $ chmod +x color4 $ color4 red green yellow blue They are 4 command line arguments They are red green yellow blue The first command line argument is red $
|
至今为止我们看到的shell程序都不是很灵活。color3需要两个正确的参数,而my_install只需要一个。通常在你创建一个接收命令行参数的shell程序的时候,你想要用户输入一个参数的变量号码。你同时要程序执行成功,不管用户键入1个参数或是20个参数。
当处理变量参数列表的时候,特殊shell变量会提供你许多的灵活性。通过$#你可以知道有多少参数已经被输入,通过$*可以存取全部的参数列表,而不管参数的数量。请注意参数($0)不在$*这个参数列表里。
每一个命令行参数都是互相独立的,你可以通过$*集中检索这些参数,也可以通过$1,$2,$3等等来独立的检索这些参数。一个可以接收多个命令行参数的安装程序的例子:
$ cat > my_install2 echo $0 will install $# files to your bin directory echo The files to be installed are : $* chmod +x $* mv $* $HOME/bin echo Installaton is complete ctril + d $ chmod +x my_install2 $ my_install2 color1 color2 my_intall2 will install 2 files to your bin directory The files to be installed are: color1,color2 Intallaiton is complete
|
这个安装程序更加灵活。如果你有几个脚本要安装,你仅仅需要执行这个程序一次,只要输入多个名字即可。非常重要的是:如果你计划传递整个参数的字符串给一个命令,这个命令必须能够接收多个参数。
在以下的脚本中,用户提供一个目录名作为一个命令行参数。程序会更改到指定的目录,显示当前的位置,并且列出内容。
$ cat list_dir cd $* echo You are in the $(pwd) directory echo The contents of the directory are: ls –F $ list_dir dir1 dir2 dir3 h: cd: bad argument count
|
由于cd命令不能同时进入到多个目录中,这个程序会发生错误。
1.6 shift 命令
向左移动所有的在*中的字符串n个位置
#的数目减少n个(n的默认值是1)
语法:shift [n]
例子:
$ cat color5 orig_args=$* echo There are $# command line arguments echo They are $* echo Shifting two arguments hift 2 echo There are $# comand line arguments echo They are $* echo Shifting two arguments hift 2; final_args=$* echo Original arguments are: $orig_args echo Final arguments are: $final_args
|
hift命令会重新分配命令行参数对应位置参数,在shift n以后,所有的*中的参数会向左移动n个位置。同时#会减n。默认的n为1。Shift命令不会影响到参数0的位置。
一旦你完成一次移动,被移动出命令行的参数会丢失。如果你想在你的程序中引用这个参数,你需要在执行shift之前存贮这个参数。
Shift命令被用在:存取一组参数的位置,例如一系列的x,y的坐标从命令行删除命令选项,假定选项在参数之前。例子:
$ color5 red green yellow orange black There are 6 command line arguments They are red green yellow blue orange black Shifting two arguments There are 4 command line arguments They are yellow blue orange black Shiftging two arguments Original arguments are: red green yellow blue orange black Final argument are : orange black $
|
1.7 read 命令
语法:
read variable [variable......]
|
例子:
$ cat color6 echo This program prompts for user input echo “please enter your favorite two colors -> \c” read color_a color_b echo The colors you entered are: $color_b $color_a $ chmod +x color6 $ color6 This program prompts for user input Please enter your favorite two colors -> red blue The colors you entered are: blue red $ color6 This program prompts for user input Please enter you favorite two colors -> red blue tan The color you enterd are :blue tan red
|
用户使用命令行参数传递信息进程序,在命令执行之前,用户必须知道正确的语法。有一种情况,你想要在用户执行程序的时候提示他输入这些参数。read命令就是用来在程序执行的时候收集终端键入的信息。
你通常会想要使用echo命令来提供用户一个提示,让他知道程序正在等待一些输入,同时通知用户应该输入的类型。因此,每一个read命令应该在echo命令前面。
read命令会给出一个变量名的列表,这些变量会被用户在提示符下输入的词赋值。(以空格分隔)。如果read命令定义的变量比输入的词要多,剩余变量会被赋空值。如果用户输入的词要比变量多,剩余的数据会赋给列表中的最后一个变量。
一旦被赋值,你就可以象其他的shell变量一样存取这些变量。
注意:不要混淆位置参数和变量read。位置参数在命令被激活时在命令行中定义,read命令给变量赋值是在程序执行之中,通过对输入提示的响应而给变量赋值。
以下例子提示用户输入要被安装的文件名:
$ cat > my_install3 echo $0 will install files into your bin directory echo “Enter the names of the files -> \c” read filenames mv $filenames $HOME/bin echo Instllation is complete ctrl + d $ chmod +x my_install13 $ my_install13 my_install13 will install files into your bin directory Enter the names of the files -> f1 f2 Installaton is complete
|
这个安装会提示用户输入chmod和移动到$HOME/bin的文件名。这个程序给用户更多的关于应该输入数据情况的指引。而不像install2中用户必须在命令行中提供文件名。用户使用程序不需要特殊的语法。程序让用户确切地知道要输入什么。所有的输入的文件名都会被赋值给变量filenames。
1.8 另外的技术
#号开始的文档为注释部分。
h shell_program argumetns
hell_program 的属性可以不是可执行的。
hell_program 必须是可读的。
h –x shell_program arguments
每一行在被执行前被打印出来在调试程序时有用处。
在shell程序中,#符号被用来提供一段注释。shell会忽略#符号后边的字符,直到一个回车符号为止。 执行一个shell程序的另外一种方法是:sh shell_program arguments
这种方式激活一个子shell并且指定这个子shell为执行这个程序的命令解释器。这个程序文件不是必须为可执行的。这种方式的用途在:你正在在一种shell下工作,同时想要执行用其他shell命令语言写的shell程序十分有用。
你也可以在你的shell程序的第一行前加入#!/usr/bin/ shell_name来指定命令行解释器。因此,如果你当前正在POSIX shell下工作,但是想要执行一个C shell的脚本,你的C shell程序的第一行应该为:
虽然shell程序没有调试器,命令:
h –x shell_program arguments
|
会在执行每一行时,先在屏幕上打印出shell程序的每一行。这允许你看到shell如何进行文件名产生,变量替代,和命令替代。这个选项对发现打字错误十分有帮助。
|