首页 > 代码库 > shell基础

shell基础

转 http://blog.csdn.net/zhuying_linux/article/details/6630220

写之前我们先来搞清楚为什么要学shell,学习要有目的性
shell简单、灵活、高效,特别适合处理一些系统管理方面的小问题
shell可以实现自动化管理,让系统管理员的工作变得容易、简单、高效
shell脚本可移植性好,在unix/linux系统中可灵活移植,几乎不用任何设置就能正常运行
shell脚本可轻松方便读取和修改源代码,不需要编译
掌握shell可以帮你解决一些故障问题,比如脚本引起的故障问题
掌握shell是一个中级以上系统工程师必需要会的
掌握shell是你系统管理进阶的必经之路
掌握shell是你面试更高级职位的一块敲门砖
那什么时候不使用Shell 脚本?
资源密集型的任务,尤其在需要考虑效率时(比如排序,hash 等)
需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)
有跨平台移植需求(一般使用C 或Java)
复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)
对于影响系统全局性的关键任务应用。
对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等.
项目由连串的依赖的各个部分组成。
需要大规模的文件操作
需要多维数组的支持
需要数据结构的支持,比如链表或数等数据结构
需要产生或操作图形化界面 GUI
需要直接操作系统硬件
需要 I/O 或socket 接口
需要使用库或者遗留下来的老代码的接口
私人的,闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)
 如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧--或许是Perl,Python,Ruby, 或者是更高层次的编译语言比如C/C++,Java.

1.介绍shell脚本

简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,

以便日后使用。通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/sh,#!/bin/bash,#!/bin/csh,,#!/bin/tcsh和,#!/bin/ksh等。下面的run.sh则指明使用bash执行。

#!bin/bash

ls -l

通常,shell脚本会以#!/bin/sh作为默认的shell程序。执行shell的方式有两种:第一种是为shell脚本加上可执行权限并执行第二种通过sh命令执行shell脚本,例如执行当前目录下的run.sh脚本,命令如下:

//为shell脚本直接加上可执行权限并执行

chmod 755 run.sh

./run.sh

//通过sh命令执行shell脚本

sh run.sh

注意:那为何『 sh shell.sh 』也可以运行呢?

这是因为 /bin/sh 其实就是 /bin/bash(连结档),使用 sh shell.sh 亦即告诉系统,我想要直接以 bash 的功能来运行 shell.sh 这个文件内的相关命令的意思,所以此时你的 shell.sh 只要有 r 的权限即可被运行喔而我们也可以利用 sh 的参数,如 -n 及 -x 来检查与追踪 shell.sh 的语法是否正确

2。输入输出重定向

Linux使用标准输入stdin和标准输出stdout,来表示每个命令的输入和输出,还使用一个标准错误输出stderr用于输出错误信息。这三个标准输入输出系统默认与控制终端设备相联系在一起的。因此,在标准情况下,每个命令通常从它的控制终端中获取输入,将输出打印到控制终端的屏幕上。

但是可以重新定义程序的输入stdin和输出stdout,将它们重定向。最基本的方法就是将它们重定义到一个文件上去,从一个文件获取输入/输出到另外的文件中等。

2.1输入重定向

输入重定向使用小于号“<”可以实现。显示文件的cat命令就是将标准输入重定向到文件实现的。

//将/etc/fstab作为输入,重定向到cat命令

# cat /etc/fstab

[plain] view plaincopy
 
  1. LABEL=/                 /                       ext3    defaults        1 1  
  2. LABEL=/boot             /boot                   ext3    defaults        1 2  
  3. none                    /dev/pts                devpts  gid=5,mode=620  0 0  
  4. none                    /proc                   proc    defaults        0 0  
  5. none                    /dev/shm                tmpfs   defaults        0 0  
  6. /dev/hda3               swap                    swap    defaults        0 0  
  7. /dev/cdrom              /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0  
  8. /dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0  

 

2.2输出重定向

输出重定向有两种方式,一种是直接输出,使用一个大于号“>”实现;另一种是以附加的方式输出,使用两个大于号“>>”实现。前者会覆盖原始的输出内容,而后者会添加到文件最后。以下通过实例说明其区别。

//ls命令重定向到/root/dir.txt并显示

ls >dir.txt

cat < dir.txt

anaconda-ks.cfg

install.log

install.log.syslog

//ls -l命令以附加的方式重定向到/root/dir.txt并显示

ls -l >>dir.txt

cat < dir.txt

anaconda-ks.cfg

install.log

install.log.syslog

总用量 24

-rw-r--r--  1   root   root   1245    7月22    21:07    anaconda-ks.cfg

-rw-r--r--  1   root   root   14522  7月22    21:01    intall.log

-rw-r--r--  1   root   root   2906    7月22     21:00   install.log.syslog

3。管道

管道和输入输出重定向十分类似。管道的作用是在一个命令的标准输出和另一个命令的标准输入之间建立一个通道。例如下面命令就是将ps -aux的标准输出传递给grep作为输入。

ps -aux | grep httpd

 

4.shell里的特殊字符

和其他编程语言一样,shell里也有特殊字符。常见的有美元符号($),反斜线(\)和引号

1。美元符号

美元符号表示变量替换,即用其后面指定的变量的值来代替变量。反斜线“\”为转义字符,转义字符告诉shell不要对其后面的那个字符进行特殊处理,只是当做普通字符。而shell下的引号情况比较复杂,分为三种:双引号("),单引号(‘)和倒引号(`)。他们的作用都不尽相同,以下一一说明。

2。双引号(")

双引号括起来的字符除$,倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。

3。单引号(‘)

由单引号括起来的字符都作为普通字符出现。

4。倒引号(`)

倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令,并以它的标准输出结果取代整个引号部分

示例1的代码及输出如下:

#echo "My current directory is `pwd` and logname is $LOGNAME"【双引号中的倒引号和美元符号保持原来的功能】

My current directory is /root and logname is root

 

示例2的代码及输出如下:

#echo "My current directory is `pwd` and logname is \$LOGNAME"【双引号中的转义字符保持原来的功能】

My current directory is /root and logname is $LOGNAME

示例3的代码及输出如下:

#echo ‘My current directory is `pwd` and logname is $LOGNAME‘【单引号里面的内容不变】

My current directory is `pwd`and logname is $LOGNAME

5。shell脚本的注释

shell脚本和其它编程语言一样,也拥有注释。注释方法为在注释行前加#号。

例如以下脚本:

 

[plain] view plaincopy
 
  1. #!/bin/sh  
  2. #Filename: comment.sh  
  3. #Description:this script explains how to make a comment  
  4.    
  5. echo “This script explains how to make a comment ”  

 

创建脚本时,脚本的第一行通常称为shbang(#!)行。当脚本启动后,UNIX内核检查文件的第一行以决定将要执行的程序类型。

shbang符号(#!)后面的路径是用来解释此脚本的shell位置。要正确使用这个特性,#!必须是文件中最前面的两个字符。如果

文件头部有空格字符或者空白行,则此特性被忽略,该行被解释为普通的注释行

6shell脚本的注释后-f的作用

之前是见过这样的写法:

 

[plain] view plaincopy
 
  1. #!/bin/csh -f  
  2. #Filename: comment.sh  
  3. #Description:this script explains how to make a comment  
  4. echo “This script explains how to make a comment ”  

 

 

通常称作快速启动选项,-f开关通知shell启动时不加载.cshrc文件。

对ksh其shbang行可能为!/bin/ksh -p

对于bash可能!/bin/bash --noprofile
7.shell脚本中运算符


范例:


更多1
19
1
主题推荐
编程shell系统管理员编程语言数据结构
猜你在找
安装enca
Windows Shell 编程 第八章
Windows Shell 编程 第二章
Qt中两种定时器用法
ORACLE中的KEEP()使用方法
C++访问sqlite3实践
在it混了四年了,android开始半个多年头,发帖纪念一下
《Linux命令行与shell脚本编程大全》 第九章 学习笔记
一道阿里巴巴面试题--海量数据查找
linux的shell代码
 
查看评论
5楼 紫颖 2012-03-05 22:26发表 [回复]
tab键的作用:
1)少打很多字;
2)确定输入的数据是正确的! 使用 [tab] 按键的时机依据 [tab] 接在命令后或参数后而有所不同。我们再复习一次:
* [Tab] 接在一串命令的第一个字的后面,则为命令补全;
* [Tab] 接在一串命令的第二个字以后时,则为『文件补齐』!
4楼 紫颖 2012-03-05 22:13发表 [回复]
~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中
3楼 紫颖 2012-03-01 10:18发表 [回复] [引用] [举报]
假如说单引号中的变量你想让它输出内容该怎么办呢?
[oracle@sor-sys ~]$appname=app-gateway
[oracle@sor-sys ~]$echo ‘<display-name>Oracle generated application ‘$appname‘</display-name>‘【正解】
<display-name>Oracle generated application app-gateway</display-name>
[oracle@sor-sys ~]$ echo ‘<display-name>Oracle generated application $appname</display-name>‘【错解】
<display-name>Oracle generated application $appname</display-name>
[oracle@sor-sys ~]$echo ‘<display-name>Oracle generated application "$appname"</display-name>‘【错解】
<display-name>Oracle generated application "$appname"</display-name>