什么是SHELL
2014-04-22 14:50
323 查看
shell 是一个命令解释器.是介于操作系统kernel 与用户之间的一个绝缘层.准确地说,它也是一
一种强力的计算机语言.一个shell 程序,被称为一个脚本,是一种很容易使用的工具,它可以通过
将系统调用,公共程序,工具,和编译过的二进制程序粘合在一起来建立应用.事实上,所有的UNIX
命令和工具再加上公共程序,对于shell 脚本来说,都是可调用的.如果这些你还觉得不够,那么
shell 内建命令,比如test 与循环结构,也会给脚本添加强力的支持和增加灵活性.Shell 脚本对于
管理系统任务和其它的重复工作的例程来说,表现的非常好,根本不需要那些华而不实的成熟
紧凑的程序语言.对于任何想适当精通一些系统管理知识的人来说,掌握shell 脚本知识都是最基本的,即使这些
人可能并不打算真正的编写一些脚本.想一下Linux 机器的启动过程,在这个过程中,必将运行
/etc/rc.d 目录下的脚本来存储系统配置和建立服务.详细的理解这些启动脚本对于分析系统的
行为是非常重要的,并且有时候可能必须修改它.Shell 脚本遵循典型的UNIX 哲学,就是把大的复杂的工程分成小规模的子任务,并且把这些部件
和工具组合起来.许多人认为这种办法更好一些,至少这种办法比使用那种高\大\全的语言更
美,更愉悦,更适合解决问题.比如Perl 就是这种能干任何事能适合任何人的语言,但是代价就是
你需要强迫自己使用这种语言来思考解决问题的办法.以下情况不使用Shell 脚本资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash 等等)
需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算
(这种情况一般使用C++或FORTRAN 来处理)
有跨平台移植需求(一般使用C 或Java)
复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)
对于影响系统全局性的关键任务应用。
对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等.
项目由连串的依赖的各个部分组成。
需要大规模的文件操作
需要多维数组的支持
需要数据结构的支持,比如链表或数等数据结构
需要产生或操作图形化界面 GUI
需要直接操作系统硬件
需要 I/O 或socket 接口
需要使用库或者遗留下来的老代码的接口
私人的,闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)一个shell 脚本其实就是将一堆系统命令列在一个文件中.它的最基本的
用处就是,在你每次输入这些特定顺序的命令时可以少敲一些字.下面是一个清除日志的例子:
释器.#!实际上是一个2 字节[1]的魔法数字,这是指定一个文件类型的特殊标记, 换句话说, 在
这种情况下,指的就是一个可执行的脚本(键入man magic 来获得关于这个迷人话题的更多详细
信息).在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这个程序可
以是 shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执行脚本中
的命令(从#!行下边的一行开始),忽略注释.[2]
如:
1 #!/bin/sh
2 #!/bin/bash
3 #!/usr/bin/perl
4 #!/usr/bin/tcl
5 #!/bin/sed -f
6 #!/usr/awk -f
上边每一个脚本头的行都指定了一个不同的命令解释器,如果是/bin/sh,那么就是默认shell
(在Linux 系统中默认是Bash).[3]使用#!/bin/sh,在大多数商业发行的UNIX 上,默认是Bourne
shell,这将让你的脚本可以正常的运行在非Linux 机器上,虽然这将会牺牲Bash 一些独特的特征.
脚本将与POSIX[4] 的sh 标准相一致.
注意: #! 后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是
“Command not found”,这将是你运行这个脚本时所得到的唯一结果.
当然”#!”也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用shell 内建
的指令了,如果不能使用变量的话,当然这也就失去了脚本编程的意义了.
本文出自 “金之墨” 博客,请务必保留此出处http://zoushj.blog.51cto.com/1655679/1400516
一种强力的计算机语言.一个shell 程序,被称为一个脚本,是一种很容易使用的工具,它可以通过
将系统调用,公共程序,工具,和编译过的二进制程序粘合在一起来建立应用.事实上,所有的UNIX
命令和工具再加上公共程序,对于shell 脚本来说,都是可调用的.如果这些你还觉得不够,那么
shell 内建命令,比如test 与循环结构,也会给脚本添加强力的支持和增加灵活性.Shell 脚本对于
管理系统任务和其它的重复工作的例程来说,表现的非常好,根本不需要那些华而不实的成熟
紧凑的程序语言.对于任何想适当精通一些系统管理知识的人来说,掌握shell 脚本知识都是最基本的,即使这些
人可能并不打算真正的编写一些脚本.想一下Linux 机器的启动过程,在这个过程中,必将运行
/etc/rc.d 目录下的脚本来存储系统配置和建立服务.详细的理解这些启动脚本对于分析系统的
行为是非常重要的,并且有时候可能必须修改它.Shell 脚本遵循典型的UNIX 哲学,就是把大的复杂的工程分成小规模的子任务,并且把这些部件
和工具组合起来.许多人认为这种办法更好一些,至少这种办法比使用那种高\大\全的语言更
美,更愉悦,更适合解决问题.比如Perl 就是这种能干任何事能适合任何人的语言,但是代价就是
你需要强迫自己使用这种语言来思考解决问题的办法.以下情况不使用Shell 脚本资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash 等等)
需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算
(这种情况一般使用C++或FORTRAN 来处理)
有跨平台移植需求(一般使用C 或Java)
复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)
对于影响系统全局性的关键任务应用。
对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等.
项目由连串的依赖的各个部分组成。
需要大规模的文件操作
需要多维数组的支持
需要数据结构的支持,比如链表或数等数据结构
需要产生或操作图形化界面 GUI
需要直接操作系统硬件
需要 I/O 或socket 接口
需要使用库或者遗留下来的老代码的接口
私人的,闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)一个shell 脚本其实就是将一堆系统命令列在一个文件中.它的最基本的
用处就是,在你每次输入这些特定顺序的命令时可以少敲一些字.下面是一个清除日志的例子:
[cce] #!/bin/bash #shell脚本的开始(必须) # #号代表注释 #清除日志 LOG_DIR=/var/log #定义LOG_DIR变量 cd $LOG_DIR #调用变量 cat /dev/null>messages #清除日志 echo "Logs cleaned up." #输出“LOGS..."到屏幕 exit #退出 [/cce]
上面例子是最基本的,当然,我们可以写的更复杂:
[cce] #!/bin/bash LOG_DIR=/var/log ROOT_UID=0 # $UID 为0 的时候,用户才具有根用户的权限 LINES=50 # 默认的保存行数 E_XCD=66 # 不能修改目录? E_NOTROOT=67 # 非根用户将以error 退出 if [ "$UID" -ne "$ROOT_UID" ] # 当然要使用根用户来运行 then echo "Must be root to run this script." exit $E_NOTROOT fi if [ -n "$1" ] # 测试是否有命令行参数(非空). then lines=$1 else lines=$LINES # 默认,如果不在命令行中指定 fi cd $LOG_DIR if [ `pwd` != "$LOG_DIR" ] # 不在 /var/log 中? then echo "Can't change to $LOG_DIR." exit $E_XCD fi tail -$lines messages > mesg.temp # 保存log file 消息的最后部分. mv mesg.temp messages # 变为新的log 目录. echo "Logs cleaned up." exit 0 # 退出之前返回0,返回0 表示成功. [/cce]
编写完脚本之后,你可以使用sh scriptname,[5]或者bash scriptname 来调用它.
更方便的方法给他执行权限:chomd +rx scriptname 然后 ./scriptname 就可执行要注意,在每个脚本的开头都使用”#!”,这意味着告诉你的系统这个文件的执行需要指定一个解
释器.#!实际上是一个2 字节[1]的魔法数字,这是指定一个文件类型的特殊标记, 换句话说, 在
这种情况下,指的就是一个可执行的脚本(键入man magic 来获得关于这个迷人话题的更多详细
信息).在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这个程序可
以是 shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执行脚本中
的命令(从#!行下边的一行开始),忽略注释.[2]
如:
1 #!/bin/sh
2 #!/bin/bash
3 #!/usr/bin/perl
4 #!/usr/bin/tcl
5 #!/bin/sed -f
6 #!/usr/awk -f
上边每一个脚本头的行都指定了一个不同的命令解释器,如果是/bin/sh,那么就是默认shell
(在Linux 系统中默认是Bash).[3]使用#!/bin/sh,在大多数商业发行的UNIX 上,默认是Bourne
shell,这将让你的脚本可以正常的运行在非Linux 机器上,虽然这将会牺牲Bash 一些独特的特征.
脚本将与POSIX[4] 的sh 标准相一致.
注意: #! 后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是
“Command not found”,这将是你运行这个脚本时所得到的唯一结果.
当然”#!”也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用shell 内建
的指令了,如果不能使用变量的话,当然这也就失去了脚本编程的意义了.
本文出自 “金之墨” 博客,请务必保留此出处http://zoushj.blog.51cto.com/1655679/1400516
相关文章推荐
- 什么是shell以及如何编写最简单的shell
- shell中$后加引号有什么用($"string"和$'string')
- 什么是Shell
- shell监视别人在登录后都输入了什么命令
- Linux的shell指的是什么
- shell中各种括号()、(())、[]、[[]]、{},在什么场合下使用?
- linux 下shell中if的“-e,-d,-f”是什么意思
- linux下学习shell有什么用
- SWT中Display和Shell是个什么东东
- 请问SSH Secure File Transfer Client和SSH Secure Shell Client这两个工具分别是干什么用的?
- 什么是shell?
- Linux#Shell#if [ $# -ne 1 ];then 是什么意思?
- linux超级基础系列——什么是shell? bash和shell有什么关系?(转)
- Shell简介:什么是Shell,Shell命令的两种执行方式
- 如何查看本机的linux使用的是什么shell
- shell---"2>&1" 是什么意思
- 什么是shell
- 什么是Kernel、Shell、Bash 很幽默的解释
- linux——什么是shell? bash和shell有什么关系?(转)
- 什么是Shell?Shell脚本基础知识