一:起因
(0)也许由于一时的冲动使得你开始关注并学习shell编程;亦许由于是“道听途说”shell的威力很大;亦许由于shell编程的魅力;亦许由于作为一个coder的偏好;亦许……
(1)先来搞清楚为什么要学shell,学习要有目的性 ---- 简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。
shell简单、灵活、高效,特别适合处理一些系统管理方面的小问题
shell可以实现自动化管理,让系统管理员的工作变得容易、简单、高效
shell可以把一些经常需要用的命令或者操作,以文件的形式存储起来,每一次调用即可,不用重复的键入命令
shell脚本可移植性好,在unix/linux系统中可灵活移植,几乎不用任何设置就能正常运行
shell脚本可轻松方便读取和修改源代码,不需要编译 掌握shell可以帮你解决一些故障问题,比如脚本引起的故障问题
掌握shell是一个中级以上系统工程师必需要会的 掌握shell是你系统管理进阶的必经之路
掌握shell是你面试更高级职位的一块敲门砖
(2)那什么时候不使用Shell 脚本?
资源密集型的任务,尤其在需要考虑效率时(比如排序,hash 等)
需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)
有跨平台移植需求(一般使用C 或Java) 复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)
对于影响系统全局性的关键任务应用。 对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等. 项目由连串的依赖的各个部分组成。
需要大规模的文件操作 或 需要多维数组的支持 需要数据结构的支持,比如链表或数等数据结构
需要产生或操作图形化界面 GUI 需要直接操作系统硬件 需要 I/O 或socket 接口
需要使用库或者遗留下来的老代码的接口 私人的,闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)
如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧--或许是Perl,Python,Ruby, 或者是更高层次的编译语言比如C/C++,Java
二:知识点介绍
(1)从脚本编写和执行开始 —— 编写用vim即可,保存为filename.sh文件即可;执行前需要更改为可执行文件或者sh filename.sh来执行:
1)通常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
2)//通过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 的语法是否正确呢
sh -x filename.sh
这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。
(2)下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样
sudo vim hello.sh:
#!/bin/sh
#print hello world in the console window
a="hello world"
echo "Hi, ${a}s"
chmod 755 hello.sh 更改为可执行文件 rwx(4,2,1)
sh hello.sh 或者 ./hello.sh
(3)shell里的特殊字符
和其他编程语言一样,shell里也有特殊字符。常见的有美元符号($),反斜线(\)和引号。
1)美元符号
美元符号表示变量替换,即用其后面指定的变量的值来代替变量。反斜线“\”为转义字符,转义字符告诉shell不要对其后面的那个字符进行特殊处理,只是当做普通字符。
2)双引号(")
由双引号括起来的字符,除$,倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。
3)单引号(‘)
由单引号括起来的字符都作为普通字符出现。
4)倒引号(`) tab键上面那个原始字符
由倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令,并以它的标准输出结果取代整个引号部分。
5)示例
示例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
6)变量
shell的变量非常类似于JS 和 python,不用声明;但是有一点需要注意,变量和等号(即等号前后无任何空格)如 num=10;但是if [ ${num} eq 10 ];then …… fi 这其中的空格必须得有的
(4)shell脚本的注释
shell脚本和其它编程语言一样,也拥有注释。注释方法为在注释行前加#号。
例如以下脚本:
#!/bin/sh
#Filename: comment.sh
#Description:this script explains how to make a comment
echo “This script explains how to make a comment ”
创建脚本时,脚本的第一行通常称为shbang(#!)行。当脚本启动后,UNIX内核检查文件的第一行以决定将要执行的程序类型。
shbang符号(#!)后面的路径是用来解释此脚本的shell位置。要正确使用这个特性,#!必须是文件中最前面的两个字符。如果
文件头部有空格字符或者空白行,则此特性被忽略,该行被解释为普通的注释行。
(5)再看sh脚本执行的奥秘
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。
输入一些代码:
#!/bin/bash
echo "Hello World !"
“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令(最好用$printf ""具有更好的可移植性)用于向窗口输出文本。
将上面的代码保存为test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
注意,一定要写成./test.sh,而不是test.sh。运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.
sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。
通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。
这里的"系统",其实就是shell这个应用程序(想象一下Windows Explorer),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。
三:体会心得
(1)简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。
例如:你用c编写一个工程,里面有很多.h文件,.c文件等等,每一次更改你都得需要重新 g++ filenames.c filenames.h -o filenames,过于麻烦,这时就需要编写一个小小shell文件,就可以解决问题了。
(2)记得自己上次写python的基础学习,应该是一个月前了,这次重新学一个新的语言(脚本语言),间隔的时间非常短;越发的感觉,必须掌握精通一门语言,之后学习其他语言非常容易上手 —— 仅仅是入门,如果想在某一门语言上进阶或者深入,只能说“路漫漫其修远兮亦”!
(3)我在这里就不误人子弟了,详细的shell入门详见
鸟哥私房菜 或者
shell脚本教程
原文地址:http://blog.csdn.net/u010700335/article/details/45562825