bash(Bourne Again Shell),是一种命令解释器,类似于windows下的CMD,同时也是一门高级编程语言,作为命令你给解释器,他们通过提示符响应并处理用户在命令行上输入的命令。而作为一门编程语言,他们将处理存放在所谓shell脚本文件中的命令,(脚本就是用来处理多个shell命令的可执行文本).
shell基础:
初始化文件:当启动shell时候,他将运行初始化文件初始化自己。不用的shell有不同的初始化文件,一般用户只需要主目录下.bash_profile和bashrc文件。
添加PATH路径 PATH=$PATH:$路径名
更改PATH路径 export PATH=‘所要更改的内容’
重定向标准输出:默认情况下,shell将命令的标准输出发送到屏幕上。除非将标准输入与输出重定向。
文件描述符:0(标准输入)1(标准输出)2(标准错误输出)。 重定向符号为 > ,默认是 1>;< 默认是 0<
复制文件描述符:
leo@Leo-PC:/media/Leo/C$ cat x y 1>hold1 2>&1
leo@Leo-PC:/media/Leo/C$ cat hold1
cat: x: 没有那个文件或目录
this is y.
这里2>&1声明文件描述符2为文件描述符1的副本,这样做的结果是,标准输出和标准错误输出均被重定向到文件hold中。
shell脚本:
是包含shell可执行命令的文件。chmod是改变用户权限的命名,UGO是指user,group,other,文件有3种属性r,w,x.脚本必须是要可读的。
#开始一行注释。
命令分隔符有 ;,换行符,/,|,&
双引号括起来的字符串具有转义作用,单引号括起的不具有。
作业控制:
jobs,列出作业;fg,将作业移到前台运行;bg,将作业移到后台运行.
操作目录栈:
pushd,popd,dirs
参数和变量:
形式 变量名=值
leo@Leo-PC:/media/Leo/C$ leo=huixuejie
leo@Leo-PC:/media/Leo/C$ echo leo
leo
leo@Leo-PC:/media/Leo/C$ echo $leo
huixuejie
变量属性:1.readonly 使变量值不可改变
2.declare和peset:为变量赋予属性。
-a 声明一个数组变量
-f 声明一个函数变量
-i 声明一个整形变量
-r 声明变量为只读,也可用readonly
-x 输出变量(设置为全局变量),也可用export
3. unset 删除变量
特殊字符:
进程:是指命令在Linux上的执行,永和登录启动的shell与其他一样,也是一条命令或者一个进程。
进程结构:类似于文件结构,它可以是一个层次似的机构,有父进程,子进程,根进程。fork(创建)进程。
进程编号:每个进程开始的时候,linux为其分配一个唯一的PID(process identification),PPID为父进程。
命令历史机制:历史机制是一项对C shell的改造功能。它维护了最近发出的命令行的列表。~
重新执行和编辑命令:三种方式
1.fc 命令:显示,编辑和重新执行命令
fc -l 显示最近出现的16个命令。后面可以带参数[first][last],表示从first开始last结束匹配的命令。
fc [-e editor][first][last]可以用来编辑和重新执行前面的命令。
fc -s 不调用编译而重新执行命令
2.使用感叹号(!):
!!:前一个命令
!n:历史列表中编号为n的命令
!-n:往前第n条命令
!string:最近以string开头的命令行。
字符标志有:
n 第n个字
^ 第1个字(字的编号以0开始)
$ 最后一个字
m-n m到n的所有字
n* n代最后之间的所有字
* 除命令以外的所有字
% 最近的匹配?string?搜索的那个字
修饰符:有时候需要改变正要重新执行的实践的某个方面,可以在字符标志后面或者实践标志符后面放置一个或者多个修饰符,每个修饰符前面必须有一个:号。
替换的语法是[g]s/old/new/
添加g表示全局替换。
快速替换:^old^new^
其他修饰符:
e(extension) 删掉除文件名扩展名之外的所有内容
h(head) 删除路径名的最后部分
p(print-not) 显示命令,但是不要执行
q(quote) 引用该替换,以防止对其进行进一步的替换
r(root) 删除文件扩展名
t(tail) 删除路径名中除末尾之外的所有元素
x 去q类似,除了单独引用替换中的每个字
3.Readline库
bath的命令行编辑功能通过Readline库实现,任何C语言编写的应用程序都可以使用这个库。
编辑模式有2种,vi模式,emacs模式。默认是emacs模式
emacs模式:不必在命令模式和输入模式切换.
ctrl+B 向后移动一个字符
ctrl+F 向前移动一个字符,可以在移动前面加上数字,但需要先键入ESC
ctrl+A 跳到行首
ctrl+E 跳到行尾
ctrl+D 可以删除一个字符
ctrl+K 可以删除光标到行末的所有字符
ESC+b/f 向后向前移动一个字
别名:是一种名称(通常短小),shell将其翻译成另一个(通常较长的)名字或者(复杂的)命令.
alias,unalias ,别名中双引号括起的部分,会被展开,单引号括起的部分不会被展开。
函数:shell函数类似shell脚本,里面存放了一系列可在后期执行的命令。因为shell将函数存放在物理内存(RAM)而不是磁盘文件中,所以shell访问函数的速度要比访问脚本的速度快很多。
声明语法:
[function]function-name()
{
commands
}
其中,function-name是为调用该函数使用的函数名,commands由调用函数是将要执行的命令组成。
例如$function whoson()
>{
>date
>echo "User currently Logged On"
>who
>}
显示日期,一条标题,和一个正在使用该系统的用户列表
若希望函数总是可以,不必要每次输入,则可以将函数放入初始化文件~/.bash_profile中
bash的特性和选项:
命令行选项:
表8-12 命令行选项
选 项 | 解 释 | 语 法 |
help | 显示用法信息 | --help |
no edit | 阻止用户在交互式shell中使用Readline库编辑命令行 | --noediting |
no profile | 阻止读取初始化文件/etc/profile、~/.bash_profile、~/.bash_login和~/.profile | --noprofile |
no rc | 阻止读取~/.bashrc初始化文件;如果shell以sh调用的话,这个选项默认是打开的 | --norc |
POSIX | 在POSIX模式下运行bash | --posix |
version | 显示bash版本信息并退出 | --version |
login | 使bash像登录shell一样运行 | -l(小写l) |
shopt | 带上shopt选项opt运行shell;-O(大写O)设置该选项,+O删除该设置 | [+-]O [opt] |
end of options | 在命令行中发信号表示选项结束;后面的字将作为参数,即使它们以连字符(-)开头 | -- |
shell特性:
表8-13 bash特性
特 性 | 描 述 | 语 法 | 备 用 语法 |
allexport | 在执行这条命令之后自动输出用户创建的所有变量和函数 | set -o allexport | set -a |
braceexpand | 使bash执行花括号扩展(默认) | set -o braceexpand | set -B |
cdspell | 纠正传递给cd的参数中目录名中小的拼写错误 | shopt -s cdspell |
|
cmdhist | 保存一个多行命令中的所有文本行,如果需要将添加分号 | shopt -s cmdhist |
|
dotglob | 使模糊文件引用中的shell特殊字符(通配符)来匹配以句号(.)开头的文件名;默认情况下,这些特殊字符并不匹配开头的句号;必须总要显式地指定文件名.和..,因为没有模式曾匹配它们 | shopt -s dotglob |
|
emacs | 为命令行编辑指定emacs模式(默认) | set -o emacs |
|
errexit | 使bash在遇到简单的命令失败(而不是控制结构)时退出 | set -o errexit | set -e |
execfail | 使shell脚本在找不到exec参数所指的文件时继续运行;默认情况下,当exec找不到其参数指定的文件时,脚本将终止 | shopt -s execfail |
|
(续表)
特 性 | 描 述 | 语 法 | 备 用 语法 |
expand_aliases | 使别名扩展(默认情况下,对于交互式shell是开启的,而对于非交互式shell是关闭的) | shopt -s expand_alias |
|
hashall | 使bash记住它使用PATH找到的命令的位置 | set -o hashall | set -h |
histappend | 在shell退出时,使bash把历史列表追加到HISTFILE命令的文件后面;默认情况下,bash会覆盖掉这个文件 | shopt -s histappend |
|
histexpend | 使历史机制(使用感叹号)工作(默认);关闭这个特性将关闭历史扩展 | set -o histexpand | set -H |
history | 开启命令历史特性(默认情况下是开启的) | set -o history |
|
ignoreeof | 指定bash接收到10次EOF字符之后才能退出;在信号不好的链路上很有用 | set -o ignoreeof |
|
monitor | 启用作业控制(默认启用) | set -o monitor | set -m |
nocaseglob | 使模糊文件引用匹配文件名而不区分大小写(默认关闭) | shopt -s nocastglob |
|
noclobber | 帮助阻止文件覆盖(默认关闭) | set -o noclobber | set -C |
noglob | 关闭路径名扩展(默认关闭) | set -o noglob | set -f |
notify | 如果启用了作业控制,将立即报告后台作业的终结状态;默认行为是在显示下一个提示符之前显示该状态 | set -o notify | set -b |
nounset | 当在交互式shell中使用未设置变量时,将显示一条错误消息并退出shell脚本 | set -o unset | set –u |
nullglob | 使bask扩展模糊文件引用,这些模糊文件引用不能将文件名与一个空字符相匹配。默认情况下,bash无需扩展这些文件引用就可以传递它们 | shopt-s nullglob |
|
posix | 以POSIX模式返回bash | set-o posix |
|
verbose | 当bask读取命令行时显示这些命令行 | set-o verbose | set-v |
vi | 为命令行的编辑指定vi编辑模式 | set-o vi |
|
xpg_echo | 使内置命令cd在无需-e选项的情况下扩展反斜线转义序列 | shopt –s xpg_echo |
|
xtrace | 启用shell调试功能 | set-o xtrace | set-x |
打开和关闭shell特性:set -o/+o
shopt -s/-u 若用shopt更改set设置,则需要包含-o选项
处理命令行:命令行展开:
1.花括号展开:将花括号中以逗号隔开的字符串展开为一空格分隔的字符串列表。
2.带字符展开:带字符(~)
3.参数展开和变量展开:后面没有开放的美元符号$将引入参数或者变量展开
4.算数展开:$((expression))
5.命令替换:是用命令的输出来替换该命令
6.分词:参数和变量展开,命令替换和算数展开的结果都可以作为分词的候选者。
7.路径名展开。
8.进程替换