分类: LINUX
2008-11-18 16:16:14
一些较老的unix使用#!的时候不允许超过32个字符。
确定一个脚本是不是shell的办法:
# file start_ssh
start_ssh: Bourne-Again shell script text executable
最好用printf来格式化输出,一些系统也支持echo –e,不过前者的移植性更好。Echo –n可以去掉换行符号。
Expr比较耗资源,一般使用$(()),比如 foo=$(($foo+1))
冒号可以表示空命令;
Break可以指定要跳出的层数。Continue也是如此。
.可以表示执行当前shell中的命令。Source和点都是表示再当前shell执行。通常,当一个脚本执行一条外部命令或脚本程序时,会创建一个新的环境(一个子shell),命令将在这个新环境中执行,在命令执行完毕后,这个环境被丢弃,只留下退出码返回给父shell。而外部的source命令和点命令(这两个命令差不多是同义词)在执行某个脚本程序中列出的命令时,使用的是调用该脚本程序的同一个shell。
在shell脚本程序中,点命令的作用有点类似于C和C++语言里的# include指令。尽管它并没有从字面意义上包含脚本,但它的确是在当前上下文中执行命令,所以你可以使用它将变量和函数定义结合进一个脚本程序。
X/Open大力宣扬在现代的shell中使用printf命令,我们还是依照常规使用echo命令来输出结尾带有换行符的字符串。echo -e确保启用了反斜线转义字符的解释。Bash中echo –n可以去掉回车符号。
eval命令有点像一个额外的$,它给出一个变量的值的值。eval命令十分有用,它允许代码被随时生成和运行。虽然它的确增加了脚本调试的复杂度,但它可以让你完成使用其他方法难以或者根本无法完成的事情。
Shell对eval的解释:The args are read and concatenated together into a single command. This command is then read and executed by the shell, and its exit status is returned as the value of eval. If there are no args, or only null arguments, eval returns 0.从这种意义上讲,可以理解它为一个增加的子shell。
比如有:
# cat data
PC 486
MONITOR svga
NETWORK yes
# cat test
#!/bin/bash
while read NAME TYPE
do
eval ` echo "$NAME=$TYPE" `
done < data
echo " You have a $PC pc, with a $MONITOR monitor"
echo "and are you have network ? $NETWORK"
执行结果:
# ./test
You have a 486 pc, with a svga monitor
and are you have network ? yes
eval ` echo "$NAME=$TYPE" `有待细细理解,关键在于把显示的内容执行。
exec命令有两种不同的用法。它的典型用法是将当前shell替换为一个不同的程序.比如:exec wall " Thanks!" 脚本中的这个命令会用wall命令替换当前的shell。脚本程序中exec命令后面的代码都不会执行,因为执行这个脚本的shell已经不存在了。exec的第二种用法是修改当前文件描述符:exec 3 < file. 这使得文件描述符3被打开以便从文件afile中读取数据。这种用法非常少见。
反引号(``)字符使x取值为命令expr $x + 1的执行结果。我们也可以用语法$()替换反引号``。
set命令的作用是为shell设置参数变量。
shift命令把所有参数变量左移一个位置.
trap命令用于指定在接收到信号后将要采取的行动.
信 号 说 明
HUP(1) 挂起,通常因终端掉线或用户退出而引发
INT(2) 中断,通常因按下Ctrl+C组合键而引发
QUIT(3) 退出,通常因按下Ctrl+\组合键而引发
ABRT(6) 中止,通常因某些严重的执行错误而引发
ALRM(14) 报警,通常用来处理超时
TERM(15) 终止,通常在系统关机时发送
unset命令的作用是从环境中删除变量或函数。这个命令不能删除shell本身定义的只读变量(如IFS)。
$(command)语法来实现也可以用一种比较老的语法形式`command`.所有的新脚本程序都应该使用$(...)形式,引入这一形式的目的是为了避免在使用反引号执行命令时,处理$、`、\等字符所需要应用的相当复杂的规则。
在shell脚本程序中向一条命令传递输入的一种特殊方法是使用here文档。它允许一条命令在执行时就好像是在读取一个文件或键盘一样,而实际上是从脚本程序中得到输入数据。
here文档以两个连续的小于号<<开始,紧跟着一个特殊的字符序列,该序列将在文档的结尾处再次出现。<<是shell的标签重定向符,此时,它表示命令的输入是一个here文档。这个特殊的字符序列的作用就像一个标记,它告诉shell here文档结束的位置。因为这个标记序列不能出现在传递给命令的文档内容中,所以应该尽量使它既容易记忆又足够不寻常。
比如实例:
# vi here1
#!/bin/sh
cat <
hello
this is a here
document
!FUNKY!
# vi here2
#!/bin/sh
ed textfile <
3
d
.,\$s/is/was/
w
q
!FunkyStuff!
exit 0
注意,我们在here文档中用\字符来防止$字符被shell扩展。\字符的作用是对$进行转义,让shell知道不要尝试把$s/is/was/扩展为它的值,而它也确实没有值。shell把\$传递为$,再由ed编辑器对它进行解释。
#!/bin/bash
scp -r ./send*
kingsit
!FunkyStuff!
Dialog工具具有图形化功能。
类 型 用于创建类型的选项 含 义
复选框 --checklist
允许你显示一个选项列表,每个选项都可以被单独的选择
信息框 --infobox
在显示消息后,对话框将立刻返回,但并不清除屏幕
输入框 --inputbox
允许用户输入文本
菜单框 --menu
允许用户选择列表中的一项
消息框 --msgbox
向用户显示一条消息,同时显示一个OK按钮,用户可以通过选择该
按钮继续操作
单选框 --radiolist 允许用户选择列表中的一个选项
文本框 --textbox 允许在带有滚动条的文本框中显示文件的内容
是/否框 --yesno 允许你提问,用户可以选择yes或no
对话框类型 参 数
--checklist text height width list-height [tag text status]...
--infobox text height width
--inputbox text height width [initial string]
--menu text height width menu-height [tag item]...
--msgbox text height width
--radiolist text height width list-height [tag text status]...
--textbox filename height width
--yesno text height width
这部分暂不涉及。CD唱片应用程序也暂略。