---------------------Shell简介------------------------------------------------------------------
shell可以看做是linux下的一个用户的命令行接口,说白了就是命令解释器
当我们输入一条命令时,shell会帮我们做很多操作
shell类似其他编程语言中具有元字符和预留关键字:
-------------------元字符&& 预留关键字-----------------------------------------------------
元字符: <> , | , : , ! , ? , * , $ , \ , ' , `, " , ~, [ ] , ( ) , { }
预留关键字: case , do , dome , elif , else , esac , for , fi , function , if , in , select , then , until , while
------------------通配函式-------------------------------------------------------------------------
就是对 * , ? , [ ]一系列通配符的应用
* : 匹配0或多个字符
?: 匹配单一字符
[list ]: 可以匹配列表中的一个个字符
[!list]: 可以匹配不存在于列表中的一个字符
{ string1 , string2 , string3 }: 可以匹配给出字符串中的一个
---------------.输入/输出定向--------------------------------------------------------------------
shell 中有三个默认的输入输出流
stdin : 标准的利用键盘输入
stdout:输出到终端
stderr : 将错误信息输出到终端
下面是一个改向的简单例子:
注意:
1.可以利用>>符号来添加文本,而不是改写
2.一条命令中可以包含多次改向
3.注意一种写法的区别:
cat > file1 2>&1 : 是将stdout 和stderr都输出到file1中
cat 2>&1 >file1 : 是将错误信息输出到/dev/<username> , 将stdout输入到file1中
------------------------管道-------------------------------------------------------------------------
管道: 多个指令组成的序列,每个指令之间用|隔开,叫做管道
管道其实就是一种两个命令的导致的输入和输出链接起来,也就是一个文件的输出可以作为另一个文件的读入
管道所做的工作有时候不仅仅是简单的传导,还可以通过过滤器做一些操作:
首先通过一个例子帮助和我一样的初学者熟悉过滤器:
首先引入一个命令 wc <filename> ( 如果不加的话则默认标准输入流):
一次输出文本的行数,单词数n和字节数
下面是它的几个常用的options:
-c : 输出文本中的字符数
-w : 输出文本中的单词数
-l : 输出文本中的行数
----------------我是一个例子-----------------------------------------------------------------
----------------我这个例子完了--------------------------------------------------------------
grep可以看做一个过滤器,具体操作在后面会有专门的解释
-----------------------并行输出----------------------------------------------------------------、
tee指令可以将输出内容并行输出到一个文件和标准输出流
-------------------命令的局部替代----------------------------------------------------------------
有两种方式:
一种是用<`>把要产生替换参数的命令括起来;( 这个符号不是单引号,看清楚)
第二种是用$( ) 把要产生替换参数的命令括起来。
可以把括起来的部分的最终结果放在此处直接替代
----------------------命令组----------------------------------------------------------------------
一,多条命令在同一行执行 ( 我觉得没什么用)
二,将多条命令变成一个命令组执行,用()和 { }都可以做到, 共享一个输入输出流,有两种方式:有一些区别和联系:
1. ( )里的每条命令间用<;>隔开,但最后一条命令后可以没有<;>,但 { } 中最后一个命令也必须有<;>,且第一条命令和<{>之间要有一个空格
2.括号内的重定向都不对括号外部产生影响
3.()是另开一个subshell执行,而 { } 就在当前shell下
---------------------shell变量---------------------------------------------------------------------
shell中的变量和其他编程语言的变量大同小异,只不过有以下几条规范:
1.一个变量是shell的一部分,一个变量的名字必须是独一无二的
2.变量的开头不能是一个数字
3.给变量赋值时要用以下格式,不能乱加空格:
$variable=value
调用变量的方式很简单 $<variableName> 的形式调用就可以了
有一个重要的关键字:export
用export 对变量进行操作,那么在之后的子进程或subshell中对变量进行修改,不会影响当前变量的值,在配置环境变量时能够体现出该关键字的作用
还有一些内部定义的标准shell变量,这些变量大部分都是由大写字母构成的,下面我们简单介绍几个常用的:
1. $: 当前的shell的PID
2.PATH:查找可执行文件时的路径
3.PWD:当前进行操作的目录
4.HOME: 用户的home目录
5.LANG:用户的语言
注意:
1.把内部定义的shell变量重写,往往会造成难以预期的后果
2.所以为了避免冲突,我们在定义shell变量时最好还是用小写字母比较好
------------------------命令的返回值-------------------------------------------------------------------
一个命令会给它的父亲进程返回一个值,通常来说,0代表成功,非0代表失败
$? :可以输出上一条命令的返回值
下面举一个例子来更直观的体现:
-----------------元字符的输出控制--------------------------------------------------------------
不是很好讲清楚,我就用一个例子来说明把
转义元字符
---------------------我是一个例子----------------------------------------------------------------
--------------------------我完了--------------------------------------------------------------------
转义非元字符: 基本和C++一样
\n 换行
\t tab ................................................
-------------------很有用的alias别名----------------------------------------------------------------
命名别名的方式:
unalias 是删除别名命名
alias单独出现是打印已经定义好的别名