赞
踩
本篇博客将会介绍(Contents):
1、什么是shell,shell解释器和命令(或称工具)之间有什么区别
2、“变量”和“命令”的区别
3、出口状态和标准输出的区别:标准输入和参数的区别;
4、linux中的空格
5、如何执行shell脚本
6、接下来几篇博客内容
7、使用和参考书籍 References
前言:
Linux中基本就这些东西:变量、命令、特殊符号
在shell脚本编程中只是多了用于循环的关键字
在操作上就是这些东西的组合罢了。
shell是命令行解释器。命令是一个个的工具。
参考《精通UNIX shell脚本编程》(第2版)—Randal K.Michael编著、李德龙译
类比,bash和grep。bash是一种shell,grep是一种工具,两种独立运作。举例:在Terminal(终端)输入:grep -i az * 首先这条命令会被提交给系统默认shell(bash),bash会对这条命令进行一定的解析,这个“*”会被shell先解析,然后替换成当前目录下的各种文件。然后再把这些参数提交给grep工具,所以grep工具接受到的参数是什么: -i,az,和当前目录下的所有文件。然后具体检索,就是grep工具来完成的。
那bash有什么用呢?bash相当于语言,而grep, find等等,相当于一个个别人已经写好的库。我们在bash中可以用for语法,循环调用这些库,来完成特定的功能(和C语言中很像)。
当我们打开Ubuntu的Terminal时,进入的是Bash Shell,输入一条命令后,提交给该shell进行解释,注意是解释,shell把该解释的,解释完成后,就会检索该命令的位置。然后把参数提交给该命令,由该命令与系统进行交互。此时就不是shell来执行了,而是提交给命令(或称工具)来执行。
这些命令就是一个个用于与系统打交道的小工具,或称系统命令。
系统命令随Linux的安装而安装,其相对于bash shell来说是外部命令;另有些工具是bash shell的内建工具,对于bash shell来说属于内部命令;所有的工具都是用于更好的与系统进行交互和管理系统。
Bash Shell有自己的语法,有自己解释的方式,所以自成一门语言。而这门语言中大量调用了工具(或称命令),这些工具不是bash shell语言的一部分,而是独立的工具。
以上概念参考《UNIX shell范例精解》(第四版)--Ellie Quigley编著 李化译。
《Linux指令从初学到精通》—华清远见嵌入式培训中心 贺丹丹 等编著的书对于shell的介绍是:
shell作为操作系统的外壳,是操作系统的最外层。为用户提供了使用操作系统的接口。
shell有三种特征:
1、shell是用户和Linux内核之间的接口程序;
2、shell又是一个命令语言解释器;
3、shell的另一个重要特性是它本身就是一个解释型的程序设计语言。它支持绝大多数高级语言中的程序元素,比如:函数、变量、数组合程序控制结构。
总之,shell提供的是一个CLI(命令行界面),解释的是shell的变量和自身的语法结构等;众多的命令是一个个工具,由shell来操作这些应用程式。
不同的shell,比如Bash shell、C shell、Korn shell……等等,他们之间语法和内部命令之间会有差别。Linux系统默认的是Bash,可以通过echo $SHELL来查看当前是使用的哪个shell环境。想要查看系统安装的所有shell,可以通过cat /etc/shells来查看。
1、 变量和命令区别:
变量:无非是系统分配的一组内存位置,用以存储各种数据。
命令:是用来执行的,有选项、[输入]、最终会有一个命令状态输出。
而位置参数属于变量的一种。
2、 变量和命令的格式:
变量的命名格式:任何字母、数字和下划线。第一个字符必须是字母或下划线。
命令的使用格式:命令名 [命令选项] [命令参数]
命令名是系统固有的,虽然内部变量也是系统固有的(具体可以看shell内部变量一篇博客:)
3、 变量和命令的引用区别:
变量的引用与替换:${varible} 花括号
命令替换:$(command) 圆括号
注意:一定要分清哪些是变量,哪些是命令,并清除地知道他们区别,引用区别,使用区别等等。
比如:PATH (内部变量)和pwd(内部命令)
引用:PATH:echo $PATH 或 echo ${PATH}
pwd :echo $(pwd) 或 echo `pwd` (注意这个是反引号) 或 echo $(pwd) (反引号和$()作用一样)
变量可以用$variable引用,但千万别 $command;命令用$直接引用几个意思?(对,没错,我之前就老干这事^^)
shell设置的内部变量会在另一篇博客中有讲:(等待一个链接^^)
最后注意:linux区分大小写。
⑴ 出口状态:只要是执行命令,都会有一个出口状态,用于显示这个命令是否正常执行。
比如,命令:echo hello
标准输出:hello
查看其出口状态可以用:$?,通过命令:echo $?
如果输出为0 ,则表示echo hello正常运行;如果输出为其它,表示非正常运行。
具体查看出口状态的操作,可以看shell设置的内部变量:(等待一个链接)
⑵ 标准输出:标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。
比如命令expr 1 + 1会把结果送到标准输出,在终端屏幕也可以显示;再比如命令:echo hello标准输出为hello,这个标准输出直接被送到了显示器。
⑶ 出口状态和标准输出的区别:
每一个命令的执行都会有一个出口状态,但是,并不是每一个命令都会有标准输出。
标准输出可以被直接赋值,echo显示命令的标准输出,或者用管道把标准输出送给其它命令。而出口状态并不会输出,只能被查看。只是用来显示这个命令是否正常执行。
标准输出可以被用来直接赋值或输出;而命令的出口状态一般只能通过shell内部变量的引用来查看。
实际举例:我曾经就傻傻的把出口状态当做标准输出来用,还不知道错在哪里:
在用命令:let “5<2”时,犯的一个错误,具体可查看数值计算相关博客,查看为什么这个数值计算命令在使用时会出错:(等待数值计算的那一篇博客链接)
这一块理解的不是很好,具体还要再查一下其它书籍或者百度一下,手上这本书上没有这方面的区分,在搜索的同时和管道“|”的那个标准输出在一起搜索一下。
⑷ 命令的标准输入和参数的区别:
标准输入:一般都是指向从键盘输入,比如你用cat命令,它接收的就是键盘输入(标准输入)然后把它输出来,类似的还有wc命令等。而标准输入重定向就是说,可以重新指向标准输入的来源,不从键盘,而是从文件。能够接收标准输入的命令,就能够用标准输入重定向到文件进行读取数据。至于哪些命令可以接收标准输入:点击打开链接
参数算不算标准输入?参数当然不是标准输入,标准输入数据来源默认是键盘。而参数,是随命令一起被传入的。比如echo命令,单单一个echo,就输出一行空行,也不会让你从键盘中输入任何东西。当然,标准输入重定向也不能用于echo命令,因为它不接受。echo命令只接收参数,如果是命令,那么就只能对其标准输出进行引用,用$()等。比如echo hello,这个hello就是命令参数。如何将一个命令的结果作为下一个命令的参数:点击打开链接
1、意外空格,导致意外的结果:
命令:echo hello >test file (本意是把echo标准输出重定向到test file文件)
结果:创建一个test文件,内容是hello file(这就很神奇hhh),并不会创建一个test file文件
更正:
命令:echo hello >”test file”
输出:创建了一个test file文件,内容为hello。这样就不会出现只创建test文件的尴尬,而是创建了test file文件。
分析:linux中空格一般是用于字符的隔断,中间有空格就代表是两个字符了,可以使用转义符号、单、双引号来解决一个字符串中有特殊符号的情况。
单、双引号的具体使用可以看其中一篇博客:(等一个链接)
2、没有合适的空格,导致的报错:
举例:
脚本代码:
funtion()
{
echo hello
}1>test 2>&1
执行:bash function
输出:./test: line 5: syntax error: unexpected end of file
分析:最后一句“} 1>test 2>&1” 注意:“}”与“1>test”之间必须要有空格
至于有没有空格这样的情况,大多数情况是比较好分辨的,一般独立的两项之间是要加空格的;如果空格也是字符串的一部分,把整体用单或双引号括起来就可以了。其它特殊符号也是同样的做法。
执行shell脚本主要有两种方式:
1、直接提交给对应程序进行执行。比如,利用命令:sh或bash
2、修改文件为可执行,然后运行它
下面对这两种进行一个详细的介绍:
第一种:提交给对应的程序:bash或sh或tcsh……
举例:脚本文件sum
命令:bash sum 或 sh sum 或 tcsh sum
区别:用不同的命令,意味着你把这个文件提交给不同的shell去执行,不同的shell在语法,命令用法和最后的输出上会略有不同。
竟然这么多shell版本,那么应该用哪一个?
当然是bash!!因为由于bash相当的优秀,操作合理,其他的版本基本已经被淘汰了,所以以后执行脚本文件的命令就是:bash filename。介绍不同shell版本的博客: 点击打开链接
第二种:修改文件的权限为可执行文件,然后运行它
① 修改权限
最开始我们用vi编辑一个脚本文件,就是一个普通的文本文件。脚本编完后可以把这个文件的权限修改为可执行文件。
使用命令:chmod 755 filename
chmod a+rx filename
chmod u+rx filename
以上三种命令选择之一就好,它们的区别仅在于对文件属主和其它用户一些权限的区别。
② 运行
文件修改为可执行文件后,就可以执行它了。
命令: 1、./filename (注意是“./”,“./”表示当前工作目录,而“~”表示当前用户主目录)
2、filename (如果脚本文件filename在PATH路径中可以找到,可以直接这样写。注意是PATH路径,系统默认就是从PATH路径中去找,不过并不会自动包含当前工作目录)
最后,注意区分:“./filename”和“. filename(点 . 与filename中间有空格)”之间的区别。
1、“./”表示当前路径、
2、 “.”是一个shell内部命令,相当于命令source,用于读取shell脚本,并在当前Shell环境(比如shell脚本)中执行。而filename的路径会在 PATH中的路径 和 当前路径 进行寻找(和上面的区别),也可以使用绝对路径。
所以,为避免混淆,最好用source命令替代点命令。
这两者的联系,比如命令:. ./filename 最前面的点是命令,后面的./filename是filename的绝对路径。命令和文件名之间需要加空格。
需要注意的是:
1、在文件第一句需加上“#!/bin/bash”(其实也可以不加,不加的话调用的就是系统默认的那个shell,一般就是bash,不过加上最好)
含义:调用指定的shell执行这个shell脚本。
当然你也可以在下面选择一个加在脚本文件的首行替换#!/bin/bash:
#!/bin/bash
#!/bin/sh
#!/bin/ksh
#!/bin/tcsh
……
虽然一般只用bash
2、打开了两个Terminals,两个Terminals的信息并不同步。比如:你可以一个terminal是root权限,一个是普通用户权限。再比如:在这个terminal中更改.bashrc中的PATH,然后source .bashrc,在另一个terminal可能并不会生效。
注意:某些操作可以出现在交互式shell,但是不能出现在非交互式shell(如shell脚本)中。具体可以查看shell命令解析过程的博客:(等待一个链接)
接下来几篇介绍:符号、shell脚本中基本语法、一些命令和shell命令解析过程。
其中符号的分类较多,先在这里给个目录:
符号:
1、后台进程:& 点击打开链接
2、I/O重定向:> < >> 2> 1> &1 点击打开链接
3、管道:| 点击打开链接
4、通配符: * ? [ ] [ ! ] [^ ] 点击打开链接
5、正则表达式与通配符: 点击打开链接
6、转义符号和转义字符:\ 点击打开链接
7、重复执行先前命令: ! 点击打开链接
8、单、双引号与反引号的区别: 点击打开链接
9、变量引用、替换、命令替换、内部变量:$ 点击打开链接
10、环境变量和shell内部变量: 点击打开链接
11、shell脚本的控制循环结构: 点击打开链接
12、命令解析过程: 点击打开链接
13、shell脚本的调试: 点击打开链接
命令:
1、test命令: 点击打开链接
2、数值计算命令: 点击打开链接
3、文件相关命令(开篇):
① 【文件操作1】文件查找工具:find: 点击打开链接
② 【文件操作2】文件内容检索工具:grep: 点击打开链接
③ 【文件操作3】文本内容抽取工具:awk: 点击打开链接
④ 【文件操作4】文本内容替换工具:sed: 点击打开链接
⑤ 【文件操作5】文本内容比较工具:diff
4、字符串相关命令: 点击打开链接
结课题目:
1、
2、
3、
4、
该shell系列的更新均以《Ubuntu Linux从入门到精通》(邢国庆 仇鹏涛 陈极珺等编著)这本书为基础
在大致了解了基本命令和shell脚本基本语法后,之后就是Linux的一些系统管理级命令,比如:磁盘监控与管理、网络监控与连接、CPU监控与优化、日志查找与系统维护……等等;再之后就是以Linux作为各种服务器的搭建与维护,比如:LMAP服务器、Mail服务器、Samba服务器、网络数据库、代理服务器、DNS服务器……等等;服务器当然就涉及到安全性方面,所以可以看看Linux渗透测试等内容。
在入门的基础上,可以选读一些其它的书,比如《Linux运维之道》丁明一编著 这本书,做为对Linux shell的一个补充。
然后《Linux宝典》.任雪莲 或者 《Linux系统运维》.曹江华,国晓平. 北京:电子工业出版社 这两本书之一
可以备一本类似《即用即查Linux命令行实例参考手册》—罗琳 编著的这种按功能分类,又比较全的指令集合,供用的时候查看。
进阶可以参考《鸟哥的Linux私房菜—服务器架设篇》(第2版). 鸟哥. 北京: 机械工业出版社,然后是《网络服务搭建、配置与管理大全: Linux版》.(第2版). 张栋, 张瑞生. 北京: 电子工业出版社
安全方面可以看看《Linux安全技术内幕》.李洋.北京:清华大学出版社 出版的书,以及《KailLinux&BackTrack渗透测试实战》. 赵涏元(韩). 金光爱译. 北京:人民邮电出版社 这两本书
以上都是基于命令行的,如果你想体验一下Ubuntu的桌面应用,以及一些偏生活化操作,可以参考《Ubuntu完美应用》. 何晓龙.(第3版). 北京:电子工业出版社
linux shell脚本的教程:点击打开链接,
linux中符号:点击打开链接、
网中人《shell十三问》:点击打开链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。