shell是UNIX/Linux系统的一个重要层次,它是用户与系统交互的界面;
1.shell 概述
1.1shell的特点和主要版本
特点:
- 对已有的命令进行组合;
- 提供文件名扩展字符;
- 可直接使用shell内置命令;
- 允许灵活地使用数据流;
- 程序模块结构化;
- 能在后台执行;
- 提供可配置环境;
- 提供一个高级命令语言;
种类:
- Bourne shell(sh)
- C shell(csh)
- Korn shell(ksh)
- Bourne Again shell(bash)
1.2 简单shell程序示范
#!/bin/bash
if test $#=0
then ls
else
for i
do
ls -l $i|grep `^d`
done
fi
1.1.3shell脚本的建立和执行
建立:编辑器(如vi);
执行:
- 输入定向到shell脚本;
$bash < 脚本名
- 以脚本名作为bash参数;
$ bash 脚本名 [参数]
特点:可在脚本名后带参数,从而将参数值传递给程序中的命令;(如函数的调用) - 将shell脚本的权限设置为可执行;
/*1.更改权限*/
$ sudo chmod 777 文件名
/*2.将该脚本所在目录添加到命令搜索路径(PATH)中*/
$ PATH=$PATH:
/*3.执行还文件*/
$ 文件名
2.命令历史
2.1 显示历史命令
语法:history [option][arg...]
- 不带参数
显示所有历史命令清单 - 带一个整数X
显示历史表中最后X行 - 带一个文件名X
将X作为历史文件名 - 常有选项
-a 在历史文件中添加“新”历史命令行;
-n 从历史文件中读取尚未读入的历史命令行,添加到当前历史清单中;
-r 读取历史文件的内容,并把它作为当前历史命令;
-w 把当前历史文件写到历史文件中,覆盖原有内容;
-c 删除历史清单中的所有项
2.2 执行历史命令
执行历史命令是命令替换方式之一,以“!”开头;
格式 | 意义 |
---|---|
!! | 重复上一条命令,也就是“!-1” |
!n | 重复执行第n条命令 |
!-n | 重新执行倒数第n条历史命令 |
!string | 重新执行以字符串“string”开头的最近的历史命令行 |
!?string? | 重新执行最近的、其中包含字符串string的那条历史命令 |
!# | 在现在为止所输入的整个命令行 |
2.3 配置历史命令环境
在默认方式下,bash使用用户主目录下的文件“.bash_history”来保存命令历史;
更改:$ HISTFILE="路径"
更改后则存放在该“路径”下;
历史文件保留的命令有限,其默认值为500;
更改:$ HISTSIZE=600
3.命令补全
Tab键
4.别名
4.1 定义别名
语法格式:alias [name[=value]]...
注:alias 后面没有指定参数——显示别名清单;
//例:
$alias ..='cd ..'//定义别名,需把代表内容有单引号括起
//注:赋值号"="两边不能有空格;
4.2 取消别名
语法格式:unalias name..
5.shell 特殊字符
5.1通配符
一般通配符
- *(星号)——匹配任意字符的0次或多次出现;
注:文件名前面的圆点(.)和路径名中的斜线(/)必须显式匹配;
例:“f*”可匹配“f,fa,f1等”
“*file” 不可匹配“.profile”,“.*file” 才可匹配“.profile”
“/ect*.c”不能匹配“/ect/”目录下有后缀“.c”的文件;
“/ect/*.c”可以; - ?(问号)——匹配任意一个字符;
- [字符组]——匹配该字符组所限定的任何一个字符;
- !(惊叹号)——否定
模式匹配
- *(模式表)——匹配给定模式表中0次或多次出现的模式;
- +(模式表)——匹配给定模式表中一次或多次出现的“模式”;
- ?(模式表)——匹配模式表中任何一种0次或1次出现的”模式“;
- @(模式表)——仅匹配模式表中给定一次出现的”模式“;
- !(模式表)——除给定模式表中的的一个模式外,它可以匹配其他任何东西;
5.2 引号
三种:单引号、双引号和倒引号;
a.双引号
由双引号括起来的字符均作为普通字符对待;(”$、`、\“除外)
- $ 变量替换
- ` 命令替换
- \ 转义字符(仅当其后接”$、`、“、\)
echo "current directory is `pwd`" //命令`倒引号
echo "home directory is $HOME"
echo "file*.?"
echo "directory '$HOME'"//变量倒引号
b.单引号
由单引号括起来的字符都作为普通字符出现;(特殊字符也失去原来的意义)
c.倒引号
带引号括起来的字符串被shell解析为命令行;在执行时先执行该命令行,并以结果代替括起部分;
//例
$today=`date`
$echo Today is $today
Today is 2017年 05月 14日 星期日 23:11:32 CST
倒引号还可以嵌套使用,嵌套使用时内层倒引号必须用反斜线(\)将其转义;
//例
$Nuser=`echo The number of users is \`who | wc -l\``
$echo $Nuser
The number of users is 1
补充:反斜线(\)是转义字符,能把特殊字符变成普通字符;
5.3 输入/输出重定向
执行shell文件,通常打开三个标准文件:标准输入文件(stdin)、标准输出文件(stdout)和标准出错输出文件(stderr);分别对应键盘、屏幕和屏幕终端;
a.输入重定向
输入重定向符“<”,作用:把命令(或可执行程序)的标准输入重新定向到指定文件;
形式:命令 < 文件名
b.输出重定向
输出重定向符”>”,作用:把命令(或可执行程序)的标准输出重新定向到指定文件;
注:
- 该命令输出不显示在屏幕上,而是写入文件中;
- 若多个命令的输出都定向同一个文件,那么只有最后输出结果保留在文件中;
- 若定向到不存在的文件上,将会创建一个新文件;
形式:命令 > 文件名
c.输出附加重定向
输出重定向符”>>”,作用:把命令(或可执行程序)的标准输出附加到指定文件的后面;(类似追加)
形式:命令 >> 文件名
d.即时文件定向符
即使文件:由重新定向符“<<”、一对标记符以及若干输入行组成;
形式:命令 [参数]<< 标记符
作用:把预先处理的固定信息放入即时文件中,由相应命令执行时立即读取;
e.与文件描述字有关的重定向
文件描述字:每一个文件“打开”系统自动赋予的;
所以,三个标准文件的文件描述符分别是
- 标准输入文件(stdin)——0
- 标准输出文件(stdout)——1
- 标准出错输出文件(stderr)——2