Previous Next Contents

4    BASH 中的其他高级问题

4.1    BASH 中对返回值的处理

无论是在 Shell 中对 BASH 脚本返回值的处理,还是在脚本中对函数返回值的处理,都是通过 "$?" 系统变量来获得。BASH 要求返回值必须为一个整数,不能用 return 语句返回字符串变量。


4.2    用 BASH 设计简单用户界面

BASH 中提供了一个小的语句格式,可以让程序快速的设计出一个字符界面的用户交互选择的菜单,该功能就是由 select 语句来实现的,select 语句的语法为:

select var in [list]
do
 statments use $var
done

上面的语法结构在执行后,BASH 会将 [list] 中的所有项加上数字列在屏幕上等待用户选择,在用户作出选择后,变量 $var 中就包含了那个被选中的字符串,然后就可以对该变量进行需要的操作了。我们可以从下面的例子中更直观的来理解这个功能:

#!/bin/bash

OPTIONS="Hello Quit"
select opt in $OPTIONS; do
 if [ "$opt" = "Quit" ]; then
  echo done
  exit
 elif [ "$opt" = "Hello" ]; then
   echo Hello World
  else
   clear
   echo bad option
 fi
done

exit 0

大家可以试着执行上面的程序,看看是什么执行结果。

 

4.3    在 BASH 中读取用户输入

BASH 中通过 read 函数来实现读取用户输入的功能,如下面这段程序:

#!/bin/bash

echo Please enter your name
read NAME
echo "Hi! $NAME !"

exit 0

上面这个脚本读取用户的输入,并回显在屏幕上。

另外 BASH 中还提供另外一种称为 here documents 的结构,可以将用户需要通过键盘输入的字符串改为从程序体中直接读入,如密码。下面的小程序演示了这个功能:

#!/bin/bash

passwd="aka@tsinghua"
ftp -n localhost <<FTPFTP
user anonymous $passwd
binary
bye
FTPFTP

exit 0

这个程序在用户需要通过键盘敲入一些字符时,通过程序内部的动作来模拟键盘输入。请注意 here documents 的基本结构为:

command <<SOMESPECIALSTRING
statments
...
SOMESPECIALSTRING

这里要求在需要键盘输入的命令后,直接加上 <<符号,然后跟上一个特别的字符串,在该串后按顺序输入本来应该由键盘输入的所有字符,在所有需要输入的字符都结束后,重复一遍前面 <<符号后的“特别的字符串”即表示该输入到此结束。

 

4.4 一些特殊的惯用法

在 BASH 中 () 一对括号一般被用于求取括号中表达式的值或命令的执行结果,如:(a=hello; echo $a) ,其作用相当于 `...` 。

: 有两个含义,一是表示空语句,有点类似于 C 语言中的单个 ";" 。表示该行是一个空命令,如果被用在 while/until 的头结构中,则表示值 0,会使循环一直进行下去,如下例:

while :
do
 operation-1
 operation-2
 ...
 operation-n
done

另外 : 还可以用于求取后面变量的值,比如:

#!/bin/bash

: ${HOSTNAME?} {USER?} {MAIL?}
echo $HOSTNAME
echo $USER
echo $MAIL

exit 0

在 BASH 中 export 命令用于将系统变量输出到外层的 Shell 中了。

 

4.5 BASH 程序的调试

bash -x bash-script 命令,可以查看一个出错的 BASH 脚本到底错在什么地方,可以帮助程序员找出脚本中的错误。

另外用 trap 语句可以在 BASH 脚本出错退出时打印出一些变量的值,以供程序员检查。trap 语句必须作为继 "#!/bin/bash" 后的第一句非注释代码,一般 trap 命令被写作: trap 'message $checkvar1 $checkvar2' EXIT

 

4.6 关于 BASH2

使用 bash -version 命令可以看出当前你正在使用的 BASH 是什么版本,一般版本号为1.14或其他版本。而现在机器上一般还安装了一个版本号为 2.0 的 BASH 。该 BASH 也在 /bin 目录下。BASH2 提供了一些新功能,有兴趣的同叙可以自己去看相关资料,或直接 man bash2 即可。

 

 

 

 

 



Previous Next Contents