# 1、什么是shell?

​ 是一个程序,接受从键盘输入的指令,然后把命令传递给操作系统去执行。bash指的是"Bourne Again SHell"的简称。bash是最初UNIX上由SteveBourne写成shell程序sh的增强版。

提示符的最后一个字母如果是#,则表示这个终端有超级管理员权限(以root用户的身份登入)$表示一般管理员。

//一些简单命令
date 令显示系统当前时间和日期。
cal 默认显示当前月份的日历
df 查看磁盘剩余空间的数量
free 显示空闲内存的数
exit 结束终端会话
1
2
3
4
5
6

# 2、文件系统的操作

linux只有一个单一的文件系统树,意味着就只有一个盘符。

pwd 打印当前工作目录名
cd  /usr/bin 更改目录
ls 列出目录内容
ls -a  可以列出以*.*开头的隐藏文件。
ls /usr 列出指定文件夹下的所有目录内容。
file picture.jpg 确定文件类型,打印出文件内容的简单描述。
less 1.html 浏览文件内容 按住'q'键退出less程序
1
2
3
4
5
6
7
  • 绝对路径。开始于根目录,紧跟着目录树的一个个分支,一直到达所期望的目录或文件。cd /usr/bin表示进入到/usr/bin目录。

  • 相对路径。开始于当前工作目录。符号.表示当前工作目录,但是在几乎所有的情况下,都可以省略./..表示工作目录的父目录。

1、ls 的乐趣

ls /usr 指定列出内容的目录
ls ~ /usr 列出多个指定目录的内容
ls -l 以长模式输出目录
ls -lt 按文件修改时间的先后排序且按长格式输出
ls -lt --reverse 按文件修改时间的先后排序且按长格式,并且按照相反的方式输出。
ls -l dir2 //查看dir2文件夹的内容
1
2
3
4
5
6

ls命令一些常用的选项如下:

选项 长选项 描述
-a --all 列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的隐藏文件。
-d --directory 通常,如果指定了目录名,ls 命令会列出这个目录中的内容,而不是目录本身。 把这个选项与 -l 选项结合使用,可以看到所指定目录的详细信息,而不是目录中的内容。
-F --classify 这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是 目 录名,则会加上一个'/'字符。
-h --human-readabl e 当以长格式列出时,以人们可读的格式,而不是以字节数来显示文件的大小。
-l 以长格式显示结果。
-r --reverse 以相反的顺序来显示结果。通常,ls 命令的输出结果按照字母升序排列。
-S 命令输出结果按照文件大小来排序。
-t 按照修改时间来排序。

ls -l长格式列表的字段表示的意思。

字段 含义
-rw-r--r-- 对于文件的访问权限。第一个字符指明文件类型。在不同类型之间, 开头的“-”说明 是一个普通文件,“d”表明是一个目录。其后三个字符是文件所有者的 访问权限,再其 后的三个字符是文件所属组中成员的访问权限,最后三个字符是其他所 有人的访问权 限。这个字段的完整含义将在第十章讨论。
1 文件的硬链接数目。参考随后讨论的关于链接的内容。
root 文件属主的用户名。
root 文件所属用户组的名字。
32059 以字节数表示的文件大小。
2007-04-03 11:05 上次修改文件的时间和日期。
oo-cd-cover.odf 文件名

2、less命令

​ 可以用less命令来浏览文件内容。下面是less程序常用的键盘命令。

命令 行为
Page UP or b 向上翻滚一页
Page Down or space 向下翻滚一页
UP Arrow 向上翻滚一行
Down Arrow 向下翻滚一行
G 移动到最后一行
1G or g 移动到开头一行
/charaters 向前查找指定的字符串
n 向前查找下一个出现的字符串,这个字符串是之前所指定查找的
h 显示帮助屏幕,按q退出
q 退出 less 程序

3、linux系统中的目录介绍

目录 描述
/ 根目录
/boot 包含 Linux 内核,最初的 RMA 磁盘映像(系统启动时,由驱动程序所需,和 启动加载程序。
有趣的文件:
• /boot/grub/grub.conf or menu.lst, 被用来配置启动加载程序。
• /boot/vmlinuz,Linux 内核。
/dev 这是一个包含设备结点的特殊目录。“一切都是文件”,也使用于设备。 在这个目录里,内核维护着它 支持的设备
/etc **这个目录包含所有系统层面的配置文件。**它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会运行每个系统服务。这个目录中的任何文件应该是可读的文本文 件。
• /etc/crontab, 定义自动运行的任务。
• /etc/fstab,包含存储设备的列表,以及与他们相关的挂载点。
• /etc/passwd,包含用户帐号列表
/home **在通常的配置环境下,系统会在/home 下,给每个用户分配一个目录。**普通用户只能在他们自己的目录下创建文件。这个限制保护系统免受错误的用户活动破坏。
/lib **包含核心系统程序所需的库文件。**这些文件与 Windows 中的动态链接库相似。
/los t+fou nd 每个使用 Linux 文件系统的格式化分区或设备,例如 ext3文件系统, 都会有这个目录。当部分恢复一 个损坏的文件系统时,会用到这个目录。除非文件系统 真正的损坏了,那么这个目录会是个空目录。
/media 在现在的 Linux 系统中,/media 目录会包含可移除媒体设备的挂载点, 例如 USB 驱动器,CD-RO Ms 等等。这些设备连接到计算机之后,会自动地挂载到这个目录结点下。
/mnt 在早些的 Linux 系统中,/mnt 目录包含可移除设备的挂载点。
/opt 这个/opt 目录被用来安装"可选的"软件。这个主要用来存储可能 安装在系统中的商业软件产品。
/proc 这个/proc 目录很特殊。从存储在硬盘上的文件的意义上说,它不是真正的文件系统。 反而,它是一个 由 Linux 内核维护的虚拟文件系统。它所包含的文件是内核的窥视孔。这些文件是可读的, 它们会告诉 你内核是怎样监管计算机的。
/root root用户的根目录
/sbin 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留。
/tmp **是用来存储由各种程序创建的临时文件的地方。**一些配置,导致系统每次重新启动 时,都会清空这个目录。
/usr 在 Linux 系统中,/usr 目录可能是最大的一个。它包含普通用户所需要的所有程序和文件。
/usr/bin 包含系统安装的可执行程序
/usr/lib 包含由/usr/bin 目录中的程序所用的共享库
/usr/l ocal 这个/usr/local 目录,是非系统发行版自带,却打算让系统使用的程序的安装目录。 **通常,由源码编译的程序会安装在/usr/local/bin 目录下。**新安装的 Linux 系统中,会存在这个目录, 但却是空目录,直到系统管理员放些东西到它里面。
/usr/s bin 包含许多系统管理程序
/usr/s hare /usr/share 目录包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件,图 标,桌面背景,音频文件等等。
/usr/s hare/ doc 大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分 类的文档。
/var 除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录是可能需要改动的文件存储的地方。各种数据库,假脱机文件, 用户邮件等等,都驻扎在 这里。
/var/l og 这个/var/log 目录包含日志文件,各种系统活动的记录。这些文件非常重要,并且应该时时监测它 们。其中最重要的一个文件是/var/log/messages。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件。

4、操作文件和目录

  • mkdir 创建目录

    mkdir directory... //三个原点意味着该参数可以重复
    mkdir dir1 dir2 dir3 //创建三个目录 
    mkdir -p test/dir //-p 能保证在test文件夹不存在情况下也能创建dir文件夹
    
    1
    2
    3
  • cd 更改目录

    cd			更改工作目录到根目录。
    cd ~  		更改工作目录到根目录。
    cd .. 		返回上一级目录
    cd ../..	返回上两级目录
    cd - 		更改目录到先前工作目录。
    cd /		进入更目录
    cd -user	更改目录到当前根目录。例如cd -james表示更改工作目录到用户james的根目录。
    
    1
    2
    3
    4
    5
    6
    7
  • cp 复制文件和目录

    cp item1 item2//复制单个文件或目录item1到文件或目录item2
    cp item... directory //复制多个项目(文件或目录)到一个目录下。
    
    1
    2

    下面是cp命令的一些有用的选项

    选型 意义
    -a,--archive 复制文件和目录,以及它们的属性,包括所有权和权限。 通常,复本具有用户所操 作文件的默认属性。
    -i, --interactive 在重写已存在文件之前,提示用户确认。如果这个选项不指定, cp 命令会默认重 写文件。
    -r,--recursive 递归地复制目录及目录中的内容。当复制目录时, 需要这个选项(或者-a 选 项)。
    -u, --update 当把文件从一个目录复制到另一个目录时,仅复制 目标目录中不存在的文件,或者 是文件内容新于目标目录中已经存在的文件。
    -v, --verbose 显示翔实的命令操作信息
    命令 运行结果
    cp file1 file2 复制文件 file1 内容到文件 file2。如果 file2 已经存在, file2 的内容会被 file1 的内 容重写。如果 file2 不存在,则会创建 file2。
    cp -i file1 file2 这条命令和上面的命令一样,除了如果文件 file2 存在的话,在文件 file2 被重写之 前, 会提示用户确认信息。
    cp file1 file2 dir1 复制文件 file1 和文件 file2 到目录 dir1。目录 dir1 必须存在。
    cp dir1/* dir2 使用一个通配符,在目录 dir1 中的所有文件都被复制到目录 dir2 中。 dir2 必须已 经存在。
    cp -r dir1 dir2 复制目录 dir1 中的内容到目录 dir2。如果目录 dir2 不存在, 创建目录 dir2,操作 完成后,目录 dir2 中的内容和 dir1 中的一样。 如果目录 dir2 存在,则目录 dir1 (和目录中的内容)将会被复制到 dir2 中。
  • mv 移动和重命名文件

    mv item1 item2 //把文件或目录 “item1” 移动或重命名为 “item2”
    mv item... directory //把一个或多个条目从一个目录移动到另一个目录中。
    
    1
    2
    选项 意义
    -i --interactive 在重写一个已经存在的文件之前,提示用户确认信息。 如果不指定这个选项,mv 如果不指定这个选项,mv 命令会默认重写文件内容。
    -u --update 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新 于目标目录相对应文件的内容。
    -v --verbose 当操作 mv 命令时,显示翔实的操作信息。
    命令 运行结果
    mv file1 file2 移动 file1 到 file2。如果 file2 存在,它的内容会被 file1 的内容重写。 如果 file2 存在,它的内容会被 file1 的内容重写。 如果 file2 不 存在,则创建 file2。 每种情况下,file1 不再存在。
    mv -i file1 file2 除了如果 file2 存在的话,在 file2 被重写之前,用户会得到 提示信息外,这个和上 面的选项一样。
    mv file1 file2 dir1 移动 file1 和 file2 到目录 dir1 中。dir1 必须已经存在。
    mv dir1 dir2 如果目录 dir2 不存在,创建目录 dir2,并且移动目录 dir1 的内容到 目录 dir2 中,同时删除目录 dir1。如果目录 dir2 存在,移动目录 dir1(及它的内容)到目录 dir2。
  • rm 删除文件和目录

    rm item...//删除一个或多个文件或目录
    
    1
    选项 意义
    -i, --interactive 在删除已存在的文件前,提示用户确认信息。 如果不指定这个选项,rm 会默默地 如果不指定这个选项,rm 会默默地 删除文件 删除文件
    -r, --recursive 递归地删除文件,这意味着,如果要删除一个目录,而此目录 又包含子目录,那么 子目录也会被删除。要删除一个目录,必须指定这个选项。
    -f, --force 忽视不存在的文件,不显示提示信息。这选项颠覆了“--interactive”选项。
    -v, --verbose 在执行 rm 命令时,显示翔实的操作信息。
    命令 运行结果
    rm file1 默默地删除文件
    rm -i file1 除了在删除文件之前,提示用户确认信息之外,和上面的命令作用一样。
    rm -r file1 dir1 删除文件 file1, 目录 dir1,及 dir1 中的内容。
    rm -rf file1 dir1 同上,除了如果文件 file1,或目录 dir1 不存在的话,rm 仍会继续执行。
  • ln 创建连接

    ln file link //创建硬链接
    ln -s item link //创建符号链接,item可以是文件或者目录。
    
    1
    2

    1)硬链接

    ​ 一个硬链接和文件本身没有区别。当一个硬链接被删除时,这个链接 被删除,但是文件本身的内容仍然存在(这是说,它所占的磁盘空间不会被重新分配), 直到所有关联这个文件的链接都删除掉。

    硬链接的局限性

    • 一个硬链接不能关联它所在文件系统之外的文件。这是说一个链接不能关联与链接本身不在同一个磁盘分区上的文件。
    • 一个硬链接不能关联一个目录。只能关联文件。

    2)符号链接

    ln -s ../fun dir2/fun-sym //fun是跟dir2同级的.
    
    1

    ​ 创建符号链接是为了克服硬链接的局限性。符号链接生效,是通过创建一个 特殊类型的文件,这个文件包含一个关联文件或目录的文本指针。

    ​ 一个符号链接指向一个文件,而且这个符号链接本身与其它的符号链接几乎没有区别。

    当你删除一个符号链接时,只有这个链接被删除,而不是文件自身。如果先于符号链接 删除文件,这个链接仍然存在,但是不指向任何东西。这个链接被称为 坏链接。ls 命令会以红色,来显示坏连接的存在。

5、通配符

通配符 意义
[[:class:]] 匹配任意一个属于指定字符类中的字符
[!characters] 匹配任意一个不是字符集中的字符
[characters] 匹配任意一个属于字符集中的字符
? 匹配任意一个字符(不包括零个)
* 匹配任意多个字符(包括零个或一个)
字符类 意义
[:alnum:] 匹配任意一个字母或数字
[:alpha:] 匹配任意一个字母
[:digit:] 匹配任意一个数字
[:lower:] 匹配任意一个小写字母
[:upper 匹配任意一个大写字母
模式 匹配对象
* 所有文件
g* 文件名以“g”开头的文件
b*.txt 以"b"开头,中间有零个或任意多个字符,并以".txt"结尾的文件
Data??? 以“Data”开头,其后紧接着3个字符的文件
[abc]* 文件名以"a","b",或"c"开头的文件
BACKUP.[0-9][0-9][0-9] 以"BACKUP."开头,并紧接着3个数字的文件
[[:upper:]]* 以大写字母开头的文件
[![:digit:]] 不以数字开头的文件
*[[:lower:]123] 文件名以小写字母结尾,或以 “1”,“2”,或 “3” 结尾的文件

# 3、常见基本命令

• type – 说明怎样解释一个命令名
• which – 显示会执行哪个可执行程序
• man – 显示命令手册页
• apropos – 显示一系列适合的命令
• info – 显示命令 info
• whatis – 显示一个命令的简洁描述
• alias – 创建命令别名
1
2
3
4
5
6
7

1、type - 显示命令的类型

​ type 命令是 shell 内部命令,它会显示命令的类别,给出一个特定的命令名(做为参数)。常用于测试command是否是一个命令。

type command //"command"是你要检测的命令名
1

2、which - 显示一个可执行程序的位置

​ 了确定所给定的执行程序的准确位置,使用 which 命令。**这个命令只对可执行程序有效,不包括内部命令和命令别名,别名是真正的可执行程序的替代物。 **

which ls //alias ls='ls --color=auto'
        /usr/bin/ls
which cd  //usr/bin/cd
1
2
3

3、help - 得到 shell 内部命令的帮助文档

help cd//显示cd命令的帮助文档
1

4、--help - 显示用法信息

 mkdir --help 
1

5、man - 显示程序手册页

man program //“program”是要浏览的命令名。
1

6、apropos - 显示适当的命令

​ 也有可能搜索参考手册列表,基于某个关键字的匹配项。虽然很粗糙但有时很有用。 下面是一个以"cd"为关 键词来搜索参考手册的例子:

apropos cd 
//输出结果如下
cd (1)               - bash built-in commands, see bash(1)
perlebcdic (1)       - Considerations for running Perl on EBCDIC platforms
rsyncd.conf (5)      - configuration file for rsync in daemon mode
Unicode::UCD (3pm)   - Unicode character database
utf8 (3pm)           - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) i...
//输出结果每行的第一个字段是手册页的名字,第二个字段展示章节

1
2
3
4
5
6
7
8
9

7、whatis - 显示非常简洁的命令说明

[root@etwetrwet ~]# whatis cd
cd (1)    - bash built-in commands, see bash(1)

1
2
3

8、info - 显示程序 Info 条目

​ 输入"info",接着输入程序名称,启动 info。

info coreutils
//将会显示一个包含超级链接的手册页,这些超级链接指向包含在 coreutils 包中的各个程序。

1
2
3
命令 行为
? 显示命令帮助
PgUp or Backspace 显示上一页
PgDn or Spac 显示下一页
n 下一个 - 显示下一个结点
p 上一个 - 显示上一个结点
u Up - 显示当前所显示结点的父结点,通常是个菜单
Enter 激活光标位置下的超级链接
q 退出

9、用别名(alias)创建你自己的命令

​ 可以将多个命令放在同一行上。

cd /usr; ls; cd -
//首先更改目录到/usr,然后列出目录 内容,最后回到原始目录(用命令"cd ~"),结束在开始的地方

1
2
3

​ 创建命令别名

alias name='string'
alias foo='cd /usr; ls; cd -'
//删除别名
unalias foo 
//要查看所有定义在系统环境中的别名
alias

1
2
3
4
5
6
7

# 4、重定向

I/O重定向。I-input输入。O-output输出。I/O 重定向允许我们可以更改输出走向和输入来向。一般地,输出送到屏幕,输入来自键盘, 但是通过 I/O 重定向,我们可以改变输入输出方向。

• cat - 连接文件
• sort - 排序文本行
• uniq - 报道或省略重复行
• grep - 打印匹配行
• wc - 打印文件中换行符,字,和字节个数
• head - 输出文件第一部分
• tail - 输出文件最后一部分

1
2
3
4
5
6
7
8

1、标准输入,输出,和错误

​ 默认情况下,标准输出和标准错误都连接到屏幕,而不是 保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下,标准输入连接到键盘

stdout  //标准输出
stderr  //标准错误
stdin  //标准输入

1
2
3
4

2、重定向标准输出

使用 ">" 重定向符,其后跟着文件名,将标准输出到文件名所在的文件里。

使用">>"操作符,将导致输出结果添加到文件内容之后。如果文件不存在,文件会 被创建,就如使用了">"操作符。

ls -l /usr/bin > ls-output.txt // 把 ls 命令的运行结果输送到文件 ls-output.txt 中去, 由文件代替屏幕。
>output.txt  //要删除一个文件的内容(或者创建一个新的空文件)
 ls -l /usr/bin >> ls-output.txt //向ls-output.txt文件追加内容。

1
2
3
4

3、重定向标准错误

​ 重定向标准错误缺乏专用的重定向操作符。把这些文件流的前三个看作标准输入,输出和错误,shell内部参考它们为文件描述符0,1和2,各自地。shell 提供 了一种表示法来重定向文件,使用文件描述符。因为标准错误和文件描述符2一样,我们用这种 表示法来重定向标准错误。**

ls -l /bin/usr 2> ls-error.txt  //执行重定向标准错误到文件 ls-error.txt 任务。

1
2

4、重定向标准输出和错误到同一个文件

​ 第一种方法。完成两个重定向。首先重定向标准输出到文件 ls-output.txt,然后重定向文件描述符2(标

准错误)到文件描述符1(标准输出)使用表示法2>&1。

ls -l /bin/usr > ls-output.txt 2>&1//重定向标准错误到屏幕
ls -l /bin/usr 2>&1 >ls-output.txt //重定向标准错误到屏幕

1
2
3

​ 第二种方法。

ls -l /bin/usr &> ls-output.txt	//

1
2

5、处理不需要的输出

​ 一个特殊的叫做/dev/null的文件。这个文件是系统设备,叫做位存储桶,它可以 接受输入,并且对输入不做任何处理。

ls -l /bin/usr 2> /dev/null

1
2

下面是重定向标准输入的一些指令

6、cat - 连接文件

​ cat 命令读取一个或多个文件,然后复制它们到标准输出。可以使用 cat 来显示文件而没有分页。可以使用cat来创建简短的文本文件。

cat //如果 cat 没有给出任何参数,它会从标准输入读入数据,因为标准输入,默认情况下,连接到键盘。 它正在等待我们输入数据。
//由于文件名参数的缺席,cat 复制标准输入到标准输出,所以我们看到文本行重复出现。 我们可以使用这种行为
来创建简短的文本文件。
1、cat > 1.txt //新建并打开1.txt
2、kjfklsgljlhdfhfj //往1.txt文件里输入文本。
3、ctrl+d //第一次输入达到文件末尾。再次输入就退出输入。
通过上面三步我们创建了1.txt文件,并在文件里输入了`kjfklsgljlhdfhfj`
cat —A foo.txt //-A选项,表示将在foo.txt文件中显示非打印字符(如tab键)
cat -ns foo.txt //-你表示显示行号,-s表示禁止输出多个空白行

1
2
3
4
5
6
7
8
9
10

7、管道线

​ 命令可以从标准输入读取数据,然后再把数据输送到标准输出,命令的这种能力被 一个 shell 特性所利用,这个特性叫做管道线。使用管道操作符"|"(竖杠),一个命令的标准输出可以管道到另一个命令的标准输入

 ls -l /usr/bin | less

1
2

8、过滤器

​ 管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。 通常,以这种方式使用的命令被称为过滤器。

ls /bin /usr/bin | sort | less
//把目录/bin 和/usr/bin 中 的可执行程序都联合在一起,再把它们排序,然后浏览执行结果:

1
2
3

9、uniq - 报道或忽略重复行

​ uniq 只会删除相邻的重复行**。uniq 命令经常和 sort 命令结合在一起使用。uniq 从标准输入或单个文件名参数接受数据有序 列表(详情查看 uniq 手册页),默认情况下,从数据列表中删除任何重复行。**

ls /bin /usr/bin | sort | uniq | less
//使用 uniq 从 sort 命令的输出结果中,来删除任何重复行。如果我们想看到 重复的数据列表,让 uniq 命令带上"-d"选项
ls /bin /usr/bin | sort | uniq -d | less

1
2
3
4
选项 说明 说明
-c 输出所有的重复行,并且每行开头显示重复的次数。
-d 只输出重复行,而不是特有的文本行。
-f n 忽略每行开头的 n 个字段,字段之间由空格分隔,正如 sort 程序中的空格分隔 符;然而, 不同于 sort 程序,uniq 没有选项来设置备用的字段分隔符。
-i 在比较文本行的时候忽略大小写。
-s n 在比较文本行的时候忽略大小写。
-u 只是输出独有的文本行。这是默认的。

10、wc - 打印行,字和字节数

wc 1.txt 
2 2 9 1.txt  //行数,单词数和字节数

1
2
3

11、grep - 打印匹配行

​ 用来找到文件中的匹配文本。grep 有-对方便的选项:"-i"导致 grep 忽略大小写当执行搜索时(通常,搜索是大小写 敏感的),"-v"选项会告诉 grep 只打印不匹配的行。

grep pattern [file...]

1
2

12、head / tail - 打印文件开头部分/结尾部分

//输出output.txt的前5行
head -n 5 output.txt 
//输出output.txt的最后5行
tail -n 5 ls-output.txt 
//管道线
ls /usr/bin | tail -n 5 
//添加-f选项实时浏览文件,按下ctrl+c退出
tail -f /var/log/messages 

1
2
3
4
5
6
7
8
9

13、tee - 从 Stdin 读取数据,并同时输出到 Stdout 和文件

​ tee 程序从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动)和一个

或多个文件。

ls /usr/bin | tee ls.txt | grep zip 
//读取ls /usr/bin里的内容,然后输出到ls.txt中,再通过grep过滤

1
2
3

# 5、echo操作符

1、字符展开

echo在标准输出中打印出它的文本参数。

echo twetertyy
//twetertyy
echo * //展示当前文件夹下所有的文件或文件夹的名字

1
2
3
4

​ echo的参数详解:

echo -e "\nfile type" //-e激活转义字符。\n换行
echo -n "agsdfgsfhh" ///-n 不换行输出

1
2
3

2、路径名展开

​ 上面的那种*通配符工作机制就叫做路径名展开。echo *ls的密令的功能很像

echo D* //显示当前文件夹下以D开头的文件或文件夹的名字
echo [[:upper:]]* //显示当前文件夹下以大写字母开头的文件名或文件夹的名字
echo /usr/*/share //查看当前目录之外的目录

1
2
3
4

3、波浪线展开

 echo ~ //没有指定用户名时,显示当前用户的根目录
 echo ~foo //如果有foo用户,则显示该用户的根目录,否则打印~foo

1
2
3

4、算术表达式展开

​ 使用$((expression))来展开算术表达式。expression由数值和算术操作符组成。算术表达式只支持整数。

echo $((3*3))//9
echo $(((3***3)/4)) //6

1
2
3

5、花括号展开

//花括号包含右逗号分开的字符串列表
echo {1,2} //1,2
//花括号包含两个省略号
echo {1..3}//1,2,3
//花括号嵌套
echo a{A{1,2},B{3,4}}b //aA1b aA2b aB3b aB4b
//使用花括号创建大量文件夹
mkdir {2017..2019}dir //20017dir 2018dir 2019dir

1
2
3
4
5
6
7
8
9

6、参数展开

$变量名可以取出系统中的内置变量。printenvl可以查看系统中的所有变量。

echo $USER //root
printenv //查看变量列表

1
2
3

7、命令替换

​ 们把一个命令的输出作为一个展开模式来使用

echo $(ls) 
ls -l $(which cp) 

1
2
3

8、引用

 echo The total is $100.00 //The total is 00.0 引用系统中的变量$1,$1不存在,所以输出0。

1
2

9、双引号、单引号、转义字符

​ 把文本放在双引号("")中, shell 使用的特殊字符,除了 $,\ (反斜杠),和 `(倒引号)之外, 则失去它们的特殊含义,被当作普通字符来看待。这意味着单词分割,路径名展开, 波浪线展开和花括号展开都被禁止,然而参数展开,算术展开和命令替换仍然执行。

//单词分割被禁止
 echo "this is a    test" //this is a    test

1
2
3

单引号会禁用所有的展开。在字符之前加上一个反斜杠\,在这个上下文中叫做转义字符。

# 6、键盘高级操作技巧

1、移动光标

按键 功能
Ctrl+a 移动光标到行首。
Ctrl+e 移动光标到行尾
Ctrl+f 光标前移一个字符;和右箭头作用一样。
Ctrl+b 光标后移一个字符;和左箭头作用一样。
Ctrl+l 清空屏幕,移动光标到左上角。clear 命令完成同样的工作。

2、修改文本

按键 功能
Ctrl+d 删除光标处的字符。跟delete键的功能一样。
Ctrl+t 光标位置的字符和光标前面的字符互换位置。
Alt-u 把从光标位置到字尾的字符转换成大写字母。
Alt-l 把从光标位置到字尾的字符转换成小写字母

3、剪切和粘贴文本

按键 功能
Ctrl-k 剪切从光标位置到行尾的文本。
Ctrl-u 剪切从光标位置到行首的文本。
Alt-d 剪切从光标位置到词尾的文本。
Alt-Backspace 剪切从光标位置到词头的文本。如果光标在一个单词的开头,剪切前一个单词。
Ctrl-y 把剪切环中的文本粘贴到光标位置。

4、自动补全

​ 当你敲入一个命令时, 按下 tab 键,自动补全就会发生。同时按下两次tab键会显示所以满足自动补全的名称。

5、搜索历史命令

history //显示所有你输入过的命令
//找到历史命令中出现过的某些命令
history | grep /usr/bin
//展开搜索历史中的某一行
!233 //233表示行号

1
2
3
4
5
6

常见历史命令列表

按键 功能
Ctrl-p 移动到上一个历史条目。类似于上箭头按键。
Ctrl-n 移动到下一个历史条目。类似于下箭头按键。
Alt-< 移动到历史列表开头。
Alt-> 移动到历史列表结尾,即当前命令行。
Ctrl-r 反向递增搜索。从当前命令行开始,向上递增搜索。
Alt-p 反向搜索,不是递增顺序。输入要查找的字符串,然后按下 Enter,执行搜索。
Alt-n 向前搜索,非递增顺序。
Ctrl-o 执行历史列表中的当前项,并移到下一个。如果你想要执行历史列表中一系列的命 令,这很方便。

6、历史命令展开

序列 功能
!! 重复最后一次执行的命令。可能按下上箭头按键和 enter 键更容易些。
!number 重复历史列表中第 number 行的命令。
!string 重复最近历史列表中,以这个字符串开头的命令。
!?string 重复最近历史列表中,包含这个字符串的命令。

# 7、权限

id – 显示用户身份号
• chmod – 更改文件模式
• umask – 设置默认的文件权限
• su – 以另一个用户的身份和组ID来运行 shell
• sudo – 以另一个用户的身份来执行命令
• chown – 更改文件所有者
• chgrp – 更改文件组所有权
• passwd – 更改用户密码

1
2
3
4
5
6
7
8
9

1、读取、写入和执行

>foo.txt?//创建foo.txt
ls -l foo.txt //查看文件信息
-rw-r--r-- 1 root root 0 Dec 25 14:52 foo.txt

1
2
3
4

上面的最后一行代码的前十个字符是文件的属性。第一个字符表明文件类型,剩下的9个字符叫做文件模式,代表文件所有者,和其他人的读、写、执行权限。

下面是常见文件类型。

属性 文件类型
- 普通文件
d 目录
l 符号链接。注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是 虚拟 值。真正的文件属性是指符号链接所指向的文件的属性。
c 字符设备文件。这种文件类型是指按照字节流,来处理数据的设备。 比如说终端机,或者 调制解调器
b 块设备文件。这种文件类型是指按照数据块,来处理数据的设备,例如一个硬盘,或者 C D-ROM 盘。

2、chmod-更改文件模式

​ 更改文件或目录的模式(权限),可以利用 chmod 命令。**只有文件的所有者或者超级用户才能更改文件或目录的模式。**chmod 命令支持两种不同的方法来改变文件模式:八进制数字表示法,或符号表示法

八进制到二进制的映射有一些常见的映射关系。 7 (rwx),6 (rw-),5 (r-x),4 (r-),和 0 (---)。

**3、umask - 设置默认权限 **

​ 当创建一个文件时,umask 命令控制着文件的默认权限。umask 命令使用八进制表示法来表达 从文件模式属性中删除一个位掩码。

umask 0000//设置默认权限,设置掩码值

1
2

4、su - 以其他用户身份和组 ID 运行一个 shell

​ 如果包含-l选项(-l可以简写为-),那么会为指定用户启动一个需要登录的 shell。这意味着会加载此用户的 shell 环境, 并且工作目录会更改到这个用户的家目录。如果不指定用户,则默认值超级用户。

su [-[l]] [user] 
su - //切换到超级管理员,需要输入密码
exit //返回到原来的shell
//使用 su 命令,也可以只执行单个命令,而不是启动一个新的可交互的 shell:把命令用单引号引起来很重要。
su -c 'command'

1
2
3
4
5
6

5、sudo - 以另一个用户身份执行命令

​ 管理员能够配置 sudo 命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控的方式 来执行命令。sudo 命令不要求超级用户的密码。 sudo 不会重新启动一个 shell,也不会加载另一个 用户的 shell 运行环境。命令不必用单引号引起来。

6、chown - 更改文件所有者和用户组

chown [owner][:[group]] file...
sudo cp myfile.txt ~tony //将文件复制到根目录下的通用目录
sudo chown tony: ~tony/myfile.txt // 把文件所有者 从 root(使用 sudo 命令的原因)改到 tony

1
2
3
4

chown命令的第一个参数。

参数 结果
bob 把文件所有者从当前属主更改为用户 bob
bob:users 把文件所有者改为用户 bob,文件用户组改为用户组 users。
:admins 把文件用户组改为组 admins,文件所有者不变。
bob: 文件所有者改为用户 bob,文件用户组改为,用户 bob 登录系统时,所属的用户组。

# 8、进程

• ps – 报告当前进程快照
• top – 显示任务
• jobs – 列出活跃的任务
• bg % 1 – 把一个任务放到后台执行,1为工作序号
• fg % 1 – 把一个任务放到前台执行,1为工作序号
• ctrl+c - 中断一个进程
• ctrl+z - 停止一个进程,将进程从前台移动到后台等待
• kill – 给一个进程发送信号
• killall – 杀死指定名字的进程
• shutdown – 关机或重启系统

1
2
3
4
5
6
7
8
9
10
11

1、查看进程

 ps 
 ps x
 ps aux //查看进程的详细情况

1
2
3
4
标题 意思
TTY(Teletype) 指进程的控制终端。"?" 表示没有控制终端。
STAT(state) 揭示了进程当前状态。
R:运行。这意味着,进程正在运行或准备运行。
S:正在睡眠。 进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络数据包。
D:不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。
T:已停止. 已经指示进程停止运行。稍后介绍更多。
Z:一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。 (父进程没有把子进程从进程表中删除)
<:一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。 进程的 这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice), 因为它占用了比 较多的 CPU 时间,这样就给其它进程留下很少时间。
N:低优先级进程。 一个低优先级进程(一个“好”进程)只有当其它高优先级进程执行之后,才 会得到处理器时间。
TIME 表示 进程所消耗的 CPU 时间数量
USER 用户 ID. 进程的所有者。
%CPU 以百分比表示的 CPU 使用率
%MEM 以百分比表示的内存使用率
VSZ 虚拟内存大小
RSS 进程占用的物理内存的大小,以千字节为单位。
START 进程运行的起始时间。若超过24小时,则用天表示

2、用 top 命令动态查看进程

​ top 程序接受一系列从键盘输入的命令。两个最有趣的命令是 h 和 q。h,显示程序的帮助屏幕,q, 退出 top 程序。

3、将一个进程放置到后台

xlogo & //xlogo表示程序名称
jobs  //列出从终端启动的任务

1
2
3

4、通过 kill 命令给进程发送信号

kill [-signal] PID...
kill -1 13546  //挂起

1
2
3

​ 如果在命令行中没有指定信号,那么默认情况下,发送 TERM(终止)信号。kill 命令被经常 用来发送以下命令:

编号 名字 含义
1 HUP 挂起。
2 INT 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。
3 QUIT 退出
9 KILL 杀死。
15 TERM 终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么 这个 信号终止。
18 CONT 继续。在停止一段时间后,进程恢复运行。
19 STOP 停止。这个信号导致进程停止运行,而没有终止。像 KILL 信号,它不被 发送到目标进 程,因此它不能被忽略。

5、通过 killall 命令给多个进程发送信号

​ 给匹配特定程序或用户名的多个进程发送信号。和 kill 命令一样,你必须拥有超级用户权限才能给不属于你的进程发送信号。

killall [-u user] [-signal] name...

1
2
Last Updated: 6/23/2021, 11:39:41 PM