- 浏览: 794270 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
一、Shell变量分为本地变量和环境变量。
1、本地变量 -- 在用户现有运行的脚本中使用
1) 定义本地变量 格式: variable-name=value
例子:[root@jike1 /root]# LOCALTEST="test"
[root@jike1 /root]# echo $LOCALTEST test
2) 显示本地变量 格式: set
例子:[root@chinaitlab root]# set
3) 清除本地变量 格式:unset variable-name
例如:[root@jike1 /root]# unset LOCALTEST
此时再执行echo $LOCALTEST将看不到变量LOCALTEST的输出。
2、环境变量 -- 在所有的子进程中使用
1) 定义环境变量 格式: export variable-name=value (与本地变量的定义相比,多了一个export关键字)
例子:[root@chinaitlab /root]# export DOMAIN="chinaitlab.com"
[root@ chinaitlab shell]# vi testenv.sh
#!/bin/bash
echo $DOMAIN
[root@chinaitlab shell]# chmod +x testenv.sh
[root@chinaitlab shell]# ./testenv.sh
chinaitlab.com
2) 显示环境变量 格式: env (本地变量的显示使用set,环境变量的显示使用env)
例子: [root@chinaitlab test]# env
3) 清除环境变量 格式:unset variable-name (用法与本地变量相同,都使用unset)
例子: [root@chinaitlab shell]# unset DOMAIN
此时再执行./testenv.sh将看不到变量DOMAIN的输出。
其实作为命令语言互动式地解释和执行用户输入的命令只是Shell功能的一个方面,Shell还可以用来进行程序设计
,它提供了定义变量和参数的手段以及丰富的程序控制结构。使用Shell编程类似于DOS中的批处理文件,称为Shell script,又叫Shell程序或Shell命令文件。
Shell基本语法
像高级程序设计
语言一样,Shell也提供说明和使用变量的功能。对Shell来讲,所有变量的取值都是一个字串,Shell程序采用$var的形式来引用名为var的变量的值。
Shell有以下几种基本类型的变量。
(1)Shell定义的环境变量:
Shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,用户还可以重新定义这些变量,常用的Shell环境变量有:
HOME 用于保存注册目录的完全路径名。
PATH 用于保存用冒号分隔的目录路径名,Shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
TERM 终端的类型。
UID 当前用户的识别字,取值是由数位构成的字串。
PWD 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
PS1 主提示符,在特权用户下,默认的主提示符是#,在普通用户下,默认的主提示符是$。
PS2 在Shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时Shell判断出用户输入的命令没有结束时,就显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是>。
(2)用户定义的变量:
用户可以按照下面的语法规则定义自己的变量:
变量名=变量值
要注意的一点是,在定义变量时,变量名前不应加符号$,在引用变量的内容时则应在变量名前加$;在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字串都要用双引号括起来。
在编写Shell程序时,为了使变量名和命令名相区别,建议所有的变量名都用大写字母来表示。
有时我们想要在说明一个变量并对它设置为一个特定值后就不在改变它的值时,可以用下面的命令来保证一个变量的只读性:
readonly 变量名
在任何时候,创建的变量都只是当前Shell的局部变量,所以不能被Shell运行的其他命令或Shell程序所利用,而export命令可以将一个局部变量提供给Shell执行的其他命令使用,其格式为:
export 变量名
也可以在给变量赋值的同时使用export命令:
export 变量名=变量值
使用export说明的变量,在Shell以后运行的所有命令或程序中都可以访问到。
(3)位置参数:
位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。位置参数之间用空格分隔,Shell取第一个位置参
数替换程序文件中的$1,第二个替换$2,依次类推。$0是一个特殊的变量,它的内容是当前这个Shell程序的文件名,所以,$0不是一个位置参数,在
显示当前所有的位置参数时是不包括$0的。
(4)预定义变量:
预定义变量和环境变量相类似,也是在Shell一开始时就定义了的变量。所不同的是,用户只能根据Shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符和另一个符号组成的,常用的Shell预定义变量有:
$# 位置参数的数量。
$* 所有位置参数的内容。
$? 命令执行后返回的状态。
$$ 当前进程的进程号。
$! 后台运行的最后一个进程号。
$0 当前执行的进程名。
其中,$?用于检查上一个命令执行是否正确。(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错。)
$$变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。
(5)参数置换的变量:
Shell提供了参数置换功能以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有4种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,它们的语法和功能分别如下。
a. 变量=${参数-word}:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。
b. 变量=${参数=word}:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word,然后再用word替换参数的值。注意,位置参数不能用于这种方式,因为在Shell程序中不能为位置参数赋值。
c.
变量=${参数?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从Shell中退出,如果省略了word,则显示标准信
息。这种变量要求一定等于某一个参数的值。如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。
d. 变量=${参数+word}:如果设置了参数,则用word置换变量,否则不进行置换。
所有这4种形式中的“参数”既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较多。
Shell程序设计的流程控制
和其他高级程序设计语言一样,Shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令创建非常复杂的程序。
与传统语言不同的是,Shell用于指定条件值的不是布尔运算式,而是命令和字串。
1.测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件3个方面的测试,其测试符和相应的功能分别如下。
(1)数值测试:
-eq 等于则为真。
-ne 不等于则为真。
-gt 大于则为真。
-ge 大于等于则为真。
-lt 小于则为真。
-le 小于等于则为真。
(2)字串测试:
= 等于则为真。
!= 不相等则为真。
-z字串 字串长度为0则为真。
-n字串 字串长度不为0则为真。
(3)文件测试:
-e文件名 如果文件存在则为真。
-r文件名 如果文件存在且可读则为真。
-w文件名 如果文件存在且可写则为真。
-x文件名 如果文件存在且可执行则为真。
-s文件名 如果文件存在且至少有一个字符则为真。
-d文件名 如果文件存在且为目录则为真。
-f文件名 如果文件存在且为普通文件则为真。
-c文件名 如果文件存在且为字符型特殊文件则为真。
-b文件名 如果文件存在且为块特殊文件则为真。
另外,Linux还提供了与(!)、或(-o)、非(-a)三个逻辑操作符,用于将测试条件连接起来,其优先顺序为:!最高,-a次之,-o最低。
同时,bash也能完成简单的算术运算,格式如下:
$[expression]
例如:
var1=2
var2=$[var1*10+1]
则var2的值为21。
2.if条件语句
Shell程序中的条件分支是通过if条件语句来实现的,其一般格式为:
if 条件命令串
then
条件为真时的命令串
else
条件为假时的命令串
fi
3.for循环
for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式为:
for变量名 [in数值列表]
do
若干个命令行
done
变量名可以是用户选择的任何字串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in,则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。
4.while和until循环
while和until命令都是用命令的返回状态值来控制循环的。While循环的一般格式为:
while
若干个命令行1
do
若干个命令行2
done
只要while的“若干个命令行1”中最后一个命令的返回状态为真,while循环就继续执行do...done之间的“若干个命令行2”。
until命令是另一种循环结构,它和while命令相似,其格式如下:
until
若干个命令行1
do
若干个命令行2
done
until循环和while循环的区别在于:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。
Shell还提供了true和false两条命令用于创建无限循环结构,它们的返回状态分别是总为0或总为非0。
5.case条件选择
if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字串或变量的值从多个选项中选择一项的方法,其格式如下:
case string in
exp-1)
若干个命令行1
;;
exp-2)
若干个命令行2
;;
……
*)
其他命令行
esac
Shell通过计算字串string的值,将其结果依次和运算式exp-1, exp-2等进行比较,直到找到一个匹配的运算式为止。如果找到了匹配项,则执行它下面的命令直到遇到一对分号(;;)为止。
在case运算式中也可以使用Shell的通配符(“*”、“?”、“[ ]”)。通常用 * 作为case命令的最后运算式以便在前面找不到任何相应的匹配项时执行“其他命令行”的命令。
6.无条件控制语句break和continue
break用于立即终止当前循环的执行,而contiune用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。
7.函数定义
在Shell中还可以定义函数。函数实际上也是由若干条Shell命令组成的,因此它与Shell程序形式上是相似的,不同的是它不是一个单独的进程,而是Shell程序的一部分。函数定义的基本格式为:
functionname
{
若干命令行
}
调用函数的格式为:
functionname param1 param2…
Shell函数可以完成某些例行的工作,而且还可以有自己的退出状态,因此函数也可以作为if, while等控制结构的条件。
在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时Shell将把这些参数分别赋予相应的位置参数$1, $2, ...及$*。
8.命令分组
在Shell中有两种命令分组的方法:()和{}。前者当Shell执行()中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。当
用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括弧
中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰。{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。当我们要
真正使用圆括弧和花括弧时(如计算运算式的优先顺序),则需要在其前面加上转义符(\)以便让Shell知道它们不是用于命令执行的控制所用。
9.信号
trap命令用于在Shell程序中捕捉信号,之后可以有3种反应方式:
(1)执行一段程序来处理这一信号。
(2)接受信号的默认操作。
(3)忽视这一信号。
trap对上面3种方式提供了3种基本形式:
第一种形式的trap命令在Shell接收到与signal list清单中数值相同的信号时,将执行双引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽略信号:
trap " " signal-list
注意:
(1)对信号11(段违例)不能捕捉,因为Shell本身需要捕捉该信号去进行内存的转储。
(2)在trap中可以定义对信号0的处理(实际上没有这个信号),Shell程序在其终止(如执行exit语句)时发出该信号。
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将Shell程序终止的话,Shell程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致Shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的。当Shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若
commands是用单引号括起来的话,那么Shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体
的值来替换。
发表评论
-
Linux下case报错syntax error near unexpected token `in
2014-05-20 16:16 1105来分享一个在Linux下执 ... -
scp sz
2014-03-31 18:15 0使用的是secureCRT 那么先拷贝到这台服务器上,再下 ... -
Linux可执行文件执行时找不到共享库
2014-03-31 18:09 2261编译程序时使用了如下参数指定了链接库的位置,但是执 ... -
Makefile条件编译debug版和release版
2013-04-22 17:19 1813一般,在开发测试阶段用debug版本,而上线发布用relea ... -
如何修改linux主机名称
2013-04-18 17:21 928查看主机名命令:# ... -
Linux操作系统的Configure参数解释说明
2013-04-16 10:00 837Linux环境下的软件安装 ... -
Linux xargs命令
2013-04-15 16:27 779xargs是给命令传递参数的一个过滤器,也是组合多个命令的一 ... -
关于脚本定义环境变量问题的解决
2013-04-15 15:39 962偶然碰到一个脚本定义环境变量后,echo 显示为空值。 在 ... -
Shell脚本编程的常识
2013-04-15 15:17 1032http://mprc.pku.edu.cn/mentors ... -
Linux 查看进程和删除进程
2013-02-16 11:04 9441. 在 LINUX 命令平台输入 1-2 个 ... -
端口与进程
2013-02-06 10:52 1097端口与进程 ***** ... -
linux查看端口号,并杀掉进程
2013-02-06 10:51 3058[wb@server bin]$ netstat -nltp ... -
su: /bin/bash: Permission denied解决方案
2013-02-01 15:36 3680有一个这样的怪事情:一同事在RedHat5.5的系统中安装W ... -
linux修改系统时间
2013-02-01 13:50 965系统时间的设置date -s可以直接设置系统时间比如将系统 ... -
Linux下根据端口号查询对应进程or指定程序名查询对应端口
2013-01-30 17:09 0http://blog.sina.com.cn/s/blo ... -
weblogic 发布webservice
2013-01-16 16:23 0将webservice打成war包,或者按war包展开的目录格 ... -
gcc/g++编译
2012-07-16 13:57 19731. gcc/g++在执行编译工作的时候,总共需要4步 ... -
如何查看solaris操作系统的版本号
2012-07-10 17:44 3878如何查看solaris操作系统的版本号 我知道的有下面 ... -
solaris10中U盘的使用方法
2012-07-10 15:50 4306一般情况下U 盘插上去都可以自动识别,如果不能自动识别 ... -
solaris studio官方文档
2012-07-10 11:35 939Oracle Solaris Studio 12.3 Info ...
相关推荐
在 Solaris 10 中,Shell 编程是操作系统交互和自动化任务的核心组成部分。Shell 是一个命令解释器,它接收用户的输入,解析成系统可执行的指令,并将结果反馈给用户。本文档主要介绍了 Shell 编程的基础知识,包括...
- **Bourneshell** (`$`):Solaris的默认Shell,为AT&T UNIX环境设计。 - **Kornshell** (`$`):Bourneshell的增强版本,增加了别名、历史记录等功能。 - **Cshell** (`%`):语法类似于C语言,具有与Kornshell...
《UNIX操作系统基础》是一本深入浅出介绍UNIX和Solaris操作系统的权威教程。UNIX系统作为最早的多用户、多任务操作系统之一,对现代计算机科学产生了深远影响。这份PDF文档旨在为初学者提供一个全面且易懂的学习平台...
《Solaris Shell编程》是一本深入探讨在Solaris操作系统环境下如何使用Shell进行高效脚本编程的书籍。Solaris,由Sun Microsystems开发,是基于UNIX的一个强大操作系统,尤其在企业级服务器环境中广泛应用。Shell...
自动的FTP文件传输<br/>● 针对文件系统、页面调度/交换空间、系统负载、应用程序、进程的信息收集与监视活动,<br/>捕获系统配置<br/>● 打印队列管理,保证打印机正常打印<br/>● 使用bc工具程序在shell脚本中...
所有程序示例和实例均在Solaris 2.5或Linux系统的Red Hat Linux 7.1环境下测试通过,保证了实例的实用性和参考价值。 UNIX操作系统教程第三版不仅对第2版中过时的技术进行了删减,还针对Linux系统的设计和使用技术...
- **BSD**: BSD是在加州大学伯克利分校开发的Unix版本,最初是对原始Unix的增强,引入了许多创新的技术,比如虚拟文件系统(VFS)、TCP/IP网络协议栈等。BSD版本因其开放性和灵活性而受到欢迎。 基于这两大数据流派,...
在IT领域,Shell编程是一种非常基础且重要的技能,特别是在Unix和类Unix系统中,如Solaris。Solaris Shell编程涉及到使用Shell脚本来自动化任务、管理系统以及执行一系列命令。以下是关于"Solaris Shell编程"的详细...
Solaris操作系统是Oracle/Sun公司开发的一个基于Unix的高级操作系统,尤其以其稳定性和安全性而闻名。自1969年Unix由肯·汤普森和丹尼斯·里奇开创以来,Unix经历了多个演变阶段,逐渐形成了不同的变种,如Redhat、...
【Solaris系统管理和维护】是针对初学者的全面教程,涵盖了Solaris操作系统的多个核心方面。以下是关于这个主题的详细知识点: 1. **软件环境和UNIX常用命令**: - **软件组成**:Solaris系统由硬件(HW)、内核...
Randal K.Michael 是一位在可口可乐公司任职的UNIX系统管理员,他编写了许多shell脚本来处理UNIX下复杂的系统监视和事件通知问题。他具有23年的工作经验,同时担任UNIX系统管理员达10年之久,熟悉 Solaris 、Linux、...
《Solaris技术指南:Shell部分》是...通过这些文档,你可以深入理解Solaris系统下的shell编程,提升自动化任务处理和系统管理的能力。无论是日常运维还是开发脚本,这些知识都能提高效率,使你更好地利用Solaris平台。
2. **覆盖多种UNIX系统:** 为了满足不同用户的需要,本书不仅针对最流行的Linux系统进行了详细介绍,还涵盖了Solaris、AIX和HP-UX等其他常见的UNIX系统。每种系统的特定命令结构都有详细的解释,使读者能够轻松地在...
在"Unix 详解"的标签下,"solaris-part3.pdf"可能涉及Unix的用户接口,包括命令行接口(CLI)和图形用户接口(GUI)。CLI部分会讲解Shell脚本编程,如Bash,以及常用命令的用法。GUI部分则可能涉及X Window系统和...
在IT领域,UNIX操作系统是服务器环境中广泛使用的系统之一,其稳定性和安全性深受赞誉。然而,不同的UNIX变体在具体实现上存在一些差异,这些差异主要体现在用户账号设置、目录结构以及常用命令等方面。下面将详细...
标题中的"Shell Programming for System Administrators(Solaris)"暗示了这是一份关于在Solaris操作系统环境下,系统管理员如何使用Shell编程来提升管理效率的教程。Shell编程是Linux和Unix系统中不可或缺的一部分,...
在Solaris和其他Unix/Linux系统中,常见的Shell有Bourne shell (bsh)、C shell (csh)和Korn shell (ksh)。这些Shell具有不同的语法特点和功能,例如Bash是Bourne shell的一个改进版本,广泛用于Linux和现代Unix系统...