快乐的Linux

原文:http://billie66.github.io/TLCL/

一、什么是shell

1.什么是shell:shell是一个程序、将命令传递给操作系统、linux自带(bash)shell程序

2.终端仿真器:图形界面下shell交互程序terminal、KDE–konsole,GNOME–gnome-terminal

3.shell提示符:[用户名@主机名 工作目录] 提示符([root@localhost ~]#)提示符:#超级用户、$普通用户

4.命令:date(日期),cal(日历)、df(磁盘空间)、free(内存空间)

5.退出shell:exit

6.虚拟终端、虚拟控制台:进入:ctrl+alt+(F1-F6),切换alt+(F1-F6),返回桌面alt+F7

二、探究操作系统

7.文件系统跳转:pwd、cd、ls

8.文件系统树:可以理解为一颗倒置的树、文件系统可以想象成身处于迷宫中的你

9.家目录:首次登录目录为家目录、普通用户家目录是唯一允许用户写入文件的地方。快捷键 ]# cd ~

10.绝对路径:从根目录/开始直到它的目的地

11.相对路径:开始于工作目录结束于目的地, “ .”表示当前目录, “ … ”表示上一级目录

12.文件名相关:以“ . ”开头文件表示隐藏文件、linux对大小写敏感、没有文件扩展名的概念、支持长文件名,最好不要使用空格,标点符号尽量只使用“ . 和 _ ”

13.command -options arguments:

ls : 
-a --all 显示隐藏文件
-d --directory 显示文件夹属性
-F --classify 加入文件提示符
-h --human-readable 以人的视角阅读
-l 以长格式显示
-r --reverse 以相反的顺序显示
-S 以大小显示
-t 以时间排序

14.确定文件类型:file filename

15.less 浏览文件

命令 行为
Page UP or b 向上翻滚一页
Page Down or space 向下翻滚一页

UP Arrow 向上翻滚一行
Down Arrow 向下翻滚一行

G 移动到最后一行
1G or g 移动到开头一行

/charaters 向前查找指定的字符串
n 向前查找下一个出现的字符串,这个字符串是之前所指定查找的
h 显示帮助屏幕
q 退出 less 程序

16.more 向后翻页 enter

17.常见目录

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

18.软链接(符号链接):类似于快捷方式、符号链接本身和其它符号链接几乎没有区别、写入链接文件内容,本身文件也会被写入、删除链接本身文件不受影响、删除本身,链接则为坏链接(红色)

19.硬链接:不能关联与链接本身不在统一磁盘分区的文件(不能跨设备)、不能关联一个目录(不能关联目录)

三、操作文件和目录

20.通配符
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

21.创建目录 mkdir directory… 三个点表示参数可以重复使用

22.复制文件或者目录 cp,复制单一文件:cp item1 item2、复制多个文件、cp item… directory

复制单一文件:cp item1 item2、复制多个文件、cp item... directory
-a --all 复制文件和目录及他们的所有属性
-i --interactive 提示用户确认
-r --recursive 递归复制
-u --update 更新复制,复制不存在的,更新已存在的
-v --verbose 显示过程信息

23.移动和重命名文件mv

移动单一文件:mv item1 item2、移动多个文件、mv item... directory
-i --interactive 提示用户确认
-u --update 移动不存在的,更新已存在的
-v --verbose 显示过程信息

24.删除文件和目录 rm

-i --interactive 提示用户确认
-r --recursive 递归删除
-f --force 忽视不存在的文件,覆盖-i选项
-v --verbose 显示过程信息

25.创建链接ln

创建硬链接 ln file link
创建软链接 ln -s file link
四、什么是命令

26.命令的四种格式(内部命令、外部命令)


1.构建于shell自身的命令
2.命令可以是一个可执行程序
3.是一个shell函数
4.是一种命令别名

27.显示命令的类型type

28.显示一个可执行程序的位置 which

  1. shell内建命令的帮助文档 help

  2. 命令用法信息 --help

  3. 程序手册 man (可以默认使用less命令浏览手册)

在这里插入图片描述
在这里插入图片描述

32.apropos显示适当的命令 等同于 man -k

33.whatis 非常简洁的命令行说明

34.info显示程序info条目

在这里插入图片描述

35.readme和其它程序文档 /usr/share/doc 目录下

36.alias命令别名,语法alias name=‘string’,删除别名 unalias command

五、重定向

37.cat连接文件、读取一个或者多个文件,然后复制它们到标准输出

38.标准输入(stdin)0、标准输出(stdout)1、错误输出(stderr)2

标准输

出重定向: “>”,">>"追加输出:ls /etc > ls_output.txt

标准错误重定向:2>:ll /etc/a 2> ls_error.txt

标准输出和错误到同一个文件:
ls -l /bin/usr > ls_output.txt 2>&1
ls -l /bin/usr &> ls_output.txt

处理不需要的输出:ls -l /bin/usr 2> /dev/null

标准输入重定向:< :cat < lazy_out.txt

39.cat连接文件(读取一个或者多个文件,然后复制它们到标准输出)

40.命令数据传递 | :ll /usr/bin | less

41.过滤器:把几个命令组合放在一起组成管道线:ls /bin /usr/bin | sort | less

42.报道或忽略重复行uniq (去重)-d(显示重复项)

43.sort(按字母排序)

44.wc 数据统计 (行数、字数、字节数)-l (统计行数)

45.grep 显示匹配行,-i (忽略大小写),-v (打印不匹配的行)

46.head 、tail 显示文件前后10行,-n指定行数,tail -f 自动监视更新文件行数

47.tee 从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动)和一个或多个文件

六、从shell眼中看世界

48.echo 回显,将标准输入显示到标准输出中

1.字符展开:echo *
2.路径展开:ls -d .[!.]?* 
3.波浪线展开:cd ~ 当前用户家目录,cd ~用户名 指定用户家目录
4.算数表达式展开:echo $((2+2)),%取余,**幂,echo $(($((5**2)) * 3))
5.花括号展开:从一个包含花括号的模式中创建多个文本字符串
 echo Front-{A,B,C}-Back
 echo Number_{1..5}
 echo {Z..A}
 echo a{A{1,2},B{3,4}}b
6.参数展开:常在脚本中使用,echo $USER ,printenv | less
7.命令替换:把一个命令的输出作为一个展开模式使用,echo $(ls),ls -l $(which cp),旧版bash:ls -l `which cp`
8.引用:选择地禁止不需要的展开echo the total is $100.00 
9.双引号:引号中的字符串没有特殊含义,除过($,\,``),单词分割、路径名展开、波浪线展开、花括号展开失效,参数展开、算数展开、命令替换有效。
10.单引号:阻止所有的展开:echo '$user' 对比 echo "$user"
11.转义符:引用单个特殊字符:echo "\$.500",除过如下ASCII编码表中的前32个字符


在这里插入图片描述

七、键盘高级操作

49.移动光标(虚拟终端使用,GUI界面可能会冲突)

在这里插入图片描述
在这里插入图片描述

50.修改文本

在这里插入图片描述

51.剪贴和粘贴文本

在这里插入图片描述

52.命令补全(命令补全,路径补全)

——(如果字的开头是一个 “$”)、用户名字(单词以”” 开始)、命令(如果单词是一行的第一个单词)和主机名(如果单词的开头是 “@”)起作用。主机名自动补全只对包含在文件/etc/hosts 中的主机名有效。

有一系列的控制和元键序列与自动补全相关联:

在这里插入图片描述

53.命令历史,家目录下的(.bash_hisrory)

操作命令历史

在这里插入图片描述

命令历史展开

在这里插入图片描述

记录并存储shell会话:script [file] ,其中file可以指定,默认为typescript

八、权限

• locate –通过名字来查找文件
• find –在一个目录层次结构中搜索文件
我们也将看一个经常与文件搜索命令一起使用的命令,它用来处理搜索到的文件列表:
• xargs –从标准输入生成和执行命令行
另外,我们将介绍两个命令以便在我们探索的过程中协助我们:
• touch –更改文件时间
• stat –显示文件或文件系统状态

54.文件目录权限(属主、属组、其他人)

用户帐户定义在/etc/passwd 文件里面,定义了用户(登录)名、uid、gid、帐号的真实姓名、家目录和登录 shell。

用户组定义在/etc/group 文件里面

文件/etc/shadow 包含了关于用户密码的信息

55.文件目录权限(r读取1、w写入2、x执行3)

[admin@localhost ~]$ ll
总用量 0
-rw-rw-r--. 1 admin admin 0 10月 23 02:16 test.txt

列表的前十个字符是文件的属性,这十个字符的第一个字符表明文件类型。剩下的九个字符叫做文件模式,代表着文件所有者、文件组所有者和其他人的读、写和执行权限

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

56.更改文件模式chmod(只有文件的所有者或者超级用户才可以更改)八进制和十六进制表示法;

在这里插入图片描述

符号表示法:+、-、=

在这里插入图片描述
在这里插入图片描述

57.umask设置默认权限(默认不用修改)[直接设置临时生效]

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

0000

在这里插入图片描述

0022

在这里插入图片描述
注意掩码中若出现一个数字 1,则删除文件模式中和这个 1 在相同位置的属性,在这是指其他人的写权限。这就是掩码要完成的任务。掩码的二进制形式中,出现数字 1 的位置,相应地关掉一个文件模式属性。

一些特殊权限:
[admin@localhost ~]$ ll
总用量 0
-rw-rw-r--. 1 admin admin 0 10月 23 03:48 test.txt
[admin@localhost ~]$ chmod u+x test.txt 
[admin@localhost ~]$ ll
总用量 0
-rwxrw-r--. 1 admin admin 0 10月 23 03:48 test.txt
[admin@localhost ~]$ chmod g+x test.txt 
[admin@localhost ~]$ ll
总用量 0
-rwxrwxr--. 1 admin admin 0 10月 23 03:48 test.txt
[admin@localhost ~]$ chmod +t test.txt 
[admin@localhost ~]$ ll
总用量 0
-rwxrwxr-T. 1 admin admin 0 10月 23 03:48 test.txt
第一个是 setuid 位(八进制 4000)。当应用到一个可执行文件时,它把有效
用户 ID 从真正的用户(实际运行程序的用户)设置成程序所有者的 ID。这种操作
通常会应用到一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个
程序由根用户 (root) 所有,并且设置了 setuid 位,这个程序运行时具有超级用户的
特权,这样程序就可以访问普通用户禁止访问的文件和目录。很明显,因为这会引
起安全方面的问题,所有可以设置 setuid 位的程序个数,必须控制在绝对小的范围
内。

第二个是 setgid 位(八进制 2000),这个相似于 setuid 位,把有效用户组 ID 从
真正的用户组 ID 更改为文件所有者的组 ID。如果设置了一个目录的 setgid 位,则
目录中新创建的文件具有这个目录用户组的所有权,而不是文件创建者所属用户组
的所有权。对于共享目录来说,当一个普通用户组中的成员,需要访问共享目录中
的所有文件,而不管文件所有者的主用户组时,那么设置 setgid 位很有用处。

第三个是 sticky 位(八进制 1000)。这个继承于 Unix,在 Unix 中,它可能把一
个可执行文件标志为“不可交换的”。在 Linux 中,会忽略文件的 sticky 位,但是
如果一个目录设置了 sticky 位,那么它能阻止用户删除或重命名文件,除非用户是
这个目录的所有者,或者是文件所有者,或是超级用户。这个经常用来控制访问共
享目录,比方说/tmp。

58.更改身份:

su-以其他用户身份和组ID运行一个shell
su [-[l]] [user]:指定用户启动一个需要登录的shell
su -c 'command':执行单个命令

sudo-以另一个用户身份执行命令(不重启shell)
1.管理员可以配置该命令 /etc/sudoers
2.sudo命令不要求超级用户的密码

59.chown-更改文件所有者和用户组权限、chgrp -更改用户组所有权

chown [owner] [:[group]] file...

在这里插入图片描述

60.更改用户密码:

passwd [user] (其他:账户锁定、密码过期、账户解锁等)
九、进程

• locate –通过名字来查找文件
• find –在一个目录层次结构中搜索文件
我们也将看一个经常与文件搜索命令一起使用的命令,它用来处理搜索到的文件列表:
• xargs –从标准输入生成和执行命令行
另外,我们将介绍两个命令以便在我们探索的过程中协助我们:
• touch –更改文件时间
• stat –显示文件或文件系统状态

ps x

在这里插入图片描述

ps aux

在这里插入图片描述

62.top动态查看进程(默认3秒更新一次)(h帮助q退出)

top - 14:59:20 up 6:30, 2 users, load average: 0.07, 0.02, 0.00
Tasks: 109 total, 1 running, 106 sleeping, 0 stopped, 2 zombie
Cpu(s): 0.7%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si
Mem: 319496k total, 314860k used, 4636k free, 19392k buff
Swap: 875500k total, 149128k used, 726372k free, 114676k cach
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6244 me 39 19 31752 3124 2188 S 6.3 1.0 16:24.42 trackerd
....

在这里插入图片描述

63.中断进程(ctrl+c)

64.把程序放到后台(background)执行,命令+&,或者ctrl-z

65.fg调取后台进程 (fg %程序代号)、后台任务查看jobs

66.通过kill给进程发送信号

在这里插入图片描述

常用系统信号列表

在这里插入图片描述

[root@localhost ~]# kill -l(完整的信号列表)
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

67.killall给多个进程发送信号

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

在这里插入图片描述

十、shell环境

• locate –通过名字来查找文件
• find –在一个目录层次结构中搜索文件
我们也将看一个经常与文件搜索命令一起使用的命令,它用来处理搜索到的文件列表:
• xargs –从标准输入生成和执行命令行
另外,我们将介绍两个命令以便在我们探索的过程中协助我们:
• touch –更改文件时间
• stat –显示文件或文件系统状态

68.检查环境变量

set:显示shell或环境变量
1.查看特定变量:echo $BASH
printenv:只显示环境变量
1.列出特定的变量名:printenv USER
alias查看别名

在这里插入图片描述
在这里插入图片描述

69.登录shell与非登录shell

在这里插入图片描述

在这里插入图片描述

70.修改shell

添加你的变量到PATH,定义额外的环境变量--.bash_profile,对所有用户生效/etc/profile
十一、vi简介

71.使用文本编辑器vi、vim

1.常见备份文件后缀(.bak、.sav、.old、.orig)
2.修改文件内容、nano、gedit、vi、vim
3.配置文件生效source 文件
1.启动
2.启动后直接进入命令模式(每一个按键都是一个命令)~ "foo.txt" [New File]
3.添加文本--输入‘i’进入插入模式 --INSERT--
4.插入模式退回命令模式 [ESC]
5.:w 保存

光标移动

在这里插入图片描述

基本编辑(恢复“u”)

1.追加文本(句子的末尾添加文本):
    1.1普通模式下光标移至行尾,输入“a”,vi进入插入模式,Esc退出;
    1.2光标任意位置,同时vi进入输入模式,输入“A”,进入行尾插入模式。
2.打开一行(两行之间插入):
    2.1“o”当前行的下方打开一行
    2.2“O”当前行的上方打开一行
3.删除文本
    3.1“x”删除光标位置的一个字符,+数字,指明需要删除的字符数。
    3.2“d”,+数字,指定需要删除的次数,
        “dd”删除当前行,
        “5dd”当前行及随后的四行文本,
        “dW”从光标位置开始到下一个单词的开头,
        “d$”从光标开始到前行的尾行,
        “d0”从光标开始到前行的首行,
        “d^”从光标开始到文本行的第一个非空字符,
        “dG”从当前行到文件的末尾,
        “d20G”从当前行到文件的第20行。
4.剪切、复制和粘贴
    4.1“p”把剪切板中的文本粘贴到光标位置之后
       “P”把剪切板中的文本粘贴到光标位置之前
    4.2“y”复制文本,同d命令差不错,同移动命令相结合使用
5.连接行“J”,(行与行之间衔接)
6.查找和替换
    6.1查找“f”,fa查找行内a字符,输入;(分好)可以重复搜索(行查找)
    6.2“/”输入/后,然后输入需要查找的字符串或者正则表达式,按下回车,输入n查找下一个,(全文查找)
7.全局查找和替换(如下图命令:%s/Line/line/g),用户确认命令:%s/Line/line/gc
8.编辑多个文件,命令:vi file1 file2 ...
9.文件之间替换(:n切换下一个文件)(:N回到先前的文件),如果文件没有保存在命令之后加入“!”强制执行(放弃修改),查看正在编辑的文件列表也可以使用(:buffers,第一个文件:buffer 1,第二个文件:buffer 2)
10.打开另一个文件并编辑:ex命令:(:e 文件名),无法使用n命令切换,必须使用buffers命令切换
11.跨文件复制粘贴:利用buffers,:n,:N 切换文件,yy复制,p粘贴
12.插入整个文件到另一个文件:(移动光标到指定行,输入ex命令read[:r]he 需要插入的文件名)
13.保存:(13.1ex命令:w,:wq命令模式下输入ZZ),另存为(:w foot1.txt)

在这里插入图片描述
在这里插入图片描述

十二、自定制 shell 提示符

72.[root@localhost ~]#****默认提示符

1.默认提示符:提示符是由一个环境变量定义的,叫做PS1(prompt string one),查看ehco $PS1
[root@localhost ~]# echo $PS1
[\u@\h \W]\$

其他转义

在这里插入图片描述

73.添加颜色(字符颜色、背景颜色、光标转义编码)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十三、软件包管理
大多数linux发行版每隔六个月更新一次,并且许多独立的程序每天都会更新。
打包系统:两大包管理系统,debian的.deb,和红帽的.rpm
包文件:一个构成软件包的文件压缩集合
资源库:软件包的集合相当于软件商城
依赖性:软件需要依赖程序的组件来完成他们的工作,动态链接库
上层和底层软件包工具:底层工具用来处理这些任务,安装、删除等;上层工具用来完成元数据搜索和依赖解析。
查找软件库中的软件包:apt-cache search	search_string/yum search serach_string
从资源库安装一个软件:apt-get install package_name/yum install package_name
通过软件包来安装:dpkg --install package_file/rpm -i package_file
卸载软件:apt-get remove package_name/yum erase package_name
更新软件:apt-get update;apt-get upgrade /yum update
通过软件包升级:dpkg --install package_file/rpm -U package_file
列出所安装的软件包:dpkg --list/rpm -qa 
确定是否安装一个软件:dpkg --status package_name/rpm -q package_name
显示所安装软件包的信息:apt-cache show package_name/yum info package_name
查找安装某个软件的软件包:dpkg --search file_name/rpm -qf file_name

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

十四、存储媒介

• locate –通过名字来查找文件
• find –在一个目录层次结构中搜索文件
我们也将看一个经常与文件搜索命令一起使用的命令,它用来处理搜索到的文件列表:
• xargs –从标准输入生成和执行命令行
另外,我们将介绍两个命令以便在我们探索的过程中协助我们:
• touch –更改文件时间
• stat –显示文件或文件系统状态

1.挂载和卸载设备mount/unmount
/etc/fstab:系统启动的时候需要挂载的设备
mount 不带参数,显示当前系统挂载的文件系统
    debugfs on /sys/kernel/debug type debugfs (rw,relatime)
    设备 on 挂载点 type 文件系统类型(选项)
2.挂载点:简单来说就是系统中的一个目录
3./dev设备住所
4.使用fdisk命令操作分区
5.使用mkfs命令创建一个新的文件系统
6.数据迁移:命令dd,dd if=input_file of=output_file [bs=block_size [count=blocks]](该命令非常强大,使用时必须再三检查)
7.创建CD-ROM映像,一构建iso镜像,二、把镜像写入CD-ROM:

在这里插入图片描述
在这里插入图片描述

十五、网络系统

linux被用来创建各式各样的网络系统和装置、包括防火墙、路由器、服务器、网络存储设备等,用来配置和操作网络系统的命令数目就如同网络系统一样巨大,

• locate –通过名字来查找文件
• find –在一个目录层次结构中搜索文件
我们也将看一个经常与文件搜索命令一起使用的命令,它用来处理搜索到的文件列表:
• xargs –从标准输入生成和执行命令行
另外,我们将介绍两个命令以便在我们探索的过程中协助我们:
• touch –更改文件时间
• stat –显示文件或文件系统状态

1.ping 发送 ICMP ECHO_REQUEST到指定的主机(默认每秒发送数据包,直到手动停止)
2.traceroute程序:显示本机到指定主机经过的所有跳数的网络流量列表(主机名、IP、性能数据;由于网络配置原因(路由、交换、防火墙等),不可能全部显示)
3.netstat:检查网络设置和统计数据
    -ie 查看网络接口
    -r内核网络路由表
4.ftp:文件传输协议
5.wget:文件下载
6.ssh(secure shell):远程主机安全交流:由服务端22、客户端两大部分组成,本机测试自连接ssh localhost,[~.ssh/known_hosts 保存连接秘钥,冲突删去即可]
7.scp:安全复制(远端主机安全复制)、sftp(不需要远程主机运行ftp服务端,仅运行ssh服务端就可以使用,)
十六、查找文件

• locate –通过名字来查找文件
• find –在一个目录层次结构中搜索文件
我们也将看一个经常与文件搜索命令一起使用的命令,它用来处理搜索到的文件列表:
• xargs –从标准输入生成和执行命令行
另外,我们将介绍两个命令以便在我们探索的过程中协助我们:
• touch –更改文件时间
• stat –显示文件或文件系统状态

1.查找文件的简单方法:locate(执行快速的文件名数据库搜索)(mlocate),安装mlocate,更新数据库updatedb,配置文件/etc/updatedb.conf
2.find强大的文件搜索命令,
    find ~ 输出目录文件及路径
    添加测试条件 -type d :只搜索目录
                -type f :用来搜索普通文件
                -name 通配符
                -size + — 
3.操作符
4.stat命令:更加详细的ls命令
5.touch命令:创建空文件、更改文件时间
    
    

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

###### 十七、归档和备份

• gzip –压缩或者展开文件
• bzip2 –块排序文件压缩器
归档程序:
• tar –磁带打包工具
• zip –打包和压缩文件
还有文件同步程序:
• rsync –同步远端文件和目录

1.压缩文件(把最多的数据放到最小的空间)
游程编码(最基本的压缩技术)、无损压缩(还原一个文件时与源文件保持一致)、有损压缩(压缩删除数据,还原同源文件不一致)
2.gzip:压缩会替带原始文件、解压gunzip(保留原始权限和时间戳)
    gzip -d 解压 -t 测试 -v 压缩信息 -c 输出到标准输出
    gunzip -c 浏览压缩目录
3.bzip2:压缩、bunzip2解压,同gzip用法类似,使用了不同的压缩算法,舍弃了压缩速度,实现了更高级的压缩
4.归档:收集文件,并把他们捆绑成一个大文件的过程,
5.tar(tape archive):经典压缩工具,被用来制作磁带备份工具,常用来完成传统任务,
    -c 文件、目录创建归档
    -x 抽取归档文件
    -r 追加路径到归档文件末尾
    -t 列出文档的内容
    使用“-”来表示标准输入、输出的惯例
    .tgz扩展名是由gzip压缩的tar文件的常规扩展名,等同于.tar.gz
6.zip既是一个压缩程序也是一个打包程序,解包unzip命令
    命令格式:zip options zipfile file...
    -r 包含源文件,不包含只有目录
    支持标准输入
  unzip 
    -l uzip命令只列出文件包中的内容而没有抽取文件
    -v 增加列表的冗余信息,如果文件存在,则会替换
    -p 允许输出发送到标准输出
7.同步文件和目录rsync
    命令格式:rsync options source destination 
    这里 source 和 destination 是下列选项之一:
        • 一个本地文件或目录
        • 一个远端文件或目录,以 [user@]host:path 的形式存在
        • 一个远端 rsync 服务器,由 rsync://[user@]host[:port]/path 指定
        注意 source 和 destination 两者之一必须是本地文件。rsync 不支持远端到远端的复制让我们试着对一些本地文件使用 rsync 命令
    -a 递归、保护文件属性
    -v 冗余输出
    --delete 删除可能在备份文件中存在但却不存在与源设备中的文件
    网络中使用rsync
        --rsh=ssh rsync使用ssh程序作为它的远程shell,数据安全传递
        rsync服务器:使用rsync服务器的URI
    

在这里插入图片描述
在这里插入图片描述

十八、正则表达式(略)
十九、文本处理(略)
二十、格式化输出
用到的命令:
• nl –添加行号
• fold –限制文件列宽
• fmt –一个简单的文本格式转换器
• pr –让文本为打印做好准备
• printf –格式化数据并打印出来
• groff –一个文件格式化系统
1.nl 添加行号相当于cat -n,nl支持“逻辑页面”显示
2.fold 折叠限制文件行宽
  -w 文本分割,默认80字符,不会因为单词边界不分割
  -s 分解到最后可用的空白字符,考虑单词边界
3.fmt简单的文本格式器,折叠文本,接受文本或标准输入并且在文本流上格式化段落。
主要是填充和连接文本行,同时保留空白符和缩进
  -c 更正fmt默认输出缺陷格式
  -p 多行选中,开头被格式符号,例如:“#”
4.pr 格式化打印文本
  -l 选项(页长)和 -w 选项(页宽)定义了宽 65 列,长 15 行的一
个“页面”
5.printf(“格式化打印”“print formatted”) 并不用于流水线执行(不接受标准输入),通常被用于自动执行指令中,printf 主要用在脚本中,用于格式化表格数据,而不是直接用于命令行
  完整的转换规范“%[flags][width][.precision]conversion_specification”
6.提示:Linux 系统通常包含许多用于文件格式转换的命令行程序。它们通常以 format2format命名。尝试使用该命令
ls /usr/bin/*[[:alpha:]]2[[:alpha:]]*

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二十一、打印(CUPS)
• pr ——转换需要打印的文本文件
• lpr ——打印文件
• lp ——打印文件(System V) • a2ps ——为 PostScript 打印机格式化文件
• lpstat ——显示打印机状态信息
• lpq ——显示打印机队列状态
• lprm ——取消打印任务
• cancel ——取消打印任务(System V)
1.pr - 转换需要打印的文本文件
   ls /usr/bin | pr -3 -w 65 | head
2.lpr - 打印文件(Berkeley 风格) (默认无该命令,需要打印机支持?)
   查看系统已知的打印机列表:lpstat -a
3.lp - 打印文件(System V 风格)
   ls /usr/bin | pr -4 -w 90 -l 88 | lp -o page-left=36 -o cpi=12 -o lpi=8
4.a2ps 格式转换程序,但它实际的功能却是打印,它的默认输出不是标准输出,而是系统的默认打印机,它可以改善输出的外观
5.安装虚拟打印机pdf。yum install cups cups-pdf
6.lprm 和 cancel - 取消打印任务

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二十二、编译程序
• make - 维护程序的工具
1.编译:编译就是把源码(一个由程序员编写的人类可读的程序的说明)翻译成计算机处理
器的语言的过程。汇编语言使用诸如 CPY(复制)和 MOV(移动)之类(略微)易用的字符助记符代替了数值编码,现在常用于设备驱动和嵌入式系统编写。一个叫做链接器的程序用来在编译器的输出结果和要编译的程序所需的库之间建立连接。这个过程的最终结果是一个可执行程序文件,准备使用。脚本语言由一个叫做解释器的特殊程序执行。在 Linux 环境中,普遍使用的 C 编译器叫做 gcc(GNU C 编译器),最初由 Richard Stallman 写出来的。查看是否安装:which gcc
2.一般情况系统发行版源码会把源码安装在 /usr/src 目录下,而供多个用户使用的源码,通常安装在 /usr/local/src 目录下。通常提供的源码形式是一个压缩的 tar 文件。有时候称为 tarball,这个文件包含源码树,或者是组成源码的目录和文件的层次结构。
3.源码树
    1.程序描述文档:README,INSTALL,NEWS,和 COPYING
    2.'.c/.h' 结尾的文件:这些.c 文件包含了由该软件包提供的两个 C 程序(style 和 diction),被分割成模块。这是一种常见做法,把大型程序分解成更小,更容易管理的代码块。源码文件都是普通文本,可以用 less 命令查看;这些.h 文件被称为头文件。它们也是普通文件。头文件包含了程序的描述,这些程序被包括在源码文件或库中。为了让编译器链接到模块,编译器必须接受所需的所有模块的描述,来完成整个程序。
4.构建程序:大多数程序通过一个简单的,两个命令的序列构建:(./configure make)
 configure 程序是一个 shell 脚本,由源码树提供,作用是分析程序构建环境,微调源码,检查所需的外部工具和组件,来适应不同的unix系统,提供安装过程信息,用于排查安装错误。configure命令会创建几个文件,最重要的是makefile普通配置文件,用来指引make构建程序,make运行必不可少的文件。
5.Makefile描述了最终完成的程序的各个组件之间的关系和依赖性
6.make程序的重要特征:保持目标文件是最新的(用于修改更新程序),智能地只构建所需要构建的内容的特性,make 程序可以用到任何需要维护一个目标/依赖关系的任务中,不仅仅为了编译源代
码
7.安装程序:源码通常包括一个特别的make目标文件install,目标文件将在本地构建软件传统位置安装:/usr/local/bin(管理员权限),(sudo make install)

在这里插入图片描述

二十三、编写第一个 Shell 脚本
1.shell不仅是一个功能强大的命令行接口, 也是一个脚本语言解释器
2.常用编辑器vim,(图形)gedit,kate
3.文本行中,# 符号之后的所有字符都会被忽略。
4. #! 字符序列是一种特殊的结构叫做 shebang。这个 shebang 被用来告诉操作系统将执行此脚本所用的解释器的名字。每个 shell 脚本都应该把这一文本行作为它的第一行。
5.常见的权限设置;权限为 755 的脚本,则每个人都能执行,和权限为700 的脚本,只有文件所有者能够执行。注意为了能够执行脚本,脚本必须是可读的。
6.系统会自动搜索可执行路径的脚本,这个目录列表被存储在一个名为 PATH 的环境变量中
7.添加新的环境变量路径:.bashrc 文件export PATH=~/bin:"$PATH"
8.生效环境变量,source .bashrc 或者 . .bashrc,这个点(.)命令是 source 命令的同义词,一个 shell 内建命令
9.每个用户可以使用/usr/local/bin,系统管理员:/usr/local/sbin,本地支持的软件/usr/local下
1.长选项名称:当在命令行中输入选项的时候,短选项更受欢迎,但是当书写脚本的时候,长选项能提供可读性
2.缩进和行继续符:通过使用行继续符(反斜杠-回车符序列)和缩进,这个复杂命令的逻辑会被更清楚地描述
3.常见vim配置:
    1.:syntax on 语法高亮 (:set syntax=sh)
    2.:set hlsearch  高亮查找结果
    3.:set tabstop=4 tab字符所占据的列数,默认8列
    4.:set autoindent 新输入的文本行缩进与刚输入的文本行相同列数,停止缩进ctrl-d
    5.把这些命令(没有开头的冒号字符)添加到你的 ∼/.vimrc 文件中,这些改动会永久生效
    
二十四、启动一个项目
1.开头的“>”字符是包含在 PS2shell 变量中的 shell 提示符。每当我们在 shell 中键入多行语句的时候,这个提示符就会出现。多行编程语句时,它会派上大用场。
2.变量和常量:(常用变量替代经常出现的常量($变量名))
  有一些关于变量名的规则:
    1. 变量名可由字母数字字符(字母和数字)和下划线字符组成。
    2. 变量名的第一个字符必须是一个字母或一个下划线。
    3. 变量名中不允许出现空格和标点符号。
3.一个常用惯例是指定大写字母来表示常量,小写字母表示真正的变量。shell 不能辨别变
量和常量
4.变量赋值:variable=value,variable 是变量的名字,value 是一个字符串,注意在赋值过程中,变量名、等号和变量值之间必须没有空格:例如:(a=z,b="a string",c="a string and $b",d=$(ls -l foo.txt),e=$((5 * 7)),f="\t\ta string\n"),可以在同一行中对多个变量赋值(a=5 b="a string")。在参数展开过程中,变量名可能被花括号“{}”包围着。由于变量名周围的上下文,参数会变得不明确的,这会很有帮助。
5.here document 或者 here script:另外一种 I/O 重定向形式,(command << token  ,token)command 是一个可以接受标准输入的命令名,token 是一个用来指示嵌入文本结束
的字符串,字符串 _EOF_(意思是“文件结尾”,一个常见用法)被选作为 token,并标志着嵌入文本的结尾。注意这个token 必须在一行中单独出现,并且文本行中没有末尾的空格。优点:here documents 中的单引号和双引号会失去它们在 shell 中的特殊含义,可以随意的嵌入引号,可以和任意能接受标准输入的命令一块使用,把重定向操作符从“<<”改为“<<-”,shell 会忽略在此 here document 中开头的 tab 字符。这就能缩进一个 here document。
二十五、自顶向下设计
1.这种先确定上层步骤,然后再逐步细化这些步骤的过程被称为自顶向下设计,把庞大而复杂的任务分割为许多小而简单的任务。自顶向下设计是一种常见的程序设计方法,尤其适合 shell 编程。
2.Shell函数:有两种语法形式:
function name {
commands
return
}
and
name () {
commands
return
}
这里的 name 是函数名,commands 是一系列包含在函数中的命令。Shell 函数的命名规则和变量一样。一个函数必须至少包含一条命令。这条 return 命令(是可选的)满足要求。
3.局部变量:脚本中,所有的变量(包括常量)都是全局变量,全局变量在整个程序中保持在。局部变量只能在定义它们的 shell 函数中使用,并且一旦 shell函数执行完毕,它们就不存在了。通过在变量名之前加上单词 local,来定义局部变量(local foo)。
4.<PRE> 标签包围命令,保持命令的输出格式
5..bashrc 文件中的 shell 函数,可以自主构建shell函数,Shell 函数完美地替代了别名,并且实际上是创建个人所用的小命令的首选方法。别名非常局限于命令的种类和它们支持的 shell 功能,然而 shell 函数允许任何可以编写脚本的东西。
二十六、流程控制:if 分支结构
1.伪码:是一种模拟的计算机语言,为的是便于人们理解
2.退出状态:当命令执行完毕后,命令(包括我们编写的脚本和 shell 函数)会给系统发送一个值,叫做退出状态。这个值是一个 0 到 255 之间的整数,说明命令执行成功或是失败。按照惯例,一个零值说明成功,其它所有值说明失败。Shell 提供了一个参数,我们可以用它检查退出状态。( echo $?)shell 提供了两个极其简单的内部命令,它们不做任何事情,除了以一个 0 或 1 退出状态来终止执行。True 命令总是执行成功,而 false 命令总是执行失败;
3. test 命令执行各种各样的检查与比较,
1.if成功则执行,失败则不执行
语法:
if commands; then
commands
[elif commands; then
commands...]
[else
commands]
fi

2.test两种等价模式
test expression、[ expression ]
   expression 是一个表达式,其执行结果是 true 或者是 false。当表达式为真时,这个
test 命令返回一个零退出状态,当表达式为假时,test 命令退出状态为 1。

3.更现代的测试版本
语法:[[ expression ]]
类似于 test,expression 是一个表达式,其计算结果为真或假。这个 [[ ]] 命令非
常相似于 test 命令(它支持所有的表达式),但是增加了一个重要的新的字符串表达式:string1 =~ regex
其返回值为真,如果 string1 匹配扩展的正则表达式 regex。这就为执行比如数据验证等任
务提供了许多可能性。

4.(( )) - 为整数设计
(( )) 被用来执行算术真测试。如果算术计算的结果是非零值,则其测试值为真。因为复合命令 (( )) 是 shell 语法的一部分,而不是一个普通的命令,而且它只处理整数,所以它能够通过名字识别出变量,而不需要执行展开操作。

5.结合表达式
 test 和 [[ ]] 基本上完成相同的事情,哪一个更好呢?test 更传统(是 POSIX 的
一部分),然而 [[ ]] 特定于 bash。知道怎样使用 test 很重要,因为它被非常广泛地应用,但是显然 [[ ]] 更有用,并更易于编码。

6.控制操作符:分支的另一种方法
语法:
command1 && command2、command1 || command2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二十七、读取键盘输入
1.read - 从标准输入读取数值(来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,读取文件中的一行数据)
语法:read [-options] [variable...]
可以接受多个参数:如果 read 命令接受到变量值数目少于期望的数字,那么额外的变量值为空,而多余的输入数据则会被包含到最后一个变量中。如果 read 命令之后没有列出变量名,则一个 shell 变量,REPLY,将会包含所有的输入:

2.IFS:自定义格式读取(shell 变量 __IFS__ (内部字符分隔符),默认值包含一个空格,一个 tab,和一个换行符,每一个都会把字段分割开。调整 IFS 的值来控制输入字段的分离。)<<<: 操作符指示一个 here 字符串。一个 here 字符串就像一个 here 文档,只是比较简短,由单个字符串组成。

3.校正输入(输入格式)

4.菜单(选择)

在这里插入图片描述
在这里插入图片描述

二十八、流程控制:while/until 循环
1.循环while
语法:while commands; do commands; done
2.跳出循环(break 和 continue 两个命令)
3.until(until 命令与 while 非常相似,除了当遇到一个非零退出状态的时候,while 退出循环,而 until不退出。)
4.使用循环读取文件(while 和 until 能够处理标准输入。这就可以使用 while 和 until 处理文件。)当循环终止的时候,循环中创建的任意变量或赋值的变量都会消失,记住这一点很重要。
二十九、疑难排解
1.语法错误
    1.1丢失引号
    1.2丢失或意外的标记
    1.3预料不到的展开
    1.4逻辑错误
      1. 不正确的条件表达式。
      2.“超出一个值”错误。
      3. 意外情况。
 2.防错编程
 3.验证输入
 4.测试 (在 rm 命令之前放置了一个 echo 命令)
 5.调试
 6.找到问题区域(隔离代码,添加注释)
 7.追踪(tracing)(set -x/set +x启用或者关闭追踪,而不用全局追踪)
 8.执行时检查数值
三十、流程控制:case 分支
1.case(多选复合命令)
语法:
case word in
[pattern [| pattern]...) commands ;;]...
esac

2.模式
case 语句使用的模式和路径展开中使用的那些是一样的。模式以一个“)”为终止符

3.执行多个动作
添加的“;;&”的语法允许 case 语句继续执行下一条测试,而不是简单地终止运行

在这里插入图片描述
在这里插入图片描述

三十一、位置参数
1.访问命令行(位置参数)
注意:实际上通过参数展开方式你可以访问的参数个数多于 9 个。只要指定一个大于 9 的
数字,用花括号把该数字括起来就可以。例如 ${10}、${55}、${211} 等等

2.确定参数个数
shell 还提供了一个名为 $#,可以得到命令行参数个数的变量:

3.shift - 访问多个参数的利器
。执行一次 shift 命令,就会导致所有的位置参数“向下移动一个位置”。事实上,用 shift 命令也可以处理只有一个参数的情况(除了其值永远不会改变的变量 $0):

4. 处理集体位置参数

在这里插入图片描述

三十二、流程控制:for 循环(提供一种处理序列的方式,在编程的时候非常有用)
1.for: 传统 shell 格式
语法:
for variable [in words]; do
commands
done
[in words]如果省略:用for循环来替代while循环
(fortran)for 循环使用的变量可以是任意有效的变量,但是 i 是最常用的一个,其次是 j 和 k。

2.for: C 语言格式
for (( expression1; expression2; expression3 )); do
commands
done
这里的 expression1、expression2 和 expression3 都是算术表达式,commands 是每次循环迭代时要执行的命令。

三十三、字符串和数字
1.参数展开
基本参数:Sa、${a}、大于9的位置参数${11}

空变量的展开:(处理不存在和空变量的参数展开形式)
${parameter:-word},若 parameter 没有设置(例如,不存在)或者为空,展开结果是 word 的值。若 parameter不为空,则展开结果是 parameter 的值。
${parameter:=word},若 parameter 没有设置或为空,展开结果是 word 的值。另外,word 的值会赋值给parameter。若 parameter 不为空,展开结果是 parameter 的值。
${parameter:?word},若 parameter 没有设置或为空,这种展开导致脚本带有错误退出,并且 word 的内容会发送到标准错误。若 parameter 不为空,展开结果是 parameter 的值。
${parameter:+word},若 parameter 没有设置或为空,展开结果为空。若 parameter 不为空,展开结果是 word 的值会替换掉 parameter 的值;然而,parameter 的值不会改变。

2.返回变量名的参数展开
${!prefix*}、${!prefix@}、这种展开会返回以 prefix 开头的已有变量名。根据 bash 文档,这两种展开形式的执行结果相同。

3.字符串展开(字符串操作展开可以用来替换其它常见命令比方说 sed 和cut。通过减少使用外部程序,展开提高了脚本的效率)

${#parameter},展开成由 parameter 所包含的字符串的长度。通常,parameter 是一个字符串;然而,如果parameter 是 @ 或者是 * 的话,则展开结果是位置参数的个数。

${parameter:offset},${parameter:offset:length}这些展开用来从 parameter 所包含的字符串中提取一部分字符。提取的字符始于第 offset个字符(从字符串开头算起)直到字符串的末尾,除非指定提取的长度。
若 offset 的值为负数,则认为 offset 值是从字符串的末尾开始算起,而不是从开头。注意负数前面必须有一个空格,为防止与 ${parameter:-word} 展开形式混淆。length,若出现,则必须不能小于零。
如果 parameter 是 @,展开结果是 length 个位置参数,从第 offset 个位置参数开始。

${parameter#pattern}、${parameter##pattern}
这些展开会从 paramter 所包含的字符串中清除开头一部分文本,这些字符要匹配定义的pattern。pattern 是通配符模式,就如那些用在路径名展开中的模式。这两种形式的差异之处是该 # 形式清除最短的匹配结果,而该 ## 模式清除最长的匹配结果。

${parameter%pattern}、${parameter%%pattern}这些展开和上面的 # 和 ## 展开一样,除了它们清除的文本从 parameter 所包含字符串的末尾开始,而不是开头。

${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
${parameter/%pattern/string}
这种形式的展开对 parameter 的内容执行查找和替换操作。如果找到了匹配通配符 pattern
的文本,则用 string 的内容替换它。在正常形式下,只有第一个匹配项会被替换掉。在该 //形式下,所有的匹配项都会被替换掉。该 /# 要求匹配项出现在字符串的开头,而 /% 要求匹配项出现在字符串的末尾。/string 可能会省略掉,这样会导致删除匹配的文本。

4.大小写转换(bash 有四个参数展开和 declare 命令的两个选项来支持大小写转换。)

5.算术求值和展开
$((expression)):这里的 expression 是一个有效的算术表达式
5.1数基
5.2一元运算符:有两个一元运算符,+ 和 -,它们被分别用来表示一个数字是正数还是负数。
5.3简单算术
5.4赋值运算符
表达式中 = 符号的真正含义非常重要。单个 = 运算符执行赋值运算。foo = 5 是说“使得 foo 等于 5”,而 == 运算符计算等价性。foo == 5 是说“是否 foo 等于 5?”。这会让人感到非常迷惑,因为 test 命令接受单个 = 运算符来测试字符串等价性。这也是使用更现代的 [[ ]] 和 (( )) 复合命令来代替 test 命令的另一个原因。

6.位运算符
位运算符是一类以不寻常的方式操作数字的运算符。这些运算符工作在位级别的数字。它们被
用在某类底层的任务中,经常涉及到设置或读取位标志。

7.逻辑运算符

8.bc - 一种高精度计算器语言(忽略)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三十四、数组
1.什么是数组?数组是一次能存放多个数据的变量。Bash 中的数组仅限制为单一维度。我们可以把它们看作是只有一列的电子表格。尽管有这种局限,但是有许多应用使用它们。

2.创建一个数组
[me@linuxbox ~]$ declare -a a
使用 -a 选项,declare 命令的这个例子创建了数组 a。

3.数组赋值
单个赋值:name[subscript]=value
name 是数组的名字,subscript 是一个大于或等于零的整数(或算术表达式)。注意数组第一个元素的下标是 0,而不是 1。数组元素的值可以是一个字符串或整数。

多个赋值:name=(value1 value2 ...)
name 是数组的名字,value… 是要按照顺序赋给数组的值,从元素 0 开始

4.访问数组元素

5.数组操作
5.1输出数组内容:下标 * 和 @ 可以被用来访问数组中的每一个元素。与位置参数一样,@ 表示法在两者之中更有用处,表示法 ${animals[*]} 和 ${animals[@]} 的行为是一致的
直到它们被用引号引起来。
5.2确定数组元素个数:
5.3找到数组使用的下标${!array[*]}   ${!array[@]}
5.4在数组末尾添加元素:+=
5.5数组排序:done | sort
5.6删除数组:unset(全部或者单个元素)
5.7关联数组:访问数组echo ${colors["blue"]},数组和循环有一种天然的姻亲关系,它们经常被一起使用for ((expr; expr; expr))
三十五、奇珍异宝
1.组命令和子 shell:
bash 允许把命令组合在一起。可以通过两种方式完成;要么用一个 group 命令,要么用一个子shell,
组命令:{ command1; command2; [command3; ...] }
子shell:(command1; command2; [command3;...])
组命令用花括号把它的命令包裹起来,而子 shell 用括号号。值得注意的是,鉴于 bash 实现组命令的方式,花括号与命令之间必须有一个空格,并且最后一个命令必须用一个分号或者一个换行符终止。在大多数情况下,除非脚本要求一个子 shell,组命令比子 shell更受欢迎。组命令运行很快并且占用的内存也少。
2.进程替换:(一种奇异的展开方式)
一种适用于产生标准输出的进程:<(list)这里的 list 是一串命令列表
另一种适用于接受标准输入的进程:>(list)这里的 list 是一串命令列表
进程替换允许我们把一个子 shell 的输出结果当作一个用于重定向的普通文件。
3.陷阱(大型脚本未正常关机程序如何正确结束)
命令:trap:trap argument signal [signal...]
这里的 argument 是一个字符串,它被读取并被当作一个命令,signal 是一个信号的说明,
它会触发执行所要解释的命令
4.异步执行:wait 命令导致一个父脚本暂停运行,直到一个特定的进程(例如,子脚本)运行结束。
5.等待:
在父脚本中,子脚本被启动,并被放置到后台运行。子脚本的进程 ID 记录在 pid 变量中,这个变量的值是 $! shell 参数的值,它总是包含放到后台执行的最后一个任务的进程 ID 号。
父脚本继续,然后执行一个以子进程 PID 为参数的 wait 命令。这就导致父脚本暂停运行,
直到子脚本退出,父脚本随之结束。
6.命名管道:
命名管道用来在两个进程之间建立连接,也可以像其它类型的文件一样使用。
7.设置一个命名管道:mkfifo 命令
8.使用命名管道:管道阻塞

元素。与位置参数一样,@ 表示法在两者之中更有用处,表示法 ${animals[]} 和 a n i m a l s [ @ ] 的 行 为 是 一 致 的 直 到 它 们 被 用 引 号 引 起 来 。 5.2 确 定 数 组 元 素 个 数 : 5.3 找 到 数 组 使 用 的 下 标 {animals[@]} 的行为是一致的 直到它们被用引号引起来。 5.2确定数组元素个数: 5.3找到数组使用的下标 animals[@]5.25.3使{!array[]} ${!array[@]}
5.4在数组末尾添加元素:+=
5.5数组排序:done | sort
5.6删除数组:unset(全部或者单个元素)
5.7关联数组:访问数组echo ${colors[“blue”]},数组和循环有一种天然的姻亲关系,它们经常被一起使用for ((expr; expr; expr))


###### 三十五、奇珍异宝

1.组命令和子 shell:
bash 允许把命令组合在一起。可以通过两种方式完成;要么用一个 group 命令,要么用一个子shell,
组命令:{ command1; command2; [command3; …] }
子shell:(command1; command2; [command3;…])
组命令用花括号把它的命令包裹起来,而子 shell 用括号号。值得注意的是,鉴于 bash 实现组命令的方式,花括号与命令之间必须有一个空格,并且最后一个命令必须用一个分号或者一个换行符终止。在大多数情况下,除非脚本要求一个子 shell,组命令比子 shell更受欢迎。组命令运行很快并且占用的内存也少。
2.进程替换:(一种奇异的展开方式)
一种适用于产生标准输出的进程:<(list)这里的 list 是一串命令列表
另一种适用于接受标准输入的进程:>(list)这里的 list 是一串命令列表
进程替换允许我们把一个子 shell 的输出结果当作一个用于重定向的普通文件。
3.陷阱(大型脚本未正常关机程序如何正确结束)
命令:trap:trap argument signal [signal…]
这里的 argument 是一个字符串,它被读取并被当作一个命令,signal 是一个信号的说明,
它会触发执行所要解释的命令
4.异步执行:wait 命令导致一个父脚本暂停运行,直到一个特定的进程(例如,子脚本)运行结束。
5.等待:
在父脚本中,子脚本被启动,并被放置到后台运行。子脚本的进程 ID 记录在 pid 变量中,这个变量的值是 $! shell 参数的值,它总是包含放到后台执行的最后一个任务的进程 ID 号。
父脚本继续,然后执行一个以子进程 PID 为参数的 wait 命令。这就导致父脚本暂停运行,
直到子脚本退出,父脚本随之结束。
6.命名管道:
命名管道用来在两个进程之间建立连接,也可以像其它类型的文件一样使用。
7.设置一个命名管道:mkfifo 命令
8.使用命名管道:管道阻塞


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值