存档
-
bash shell下的后台作业
bash shell允许在一个会话期间同时运行多个命令,正常情况下所有命令在前台运行。只有在一个命令运行完后才能输入一个命令。但如果我们在运行命令时在命令后加一个”&”符号,则该命令将转入后台运行,我们马上获得shell终端控制权,可输入另外一条命令。这种在后台运行的命令叫后台作业。后台作业主要用在一些需花很长时间来运行的命令上,如解压一个大的压缩文档。$ tar zxvf xen.tar.gz& [1] 2547 使用jobs命令可以查看后台作业状态。
2008年8月3日 | 归档于 shell编程 -
Bash的通配符
linux下bash的通配符介绍在bash shell环境下,我们可用通配符来简化命令输入。 ?,匹配任意单个字符。 *,匹配任意字符串。 [set],匹配set中的任意字符。[!set]是取反操作,匹配不在set中的任意字符,如: [a-z] 匹配所有小写字符[0-9] 匹配所有数字[akz] 匹配a,k,z三个字符[.,;] 匹配句点,逗号和分号[!abc] 匹配除a,b,c之外的所有字符下面是几个命令示例: hao32@localhost:~$ ls *.py #显示当前目录下所有以.py结尾的文件hao32@localhost:~$ ls *.[cho] #显示当前目录下所有以c,h,o结尾的文件hao32@localhost:~$ ls ??? #显示所有文件名为三个字符的文件大括号”{}”可用于扩展任意字符串,如: localhost:~/python# echo a{a,b,c}aaaa aba aca我们也可用大括号做为通配符使用,如: hao32@localhost:~$ ls *.{c,h,o} #效果同ls *.[cho]
2008年8月3日 | 归档于 shell编程 -
bash用户环境配置
使Bash更好地为我们服务,我们需定制bash shell环境,这里讲述bash用户环境配置 bash_profile、.bashrc、和.bash_logout上面这三个文件是bash shell的用户环境配置文件,位于用户的主目录下。其中.bash_profile是最重要的一个配置文件,它在用户每次登录系统时被读取,里面的所有命令都会被bash执行。.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。在Debian中使用.profile文件代替.bash_profile文件。 .bashrc文件会在bash shell调用另一个bash shell时读取,也就是在shell中再键入bash命令启动一个新shell时就会去读该文件。这样可有效分离登录和子shell所需的环境。但一般来说都会在.bash_profile里调用.bashrc脚本以便统一配置用户环境。 .bash_logout在退出shell时被读取。所以我们可把一些清理工作的命令放到这文件中。 在/etc目录的bash.bashrc和profile是系统级(全局)的配置文件,当在用户主目录下找不到.bash_profile和.bashrc\时,就会读取这两个文件。.bash_history是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISSIZE环境变量设置在历史记录文件里保存记录的条数。alias l = ‘ls -l’是设置别名的语句,把它放在这些配置文档中就可使我们能用简单的’l’命令,代替’ls -l’命令。 当我们修改了这些配置件后,可用source .bash_profile命令使它修改内容马上生效。 选项bash shell中的选项可控制shell的行为和功能,我们可以通过shopt命令来设置。使用set命令也可以,但它已被shopt替代,但为了向下兼容,set命令还是可以使用的。使用不带参数的shopt命令可以列出当前shell中只能由shopt设置的选项,用shopt -o可列出可由set命令设置的选项。 下面是一些可由set命令基本的选项,默认是关闭的。 emacs 进入emacs编辑模式vi 进入vi编辑模式ignoreeof 不允许单独使用Ctrl_D退出的用法,要使用exit。与IGNOREEOF=10等价noclobber 不允许重定向覆盖已存在文件noglob 不允许扩展文件名通配符nounset 使用未定义的变量时给出错误下面是一些只能由shopt命令设置的选项。 cdspell 自动改正cd命令参数中的小错误hostcomplete 以@开头时,按tab键可进行主机名的自动完成dotgblob 以点开始的文件名被包含在路径名扩展中mailwarn 显示邮件警告信息shopt命令的选项如下: -p 显示可设置选项及当前取值-s 设置每一选项为on-u 设置每一选项为off-q 不输出信息-o
2008年7月28日 | 归档于 shell编程 -
bash常用变量
比较常用需要记忆的bash变量, 变量是随系统运行而变化的,灵活使这些变量可简化我们的操作和更好地控制bash shell的行为。 $# 脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个$$ 脚本运行的当前进程ID号$! 后台运行的最后一个进程的进程ID号$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数$- 显示shell使用的当前选项,与set命令功能相同$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。$0 脚本名称$1..$9 第N个参数
2008年7月28日 | 归档于 shell编程 -
Bash的用户交互接口
Bash的用户接口也就是我们经常说的字符界面,这是我们与系统交互的主要环境,我们可通过这个接口管理我们的系统。在系统引导时,第一个需要运行的进程是init,由init再衍生出一个getty终端进程,该进程打开一个终端窗口,提供标准输入、标准输出和标准错误。然后执行程序/bin/login,login程序提示输入密码,加密并验证密码。通过验证后系统进入登录shell,也就是bash。不同的登录shell可在passwd文件设置。bash会通过几个配置文件来初始化用户环境。首先bash会查找/etc/profile,并执行其中的命令,初始化系统级别环境。然后在用户目录下查找.bash_profile文件,并执行里d面的命令,初始化用户级别的环境。用户级别的设置可覆盖系统级别设置。最后会执行.bashrc用户环境设置文件,这时,默认提示符美元符号将显示在屏幕上。 环境变量进入bash后,系统可根据你的配置生成一系列的环境变量,这些环境变量可用export命令显示。下面是一些常的环境变量: $LOGNAME,当前登录的用户名。 $HOME,当前用户的主目录。 $PATH,当前用户的命令搜索路径。 $LANG,当前系统的语言环境。 $TZ,时区 $MAILCHECK,检查新邮件的间隔,单位是秒。 $PS1,命令行提示符。 $PS2,二级命令行提示符,也就是当你的命令行很长,在一行写不下,转到第二行时出现的提示符。 $PWD,当前目录。 目录操作Linux以树状结构组织文件和目录,目录可以包含文件,也可以包含其它目录。目录的最高层是根目录”/”,其它所有文件和目录都是挂在根目录下,形成一个倒挂的目录树。 使用bash shell的cd命令可在目录树中移动,当前停留的位置叫工作目录或当前目录,可用”.”表示。每个用户在/home目录下都有一个与用户名相同的目录,叫用户主目录。可用”~”符号表示,”..”表示上一级目录。 jims@localhost:~$ #位于jims用户的主目录jims@localhost:~$ cd . jims@localhost:~$ #没变化jims@localhost:~$ cd ..jims@localhost:/home$ #移动到上层目录jims@localhost:/home$ cd ~jims@localhost:~$ #回到用户主目录jims@localhost:~$ pwd #显示当前目录/home/jims 通配符在bash shell环境下,我们可用通配符来简化命令输入。 ?,匹配任意单个字符。 *,匹配任意字符串。 [set],匹配set中的任意字符。[!set]是取反操作,匹配不在set中的任意字符,如: [a-z] 匹配所有小写字符[0-9] 匹配所有数字[akz] 匹配a,k,z三个字符[.,;] 匹配句点,逗号和分号[!abc] 匹配除a,b,c之外的所有字符 下面是几个命令示例: jims@localhost:~$ ls *.py #显示当前目录下所有以.py结尾的文件jims@localhost:~$ ls *.[cho] #显示当前目录下所有以c,h,o结尾的文件jims@localhost:~$ ls ??? #显示所有文件名为三个字符的文件 大括号”{}”可用于扩展任意字符串,如: localhost:~/python# echo a{a,b,c}aaaa aba [...]
2008年7月28日 | 归档于 shell编程 -
Bash简介
Shell是UNIX系统的用户接口,它接受用户的指令,并将它翻译成操作系统可以理解的命令,最后将结果返回给用户。简单说就是用户和内核打交道的界面。在UNIX发展的历史中,出现了几种shell,第一个主要的shell是Bourne shell(以其发明者Steven Bourne命名),它始于1979年,包含在unix第一个流行版本版本7中,在系统中称为“sh”。另一个shellC shell,在系统称为csh,它由Berkeley的California大学的Bill Joy编写,它首次发布于1981年的UNIX Berkeley Software Distribute(BSD)中。C shell的名称来源于其语句命令与C语言的相似。还有一个使用较多的shell是Korn shell,它是一个商业产品,类似于bash。以下重点介绍一下bash。其它的shell大家可查阅相关资料。 Bash是GNU系统的标准shell,正式发布于1988年11月10日,Brain Fox编写了bash的最初版本,1989年初,Chet Ramey加入开发,负责大量的故障调试及加入许多有用的特性。现在bash由Chet Ramey负责维护。我们可免费从FSF(Free Software Foundation)得到0.99以上的版本。现在最新的版本是2.05b,它提供了作业控制、命令行编辑模式、自定义函数、高级I/O等先进功能。可以用bash的命令行选项-version或打印环境变量BASH_VERSION的值来获得版本号。 优秀的管理员也是懒惰的管理员,他们喜欢用shell帮助他们自动完成各种管理工作。Linux系统很多服务都是通过shell脚本来启动,通过查看这些脚本,你可以了解服务的启动过程,从而为故障论断和系统优化做好准备。
2008年7月28日 | 归档于 shell编程 -
shell调试技术
编写任何程序和脚本的, 以及开发出一台优秀的程序和脚本都需要程序员不断的调试, 才能实现, shell调试技术是必要的! 本文全面系统地介绍了shell脚本调试技术,包括使用echo, tee, trap等命令输出关键信息,跟踪变量的值,在脚本中植入调试钩子,使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,巧妙地利用shell的内置变量增强“-x”选项的输出信息等。 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟练掌握shell编程也是成为一名优秀的unix/linux开发者和系统管理员的必经之路。脚本调试的主要工作就是发现引发脚本错误的原因以及在脚本源代码中定位发生错误的行,常用的手段包括分析输出的错误信息,通过在脚本中加入调试语句,输出调试信息来辅助诊断错误,利用调试工具等。但与其它高级语言相比,shell解释器缺乏相应的调试机制和调试工具的支持,其输出的错误信息又往往很不明确,初学者在调试脚本时,除了知道用echo语句输出一些信息外,别无它法,而仅仅依赖于大量的加入echo语句来诊断错误,确实令人不胜其繁,故常见初学者抱怨shell脚本太难调试了。本文将系统地介绍一些重要的shell脚本调试技术,希望能对shell的初学者有所裨益。 本文的目标读者是unix/linux环境下的开发人员,测试人员和系统管理员,要求读者具有基本的shell编程知识。本文所使用范例在Bash3.1 +Redhat Enterprise Server 4.0下测试通过,但所述调试技巧应也同样适用于其它shell。 二. 在shell脚本中输出调试信息 通过在程序中加入调试语句把一些关键地方或出错的地方的相关信息显示出来是最常见的调试手段。Shell程序员通常使用echo(ksh程序员常使用 print)语句输出信息,但仅仅依赖echo语句的输出跟踪信息很麻烦,调试阶段在脚本中加入的大量的echo语句在产品交付时还得再费力一一删除。针对这个问题,本节主要介绍一些如何方便有效的输出调试信息的方法。 1. 使用trap命令 trap命令用于捕获指定的信号并执行预定义的命令。 其基本的语法是: trap ‘command’ signal 其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。可以用kill –l命令看到系统中全部可用的信号名,捕获信号后所执行的命令可以是任何一条或多条合法的shell语句,也可以是一个函数名。 shell脚本在执行时,会产生三个所谓的“伪信号”,(之所以称之为“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的),通过使用trap命令捕获这三个“伪信号”并输出相关信息对调试非常有帮助。 表 1. shell伪信号 信号名 何时产生 EXIT 从一个函数中退出或整个脚本执行完毕 ERR 当一条命令返回非零状态时(代表命令执行不成功) DEBUG 脚本中每一条命令执行之前 通过捕获EXIT信号,我们可以在shell脚本中止执行或从函数中退出时,输出某些想要跟踪的变量的值,并由此来判断脚本的执行状态以及出错原因,其使用方法是: trap ‘command’ EXIT 或 trap ‘command’ 0 通过捕获ERR信号,我们可以方便的追踪执行不成功的命令或函数,并输出相关的调试信息,以下是一个捕获ERR信号的示例程序,其中的$LINENO是一个shell的内置变量,代表shell脚本的当前行号。 $ cat -n exp1.sh 1 ERRTRAP() 2 [...]
2008年7月17日 | 归档于 shell编程 -
shell 环境变量讲解
shell 环境变量详细讲解shell 环境变量是所有shell 程序都会接受的参数。shell程序运行时,都会接收一组变量,这组变量就是环境变量。常用的环境变量: 名称 描述 PATH 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是, 当前目录不在系统路径里 HOME 用户home目录的路径名,是cd命令的默认参数 COLUMNS 定义了命令编辑模式下可使用命令行的长度 EDITOR 默认的行编辑器 VISUAL 默认的可视编辑器 FCEDIT 命令fc使用的编辑器 HISTFILE 命令历史文件 HISTSIZE 命令历史文件中最多可包含的命令条数 HISTFILESIZE 命令历史文件中包含的最大行数 IFS 定义SHELL使用的分隔符 LOGNAME 用户登录名 MAIL 指向一个需要SHELL监视其修改时间的文件.当该文件修改后, SHELL将发消息You hava mail给用户 MAILCHECK SHELL检查MAIL文件的周期,单位是秒 MAILPATH 功能与MAIL类似.但可以用一组文件,以冒号分隔,每个文件后可跟一个问号和一条发向用户的消息 SHELL SHELL的路径名 TERM 终端类型 TMOUT SHELL自动退出的时间,单位为秒,若设为0则禁止SHELL自动退出 PROMPT_COMMAND 指定在主命令提示符前应执行的命令 PS1 主命令提示符 PS2 二级命令提示符,命令执行过程中要求输入数据时用 PS3 select的命令提示符 PS4 调试命令提示符 MANPATH 寻找手册页的路径,以冒号分隔 [...]
2008年7月13日 | 归档于 shell编程 -
shell 中的数组
shell 中的数组的使用基础shell变量中还能设置数组,但是不同的shell版本有不同数组赋值方法,而bourne shell 中不支持数组方式。因此,如果不是十分需要,还是建议你不要使用数组。若你的数据结构十分复杂,必须要使用数组,那么我建议你还是选择别的语言吧,shell不是万能的。 shell有两种赋值方式,第一种是直接用下标赋值: name[0]=”Tom”name[1]=”Tomy”name[2]=”John”…另一种方式对于不同的shell版本不一样。bash中赋值: #!/usr/local/bin/bashname=(“Tom” “Tomy” “John”)for i in 0 1 2doecho $i:${name[$i]} ;done;上面两种赋值方式达到的效果一样。另外,你看见访问数组元素的方法了吗?使用${name[index]}的方式。注意第一行使用的是#!/usr/local/bin/bash, 和以前有些不一样哦。其输出结果是: -bash-2.05b$ ./test.sh 0:Tom1:Tomy2:John
2008年7月13日 | 归档于 shell编程 -
Bash While 循环实例
Bash While Loop Example – Bash While 循环实例 Q. How do I use bash while loop to repeat certain task under Linux / UNIX operating system? A. Bash while loop is a control flow statement that allows code or commands to be executed repeatedly based on a given condition. For example, run echo command [...]
2008年7月13日 | 归档于 shell编程