文章目录
Linux 学习笔记
###第十一组
###成员: 陈希桐 郭贵鑫
分工:
陈希桐 编写
郭贵鑫 查找资料及复查
第二课
1.Linux 构成
Linux=Kernel+Shell+FS+Pro/Uti/Tol
即内核加壳加文件系统加应用程序
2.ls 命令
全拼list files
语法:ls [option][name]
用途:列出目前工作目录所含文件及其子目录
可选参数
- -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
- -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
- -r 将文件以相反次序显示(原定依英文字母次序)
- -t 将文件依建立时间之先后次序列出
- -A 同 -a ,但不列出 “.” (目前目录) 及 “…” (父目录)
- -F 在列出的文件名称后加一符号;例如可执行档则加 “*”, 目录则加 “/”
- -R 若目录下有文件,则以下之文件亦皆依序列出
3.快捷键
-
Tab Auto complete 自动完成
-
Tab Tab Show possible auto completes 显示可能的自动完成
-
Up/Down Command history 上/下命令历史
-
Left/Right Move cursor 左/右移动光标
-
Ctrl+A Move cursor to beginning 移动光标到开始
-
Ctrl+C End running program 结束运行程序
-
Ctrl+D End current session 结束当前会话
-
Ctrl+E Move cursor to end 移动光标到结束
-
Ctrl+H Backspace 退格
-
Ctrl+L Clear 清除
-
Ctrl+R Search command history 搜索命令历史记录
-
Ctrl+Z Suspend the program 暂停程序
4.cd 命令
全拼:Changge directory
语法: cd [路径]
用途:改变路径
常用方法:
-
cd go主目录
-
cd ~ go主目录
-
cd . .去父目录
-
CD / go root
-
CD -去以前的目录
5.pwd 命令
全拼:print work directory
语法:pwd [option]
用途:可立刻得知您目前所在的工作目录的绝对路径名称
参数:
-
-L, --logical 从环境中使用PWD,即使它包含符号链接
-
-P, --physical physical 避免所有符号链接
-
–help 显示帮助并退出
-
–version 输出版本信息并退出
6.cat 命令
全拼:concatenate
语法: cat [-AbeEnstTuv] [–help] [–version] fileName
用途:命令用于连接文件并打印到标准输出设备上
参数:
-
-n 或 --number:由 1 开始对所有输出的行数编号
-
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号
-
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行
-
-v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外
-
-E 或 --show-ends : 在每行结束处显示 $
-
-T 或 --show-tabs: 将 TAB 字符显示为 ^I
-
-A, --show-all:等价于 -vET
-
-e:等价于"-vE"选项
-
-t:等价于"-vT"选项
主要三大功能:
- 一次显示整个文件
- $ cat filename
- 从键盘创建一个文件
- $ cat > filename
- 能创建新文件,不能编辑已有文件
- 将几个文件合并为一个文件
- $cat file1 file2 > file
其他写法:
- cat 也可以用来制作镜像文件。例如要制作软盘的镜像文件,将软盘放好后输入:
cat /dev/fd0 > OUTFILE
- 相反的,如果想把 image file 写到软盘,输入:
cat IMG_FILE > /dev/fd0
3.cat<<EOF
,以EOF输入字符为标准输入结束: cat>filename<<EOF
,以EOF作为输入结束,和ctrl+d的作用一样:
7. exit命令
语法:exit [状态码]
用途:执行exit可使shell以指定的状态值退出。若不设置状态值参数,则shell以预设值退出。状态值0代表执行成功,其他值代表执行失败。exit也可用在script,离开正在执行的script,回到shell
参数:
- 格式:exit n
退出。设置退出码为n。(Cause the shell to exit with a status of n.)
-
格式:exit退出。
退出码不变,即为最后一个命令的退出码。(If n is omitted, the exit status is that of the last command executed. ) -
格式:$?
一个命令的退出码。 -
格式:trap “commands” EXIT
退出时执行commands指定的命令。( A trap on EXIT is executed before the shell terminates.
退出码(exit status,或exit code)的约定:
-
0表示成功(Zero - Success)
-
非0表示失败(Non-Zero - Failure)
-
2表示用法不当(Incorrect Usage)
-
127表示命令没有找到(Command Not Found)
-
126表示不是可执行的(Not an executable)
-
值>=128 信号产生
8. info 命令
语法:info(选项)(参数)
用途:得到最多的帮助信息,无视外部命令还是内部命令
选项:
- -d:添加包含info格式帮助文档的目录
- f:指定要读取的info格式的帮助文档
- -n:指定首先访问的info帮助文件的节点
- -o:输出被选择的节点内容到指定文件
参数:
帮助主题:指定需要获得帮助的主题,可以是指令、函数以及配置文件
快捷键:
-
上箭头 向上移动一行
-
下箭头 向下移动一行
-
PgUp 向上翻一页
-
PgDn 向下翻一页
-
Tab 在有"*"符号的节点间进行切换
-
回车 进入有"*"符号的子页面,査看详细帮助信息
-
u 进入上一层信息(回车是进入下一层信息)
-
n 进入下一小节信息
-
P 进入上一小节信息
-
q 退出info信息
命令:
? 显示帮助窗口
在帮助窗口中:
-
Ctrl-x 0 关闭帮助窗口
-
Ctrl-x Ctrl-c 关闭整个 Info
-
q 退出 info
-
n 打开与本 Node 关联的下一个 Node
-
p 打开与本 Node 关联的前一个 Node
-
u 打开与本 Node 关联的上一个 Node
-
l 回到上一次访问的 Node
-
m或g 选择一个菜单项(Node 的名字)
输入指定菜单的名字后按回车,打开指定菜单项关联的 Node -
空格键 下一页(PageDown 也可以,下一页从当前页的最后两行开始算起)
-
Del 键 上一页(PageUp 也可以,上一页从当前页的开始两行开始算起)
上一个 Node (若当前页 Node 文档的开始) -
b 或 t 或 Home 文档的开始(b 是 begining 的意思)
-
e 或 End 文档的末尾(b 是 ending 的意思)
-
Ctrl-l 刷新当前页,若当前文档显示情况有问题时
-
Ctrl-g 取消所键入的指令
9. man 命令
语法:man [命令]
用途:man命令会列出一份完整的说明。 其内容包括命令语法、各选项的意义及相关命令 。更为强大的是,不仅可以查看Linux中命令的使用帮助,还可以查看软件服务配置文件、系统调用、库函数等帮助信息
参数:
-
-a 在所有的man帮助手册中搜索
-
-d 主要用于检查,如果用户加入了一个新的文件,就可以用这个参数检查是否出错
-
-f 显示给定关键字的简短描述信息
-
-p 指定内容时使用分页程序
-
-M 指定man手册搜索的路径
-
-w 显示文件所在位置
man的构成:
- 用户命令的使用方法,可以使用的参数等
- 系统调用,只有系统才能执行的函数
- 库调用,大多是libc函数,如qsort(3)
- 设备和特殊文件
- 文件格式和约定
- 游戏
- 宏命令包和约定
- 系统管理命令,多数只有root可以执行
- 内核程序
- Tcl或Tk指令
10. 命名规则
大小写、数字、英文句号、下划线
隐藏文件以英文句号开始命名
11. 文件类型对应后缀
-
- 常规文件
-
d 目录
-
l 链接
-
c 特殊的文件
-
s 套接字
-
p 命名管道
-
b 块设备
12. touch 命令
语法:touch [option][fileName]
用途:创建文件和修改文件或者目录的时间戳 (会覆盖)
参数:
-
-a 只修改文件的access(访问)时间.
-
-c 或–no-create 不创建不存在的文件。
-
-d 使用指定的日期时间,而非现在的时间
-
-m 指修改Modify(修改)时间,而不修改access(访问)时间
-
-r file 使用指定file文件的时间戳(access,modify)更新文件的时间(access,modify)
注:access 表示最后一次访问(仅仅是访问,没有改动)文件的时间 -
modify 表示最后一次修改文件的时间
-
change 表示最后一次对文件属性改变的时间,包括权限,大小,属性等等
-
-t 将时间修改为参数指定的日期,如:07081556代表7月8号15点56分
用例:
-
创建空文件file1
touch file1
-
将文件file1的时间记录更改为9月17日19点30分
touch -c -t 09171930 /root/file1
Bash -
/root/file4文件的访问/修改时间(atime和mtime)设置成与/etc/passwd文件相同
touch -r /etc/passwd /root/fi
13. mkdir 命令
全拼:make directory
语法:mkdir [option] directory…
用途:如果目录不存在,那么就创建目录
参数:
-
–version 显示命令版本信息
-
–help 显示帮助文档
-
-m | --mode=MODE 设置目录的权限
-
-p | --parents 创建多层目录的时候,如果父目录不存在,那么首先创建父目录
-
-v | --vervose 显示执行过程
用例:
- 创建一个最大权限的目录
mkdir -m 777 test
- 创建目录及其父目录
mkdir -v test01/test
//目录test01不存在,无法在其下创建test目录
mkdir: 无法创建目录"test01/test": 没有那个文件或目录
mkdir -p -v test01/test
//使用选项-p,当目录test01不存在的时候,首先创建test01
mkdir: 已创建目录 “test01”
mkdir: 已创建目录 “test01/test”
You have new mail in /var/spool/mail/多数只有root可以执行
14. cp 命令
全拼:copy file
语法:cp
用途:主要用来复制文件和目录,同时借助某些选项,还可以实现复制整个目录,以及比对两文件的新旧而予以升级等功能
参数:
-
a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-
-d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
-
-f:覆盖已经存在的目标文件而不给出提示。
-
-i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答 y 时目标文件将被覆盖。
-
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-
-l:不复制文件,只是生成链接文件
用例:
-
复制多个文件到目标文件(夹)下
命令格式为:cp 源文件1 源文件2 目标文件夹 或 cp 文件* 目标文件夹 -
复制源文件夹到目标文件夹下:
命令格式为:cp -r 源文件夹 目标文件夹 -
只有源文件比目标文件新时,才会将源文件复制给目标文件,否则,及时执行了命令,也不会执行复制:
命令格式为:cp -u 源文件 目标文件
15. mv 命令
全拼:move file
语法:mv [option] |
用途:用来为文件或目录改名、或将文件或目录移入其它位置
参数:
-
-b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份
-
-i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作
-
-f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件
-
-n: 不要覆盖任何已存在的文件或目录
-
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作
命令格式一图过:
-
mv source_file(文件) dest_file(文件)
将源文件名 source_file 改为目标文件名 dest_file -
mv source_file(文件) dest_directory(目录)
将文件 source_file 移动到目标目录 dest_directory 中 -
mv source_directory(目录) dest_directory(目录)
目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory -
mv source_directory(目录) dest_file(文件)
出错
16. rm 命令
全拼:remove
语法:remove [option] name…
用途:命令用于删除一个文件或者目录
参数:
-
-i 删除前逐一询问确认
-
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认
-
-r 将目录及以下之档案亦逐一删除
注意,rm 命令是一个具有破坏性的命令,因为 rm 命令会永久性地删除文件或目录,这就意味着,如果没有对文件或目录进行备份,一旦使用 rm 命令将其删除,将无法恢复,因此,尤其在使用 rm 命令删除目录时,要慎之又慎。
用例:
全部删除:
rm -rf
17. rmdir 命令
全拼:remove directory
语法:rmdir [option] directory
用途:删除空目录,删不空会报错
参数:
-
-p或–parents:删除指定目录后,若该目录的上层目录已变成空目录,则将其一并删除
-
–ignore-fail-on-non-empty:此选项使rmdir命令忽略由于删除非空目录时导致的错误信息
-
-v或-verboes:显示命令的详细执行过程
-
–help:显示命令的帮助信息
-
–version:显示命令的版本信息
-
-r : 递归删除一个目录中的所有文件和该目录本身,但是这样做存在很大的危险性
用例:
- 将工作目录下,名为 AAA 的子目录删除 :
rmdir AAA
- 在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删除后,BBB 目录成为空目录,则 BBB 亦予删除。
rmdir -p BBB/Test
第三课
1. vi和vim
区别:
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
vi/vim的使用:
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
命令模式:
用户刚刚启动 vi/vim,便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。
以下是常用的几个命令:
- i 切换到输入模式,以输入字符。
- x 删除当前光标所在处的字符。
- : 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。
命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式:
在命令模式下按下i就进入了输入模式。
在输入模式中,可以使用以下按键:
- 字符按键以及Shift组合,输入字符
- ENTER,回车键,换行
- BACK SPACE,退格键,删除光标前一个字符
- DEL,删除键,删除光标后一个字符
- 方向键,在文本中移动光标
- HOME/END,移动光标到行首/行尾
- Page Up/Page Down,上/下翻页
- Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
- ESC,退出输入模式,切换到命令模式
- 底线命令模式
- 在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
- q 退出程序
- w 保存文件
- 按ESC键可随时退出底线命令模式。
vi/vim按键说明:
第一部分:一般模式可用的光标移动、复制粘贴、搜索替换等
移动光标的方法:
- h 或 向左箭头键(←) 光标向左移动一个字符
- j 或 向下箭头键(↓) 光标向下移动一个字符
- k 或 向上箭头键(↑) 光标向上移动一个字符
- l 或 向右箭头键(→) 光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 “30j” 或 “30↓” 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
-
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
-
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
-
[Ctrl] + [d] 屏幕『向下』移动半页
-
[Ctrl] + [u] 屏幕『向上』移动半页
-
+光标移动到非空格符的下一行
-
-光标移动到非空格符的上一行
-
n 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
-
0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
-
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
-
H 光标移动到这个屏幕的最上方那一行的第一个字符
-
M 光标移动到这个屏幕的中央那一行的第一个字符
-
L 光标移动到这个屏幕的最下方那一行的第一个字符
-
G 移动到这个档案的最后一行(常用)
-
nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
-
gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
-
n n 为数字。光标向下移动 n 行(常用)
搜索替换
-
/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
-
?word 向光标之上寻找一个字符串名称为 word 的字符串。
-
n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
-
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词! -
:n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:
『:100,200s/vbird/VBIRD/g』。(常用) -
:1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
-
:1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)
删除、复制与贴上
-
x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
-
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
-
dd 删除游标所在的那一整行(常用)
-
ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
-
d1G 删除光标所在到第一行的所有数据
-
dG 删除光标所在到最后一行的所有数据
-
d$ 删除游标所在处,到该行的最后一个字符
-
d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
-
yy 复制游标所在的那一行(常用)
-
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
-
y1G 复制游标所在行到第一行的所有数据
-
yG 复制游标所在行到最后一行的所有数据
-
y0 复制光标所在的那个字符到该行行首的所有数据
-
$ 复制光标所在的那个字符到该行行尾的所有数据
-
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
-
J 将光标所在行与下一行的数据结合成同一行
-
c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
-
u 复原前一个动作。(常用)
-
Ctrl]+r 重做上一个动作。(常用)
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)
第二部分:一般模式切换到编辑模式的可用的按钮说明
进入输入或取代的编辑模式
-
i, I 进入输入模式(Insert mode):
-
i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用)
-
a, A 进入输入模式(Insert mode):
a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用) -
o, O 进入输入模式(Insert mode):
这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用)
- r, R 进入取代模式(Replace mode):
r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
上面这些按键中,在 vi 画面的左下角处会出现『–INSERT–』或『–REPLACE–』的字样。 由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!
- [Esc] 退出编辑模式,回到一般模式中(常用)
第三部分:一般模式切换到指令行模式的可用的按钮说明
指令行的储存、离开等指令
-
:w 将编辑的数据写入硬盘档案中(常用)
-
:w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
-
:q 离开 vi (常用)
-
:q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~ -
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
-
ZZ 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出)
-
ZQ 不保存,强制退出。效果等同于 :q!。
-
:w [filename] 将编辑的数据储存成另一个档案(类似另存新档)
-
:r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
-
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。
-
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如
-
『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!
vim 环境的变更 -
:set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
-
:set nonu 与 set nu 相反,为取消行号!
特别注意,在 vi/vim 中,数字是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。
举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前,如我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。
2. wc 命令
全拼:word count
语法: wc [option] [–version][文件…]
用途:计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据
参数:
- -c或–bytes或–chars 只显示Bytes数。
- -l或–lines 显示行数。
- -w或–words 只显示字数。
- –help 在线帮助。
- –version 显示版本信息。
注意:
-
如果你做试验的文件的编码格式是 UTF-8 或其他,则可能会影响统计结果,因为不同编码格式中汉字所占的字节数各不相同。
-
- 当用 -c 时,你会发现其实制表符也没什么特殊的,只是算作一个字符(\t),因为它的确就只是一个字符而已。
- 而当使用 -w 时,制表符和空格没什么两样,都是作为字的间隔来看待。
- 当使用 -m 时,从视觉上,你以为 hello 和 world 之间是有 3 个空格,其实 wc 只把它算作一个字符,即 Tab 制表符。
3. head和tail 命令
语法: head | head [n]
tail | tail [n]
用途:默认显示对应文件的前十/后十行,表示显示行数
4. > 命令
全拼:Output redirection
语法:
-
命令 > 文件 将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。
-
命令 2> 文件 将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,会清空原有数据,再写入新数据。
-
命令 >> 文件 将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。
-
命令 >> 文件 2>&1 或者 命令 &>> 文件 将标准输出或者错误输出写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。注意,第一种格式中,最后的 2>&1 是一体的,可以认为是固定写法。
注意:>会覆盖已有,>>会在后面追加
5. | 命令
全拼:Pipeline
语法:命令1 | 命令2(可嵌套使用)
用途:系统会将命令1的标准输出重定向为命令2的标准输入。可以在任何两个命令之间插入管道符。管道操作符之前的命令将把输出写到标准输出上。而管道后的命令将把这个标准输出当作它的标准输入来读入。
用例:
-
选择性删除命令:
echo ‘文件名’ |xargs rm
或者find -name “文件名"|xargs rm -rf
-
我们希望找到文件在其文件名或文件扩展中包含"页面"一词的文件
ls | grep '字段'
第四课
1. groupadd 命令
语法:groupadd [option] < groupname >
用途:命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中
参数:
-
-g:指定新建工作组的 id
-
-r:创建系统工作组,系统工作组的组ID小于 500
-
-K:覆盖配置文件 “/ect/login.defs”
-
-o:允许添加组 ID 号不唯一的工作组
-
-f,–force: 如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)
用例:
创建一个新的组,并添加组 ID。
groupadd -g 344 runoob
2. groupdel 命令
语法:groupdel [群组名称]
用途:删除群组
注意,不能使用 groupdel 命令随意删除群组。此命令仅适用于删除那些 “不是任何用户初始组” 的群组,换句话说,如果有群组还是某用户的初始群组,则无法使用 groupdel 命令成功删除
3. groupmod 命令
语法:groupmod groupname
用途:用于修改用户组的相关信息
参数:
-
g, --gid GID
给群组指定一个新的GID,即修改组ID。(类似groupadd,-g可和-o选项一起使用,指定一个已存在的GID给目标组)注意:
- 将更新将该组作为主组的用户,且保留该组继续作为用户的主组
- 任何具有旧组ID且必须继续属于组的文件,都必须手动更改其组ID
-
-n, --new-name NEW_GROUP 指定要更改的组名
-
-o, --non-unique 需和-g选项一起使用,允许为指定的组添加一个已存在的GID,即共享一个GID,使该GID不再具备唯一性
-
-p, --password PASSWORD 指定组密码
-
-R, --root CHROOT_DIR 指定在CHROOT_DIR(改变后的根目录)下更改生效以及使用CHROOT_DIR目录下的配置文件
用例:
- 把组名group1修改为testgrp
groupmod -n testgrp group1
4. 用户名规则
-
按约定长度小于8个字符
-
大小写敏感的
-
按照惯例都是小写的
-
用户名中允许有数字
-
不要使用特殊字符
5. useradd 命令
语法:useradd [option] < username >
用途:创建新系统用户
参数:
-
-u UID 手工指定用户的 UID,注意 UID 的范围(不要小于 500)
-
-d 主目录 手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限
-
-c 用户说明 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置
-
-g 组名 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录
-
-G 组名 指定用户的附加组。我们把用户加入其他组,一般都使用附加组
-
-s shell 手工指定用户的登录 Shell,默认是 /bin/bash
-
-e 曰期 指定用户的失效曰期,格式为 “YYYY-MM-DD”。也就是 /etc/shadow 文件的第八个字段
-
-o 允许创建的用户的 UID 相同。例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0
-
-m 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的
-
-r 创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录
用例:
-
添加一般用户
useradd tt
-
为添加的用户指定相应的用户组
useradd -g root tt
-
创建一个系统用户
useradd -r tt` -
为新添加的用户指定home目录
useradd -d /home/myd tt` -
建立用户且制定ID
useradd caojh -u 544
6. usetdel 命令
全拼:user delete
语法:userdel [option] < username >
用途:用于删除指定的用户及与该用户相关的文件
参数:
-
-f:强制删除用户,即使用户当前已登录
-
-r:删除用户的同时,删除与用户相关的所有文件
用例:
-
直接使用命令,即可删除用户
userdel test
但是如果用户相关进程正在运行,则无法直接删除 -
对于无法直接删除的命令,可使用-f选项强制删除
userdel -f test
一般删除完用户之后,其相关数据文件还存在,这就需要加上-r选项,加上-r选项后,用户相关用户数据全部清除了
userdel -r test
7. usermod 命令
语法:usermod [option] < username >
用途:修改用户帐号的各项设定
参数:
-
-c 用户说明:修改用户的说明信息,即修改 /etc/passwd 文件目标用户信息的第 5 个字段
-
-e 日期:修改用户的失效曰期,格式为 “YYYY-MM-DD”,即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段
-
-g 组名:修改用户的初始组,即修改 /etc/passwd 文件目标用户信息的第 4 个字段(GID)
-
-u UID:修改用户的UID,即修改 /etc/passwd 文件目标用户信息的第 3 个字段(UID)
-
-G 组名:修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件
-
-l 用户名:修改用户名称
-
-L:临时锁定用户(Lock)
-
-U:解锁用户(Unlock),和 -L 对应
-
-s shell:修改用户的登录 Shell,默认是 /bin/bash
用例:
-
更改登录目录
usermod -d /home/hnlinux root
-
改变用户的uid
usermod -u 777 root
7. whoami 命令
语法:whoami [option]
用途:用于显示自身用户名称
参数:
-
–help
在线帮助 -
–version
显示版本信息
8. who 命令
语法:who [option] [fileName]
用途:目前登录系统的用户信息。执行who命令可得知目前有那些用户登入系统,单独执行who命令会列出登入帐号,使用的终端机,登入时间以及从何处登入或正在使用哪个X显示器
参数:
-
-H或–heading:显示各栏位的标题信息列
-
-i或-u或–idle:显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串
-
-m:此参数的效果和指定"am i"字符串相同
-
-q或–count:只显示登入系统的帐号名称和总人数
-
-s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题
-
-w或-T或–mesg或–message或–writable:显示用户的信息状态栏
-
–help:在线帮助
-
–version:显示版本信息
fileName:指定查询文件
用例:
-
显示当前登录系统的用户
who
//显示当前登录系统的用户 -
显示标题栏
who -H
-
显示用户登录来源
who -l -H
-
显示终端属性
who -T -H
-
只显示当前用户
who -m -H
-
精简模式显示
who -q
9. who am i 命令
语法:who am i
用途:用来打印登陆当前 Linux 系统的用户名 (用于区别你的权限是不是su过去的)
10. id 命令
语法:id [option] < username >
用途:可以显示真实有效的用户ID(UID)和组ID(GID)
参数:
-
-g或–group 显示用户所属群组的ID
-
-G或–groups 显示用户所属附加群组的ID
-
-n或–name 显示用户,所属群组或附加群组的名称
-
-r或–real 显示实际ID
-
-u或–user 显示用户ID
-
-help 显示帮助
-
-version 显示版本信息
用例:
- 显示当前用户信息
id
//显示当前用户ID
uid=0(root)gid=0(root)groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t
11. su 命令
全拼:switch user
语法:su [option] [user][ARG]
用途:用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码
参数:
-
-f 或 --fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh
-
-m -p 或 --preserve-environment 执行 su 时不改变环境变数
-
-c command 或 --command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者
-
-s shell 或 --shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell
-
–help 显示说明文件
-
–version 显示版本资讯
-
- -l 或 --login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root
-
USER 欲变更的使用者帐号
-
ARG 传入新的 shell 参数
用例:
-
变更帐号为 root 并在执行 ls 指令后退出变回原使用者
su -c ls root
-
变更帐号为 root 并传入 -f 参数给新执行的 shell
su root -f
-
变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)
su - clsung
12. 文件权限
-
r“只读”权限
-
w“写”许可
-
x“执行”许可
一共九位,前三位表示你的权限,中间三位表示组的权限,后面三位表示所有人的权限,有权限就有对应字母,无权限则是用划线’-代替
归属人
归属组
13. chmod 命名
使用权限 : 所有使用者
语法
chmod [-cfvR] [–help] [–version] mode file…
参数说明
mode : 权限设定字串,格式如下 :
[ugoa…][[±=][rwxX]…][,…]
其中:
u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
其他参数说明:
-c : 若该文件权限确实已经更改,才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
–help : 显示辅助说明
–version : 显示版本
因为文件的权限分为3种用户,分别为u(文件所有者)、g(文件的组用户)、o(其他用户),所以777表示u、g、o都是777的权限
chmod 777 test.txt:表示将test.txt文件的读、写、执行权限赋权给所有的用户。
第五课
1. sort 命令
语法:sort file_name
用途:对文本文件内容以行为单位排序
注意: 按字母表排序,空格作为列分割
参数:
-
-b 忽略每行前面开始出的空格字符
-
-c 检查文件是否已经按照顺序排序
-
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符
-
-f 排序时,将小写字母视为大写字母
-
i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符
-
-m 将几个排序好的文件进行合并
-
-M 将前面3个字母依照月份的缩写进行排序
-
-n 依照数值的大小排序(按列排)
-
-u 意味着是唯一的(unique),输出的结果是去完重了的
、 -
-o<输出文件> 将排序后的结果存入指定的文件
-
-r 以相反的顺序来排序
-
+<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位
-
–help 显示帮助
-
–version 显示版本信息
-
[-k field1[,field2]] 按指定的列进行排序
用例:
-
在使用 sort 命令以默认的式对文件的行进行排序,使用的命令如下:
sort testfile
sort 命令将以默认的方式将文本文件的第一列以 ASCII 码的次序排列,并将结果输出到标准输出。 -
使用 cat 命令显示 testfile 文件可知其原有的排序如下:
cat testfile # testfile文件原有排序
test 30
Hello 95
Linux 85
使用 sort 命令重排后的结果如下:
sort testfile
# 重排结果
Hello 95
Linux 85
test 30 -
使用 -k 参数设置对第二列的值进行重排,结果如下:
sort testfile -k 2
test 30
Linux 85
Hello 95
2. uniq 命令
**语法:uniq [OPTION]… [INPUT][OUTPUT]
用途:令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用
注意:不相邻的行不算重复
参数:
- -c或–count 在每列旁边显示该行重复出现的次数
- -d或–repeated 仅显示重复出现的行列
- -f<栏位>或–skip-fields=<栏位> 忽略比较指定的栏位
- -s<字符位置>或–skip-chars=<字符位置> 忽略比较指定的字符
- -u或–unique 仅显示出一次的行列
- -w<字符位置>或–check-chars=<字符位置> 指定要比较的字符
- –help 显示帮助
- –version 显示版本信息
- [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据
- [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)
用例:
- 当重复的行并不相邻时,uniq 命令是不起作用的,即若文件内容为以下时,uniq 命令不起作用:
cat testfile1 原有内容
test 30
Hello 95
Linux 85
test 30
Hello 95
Linux 85
test 30
Hello 95
Linux 85
这时我们就可以使用 sort:
sort testfile1 | uniq
Hello 95
Linux 85
test 30
-
统计各行在文件中出现的次数:
sort testfile1 | uniq -c
3 Hello 95
3 Linux 85
3 test 30 -
在文件中找出重复的行:
sort testfile1 | uniq -d
Hello 95
Linux 85
test 30
3. comm 命令
语法:comm [option] < file1 > < file2 >
用途:
命令用于比较两个已排过序的文件。这项指令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成 3 列显示:第 1 列仅是在第 1 个文件中出现过的列,第 2 列是仅在第 2 个文件中出现过的列,第 3 列则是在第 1 与第 2 个文件里都出现过的列。若给予的文件名称为 - ,则 comm 指令会从标准输入设备读取数据
参数:
-
-1 不显示只在第 1 个文件里出现过的列
-
-2 不显示只在第 2 个文件里出现过的列
-
-3 不显示只在第 1 和第 2 个文件里出现过的列
-
–help 在线帮助
-
–version 显示版本信息
用例:
aaa.txt 与 bbb.txt 的文件内容如下:
cat aaa.txt
aaa
bbb
ccc
ddd
eee
111
222
cat bbb.txt
bbb
ccc
aaa
hhh
ttt
jjj
执行 comm 命令输出结果如下:
comm aaa.txt bbb.txt
第一列 | 第二列 | 第三列 |
---|---|---|
aaa | ||
ccc | ||
aaa | ||
ddd | ||
eee | ||
111 | ||
222 | ||
hhh | ||
ttt | ||
jjj |
4. tr 命令
**语法:tr [OPTION]…< SET1>
用途:对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大
参数:
-
-c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
-
-d, --delete:删除指令字符
-
-s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
-
-t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
-
–help:显示程序用法信息
-
–version:显示程序本身的版本信息
-
字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”
-
字符集2:指定要转换成的目标字符集
字符集合的范围:*
-
\NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)
-
\ 反斜杠
-
\a Ctrl-G 铃声
-
\b Ctrl-H 退格符
-
\f Ctrl-L 走行换页
-
\n Ctrl-J 新行
-
\r Ctrl-M 回车
-
\t Ctrl-I tab键
-
\v Ctrl-X 水平制表符
-
CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
-
[CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
-
[CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
-
[:alnum:] :所有字母字符与数字
-
[:alpha:] :所有字母字符
-
[:blank:] :所有水平空格
-
[:cntrl:] :所有控制字符
-
[:digit:] :所有数字
-
[:graph:] :所有可打印的字符(不包含空格符)
-
[:lower:] :所有小写字母
-
[:print:] :所有可打印的字符(包含空格符)
-
[:punct:] :所有标点字符
-
[:space:] :所有水平与垂直空格符
-
[:upper:] :所有大写字母
-
[:xdigit:] :所有 16 进位制的数字
-
[=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)
用例:
-
将文件testfile中的小写字母全部转换成大写字母,此时,可使用如下命令
cat testfile |tr a-z A-Z
或者
cat testfile |tr [:lower:] [:upper:]
-
去除oops.txt里面的重复的小写字符
tr -s "[a-z]"<oops.txt >result.txt
-
删除空行
tr -s "[\012]" < plan.txt
或
tr -s ["\n"] < plan.txt
-
有时需要删除文件中的^M,并代之以换行
tr -s "[\015]" "[\n]" < file
或
tr -s "[\r]" "[\n]" < file
-
大写到小写
cat a.txt |tr "[a-z]" "[A-Z]" >b.txt
-
删除指定字符
一个星期的日程表。任务是从其中删除所有数字,只保留日期。日期有大写,也有小写格式。因此需指定两个字符范围[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]" "[\012*]"
将文件每行所有不包含在[a-z]或[A-Z](所有希腊字母)的字符串放在字符串1中并转换为一新行。-s选项表明压缩所有新行, -c表明保留所有字母不动。原文件如下,后跟tr命令:
tr -cs "[a-z][A-Z]" "[\012*]" <diary.txt
-
转换控制字符
tr的第一个功能就是转换控制字符,特别是从dos向UNIX下载文件时,忘记设置ftp关于回车换行转换的选项时更是如此。cat -v filename 显示控制字符。
cat -v stat.txt
box aa^^^^12M
apple bbas^^^23M
^Z
猜想‘^ ^ ^ ^ ^ ^’是tab键。每一行以Ctrl-M结尾,文件结尾Ctrl-Z,以下是改动方法。
使用-s选项,查看ASCII表。的八进制代码是136,M是015,tab键是011,^Z是032 ,下面将按步骤完成最终功能。
用tab键替换^ ^ ^ ^ ^ ^,命令为"\136" "[\011*]"
。将结果重定向到临时工作文件stat.tmp
{tr -s "[\136]" "[\011*]" <stat.txt >stat.tmp
用新行替换每行末尾的^M,并用 \n 去除^Z,输入要来自于临时工作文件stat.tmp。
tr -s "[\015][\032]" "\n" <stat.tmp
要删除所有的tab键,代之以空格,使用命令
tr -s "[\011]" "[\040*]" <input.file
-
替换passwd文件中所有冒号,代之以tab键,可以增加可读性
tr -s "[:]" "[\011]" < /etc/passwd
或者
tr -s "[:]" "[\t]" < /etc/passwd
-
使路径具有可读性
如果用echo $PATH
或者echo $LD_LIBRARY_PATH
等类似的命令来显示路径信息的话,我们看到的将会是一大堆用冒号连接在一起的路径, tr命令可以把这些冒号转换为回车,这样,这些路径就具有很好的可读性了
echo $PATH | tr ":" "\n"
-
可以在vi内使用所有这些命令!只要记住:在tr命令前要加上您希望处理的行范围和感叹号 (!),如 1,$!tr -d ‘\t’(美元符号表示最后一行)。
-
另外,当有人给您发送了一个在 Mac OS 或 DOS/Windows 机器上创建的文本文件时,您会发现tr非常有用。
如果没有将文件保存为使用 UNIX 换行符来表示行结束这种格式,则需要将这样的文件转换成本机 UNIX 格式,否则一些命令实用程序不会正确地处理这些文件。Mac OS 的行尾以回车字符(\r)结束,许多文本处理工具将这样的文件作为一行来处理。为了纠正这个问题,可以用下列技巧:
Mac -> UNIX:tr "\r" "\n"<macfile > unixfile
UNIX -> Mac:tr "\n" "\r"<unixfile > macfile
Microsoft DOS/Windows 约定,文本的每行以回车字符(\r)并后跟换行符(\n)结束。为了纠正这个问题,可以使用下列命令:
DOS -> UNIX:tr -d "\r"<dosfile > unixfile
UNIX -> DOS:在这种情况下,需要用awk,因为tr不能插入两个字符来替换一个字符。要使用的 awk 命令为 awk '{ print $0"\r" }'<unixfile > dosfile
注:都可以用sed 来完成。
5. grep 命令
语法: grep [OPTION] “string” file
  或者
  grep [option] “string”
用途:指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据
参数:
-
-a 或 --text : 不要忽略二进制的数据
-
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容
-
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号
-
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容
-
-c 或 --count : 计算符合样式的列数
-
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容
-
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作
-
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式
-
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用
-
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式
-
-F 或 --fixed-regexp : 将样式视为固定字符串的列表
-
-G 或 --basic-regexp : 将样式视为普通的表示法来使用
-
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称
-
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称
-
-i 或 --ignore-case : 忽略字符大小写的差别
-
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称
-
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称
-
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号
-
-o 或 --only-matching : 只显示匹配PATTERN 部分
-
-q 或 --quiet或–silent : 不显示任何信息
-
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同
-
-s 或 --no-messages : 不显示错误信息
-
-v 或 --invert-match : 显示不包含匹配文本的所有行
-
-V 或 --version : 显示版本信息
-
-w 或 --word-regexp : 只显示全字符合的列
-
-x --line-regexp : 只显示全列符合的列
-
-y : 此参数的效果和指定"-i"参数相同
-
string 范本样式(正则表达式)
基本正则表达式和扩展正则表达式
世界上的正则表达式种类繁多且复杂,面对这样的状况,POSIX 将正则表达式进行了标准化,并把实现方法分为了两大类:
-
基本正则表达式(BRE)
-
扩展正则表达式(ERE)
-
^r表示以r开头的行
-
$表示一行的末尾
-
\。$用于以。结尾的行
-
^fi$ 表示中间有fi的行
. 代表且只能代表任意一个字符(不包括空行) -
- 重复前面任意0个或多个字符
-
.* 匹配所有字符。(包括空行)
-
sed -ri ‘s#(.*)#\1#g’ bqh.txt
把前面正则匹配的括号内的结果,在后面用\1取出来操作。 -
^$ 表示空行
-
\ 例. 就只代表点本身,转义符号,让有着特殊身份移动的字符,脱掉马甲,还原原型$
-
^.* 以任意多个字符开头
-
.*$ 以任意多个字符结尾
-
(.*) 从第一字符匹配,到空格停止
-
[abc] 匹配字符集合内的任意一个字符【a-zA-Z】
-
[^abc] 匹配不包括后的任意字符的内容;中括号里的为取反,注意和以…开头区别
-
a{n,m} 重复n到m次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线
-
{n,} 重复至少n次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线
-
{n} 重复n次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线
-
[] 表示字符集,[bcd]art can match bart、cart、dart
-
<string> 匹配单词string,<for>匹配for
扩展的正则表达式:ERP(egrep或grep -E)
-
- 重复一个或一个以上前面的字符
-
? 复0个或一个0前面的字符
-
| 用或的方式查找多个符合的字符串
-
() 找出“用户组”字符串
-
^fi$匹配完全由fi组成的行
两者的区别,更多的是元字符的区别。
在基本正则表达式(BRE)中,只承认“^”、“$”、“.”、“[”、“]”、“*”这些是元字符,所有其他的字符都被识别为普通字符。
而在扩展正则表达式(ERE)中,则在BRE的基础上增加了“(”、“)”、“{”、“}”、“?”和“+”、“|”等元字符。
最后要特别说明的一点,只有在用反斜杠进行转义的情况下,字符“(”、“)”、“{”和“}”才会在扩展正则表达式(ERE)中被当作元字符处理,而在基本正则表达式(ERE)中,任何元字符前面加上反斜杠反而会使其被当作普通字符来处理。这样的设计,有些奇葩
用例:
-
在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
-
以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:
grep -r update /etc/acpi
-
反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
grep -v test *test*
-
搜索/etc/passwd文件中开头是 leo 的行:
^表示行首
grep '^leo' /etc/passwd
第六课
1. ps 命令
全拼:process status
语法:ps [options] [–help]
用途:命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息
参数:
- a:显示一个终端的所有进程,除会话引线外;
- u:显示进程的归属用户及内存的使用情况;
- x:显示没有控制终端的进程;
- -l:长格式显示更加详细的信息;
- -e:显示所有进程;
- -f: 完整的清单格式
- -w: 加宽显示更多信息
- -p: 显示PID 的信息
- -eH: 树状显示
可以看到,ps 命令有些与众不同,它的部分选项不能加入"-“,比如命令"ps aux”,其中"aux"是选项,但是前面不能带“-”。
大家如果执行 “man ps” 命令,则会发现 ps 命令的帮助为了适应不同的类 UNIX 系统,可用格式非常多,不方便记忆。所以,我建议大家记忆几个固定选项即可。比如:
- aux 可以查看系统中所有的进程;
- -le 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
- -l 只能看到当前 Shell 产生的进程;
字段:
-
USER 该进程是由哪个用户产生的。
-
PID 进程的 ID。
-
%CPU 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。
-
%MEM 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源
。 -
VSZ 该进程占用虚拟内存的大小,单位为 KB。
-
RSS 该进程占用实际物理内存的大小,单位为 KB。
-
TTY 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。
-
STAT 进程状态。常见的状态有以下几种:
- -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
- -R:该进程正在运行。
- -S:该进程处于睡眠状态,可被唤醒。
- -T:停止状态,可能是在后台暂停或进程处于除错状态。
- -W:内存交互状态(从 2.6 内核开始无效)。
- -X:死掉的进程(应该不会出现)。
- -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
- -<:高优先级(以下状态在 BSD 格式中出现)。
- -N:低优先级。
- -L:被锁入内存。
- -s:包含子进程。
- -l:多线程(小写 L)。
- -+:位于后台。
-
START 该进程的启动时间。
-
TIME 该进程占用 CPU 的运算时间,注意不是系统时间。
-
COMMAND 产生此进程的命令名
用例:
-
查找指定进程格式:
ps -ef | grep 进程关键字
-
显示指定用户信息
ps -u username
-
显示所有进程信息,连同命令行
ps -ef
-
只想查看一下当前产生了哪些进程
ps -l
2. 前台与后台进程
-
常规命令在前台执行
-
任何时候都只有一个前台进程
-
命令+&
启动命令在后台。 -
Ctrl-c
终止前台进程。 -
Ctrl-z
暂停前台进程(放到后台) -
jops命令
在后台列出所有进程 -
fg #
# 表示进程号。把#号作业放在前台
文章目录
3. 时间表 at命令和cron命令
1. at:
用途:一次性定时任务计划执行
语法:at [option]
参数:
-
-m 当 at 工作完成后,无论命令是否输出,都用 E-mail 通知执行 at 命令的用户。
-
-c 工作标识号 显示该 at 工作的实际内容。
-
-t 时间 在指定时间提交工作并执行,时间格式为 [[CC]YY]MMDDhhmm。
-
-d 删除某个工作,需要提供相应的工作标识号(ID),同 atrm 命令的作用相同。atrm #
-
-l 列出当前所有等待运行的工作,和 atq 命令具有相同的额作用。或 atq
-
-f 脚本文件 指定所要提交的脚本文件。
at 命令时间参数可用格式:
-
HH:MM 比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。
-
Midnight(midnight) 代表 12:00 AM(也就是 00:00)。
-
Noon(noon) 代表 12:00 PM(相当于 12:00)。
-
Teatime(teatime) 代表 4:00 PM(相当于 16:00)。
-
英文月名 日期 年份 比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。
-
MMDDYY、MM/DD/YY、MM.DD.YY 比如 011518 表示 2018 年 1 月 15 号。
-
now+时间 以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。
玩法:
第一步:先用rpm -q at
检查是否有安装at软件包,如果没有则用yum -y install at
安装
第二步:用service atd start
开启服务(如果想让服务在开机就启动,可以用chkconfig atd on
设置)
第三步:按语法输入参数和时间
第四步:按行输入这次要执行的指令
第五步:用D 即是ctrl+shift+d保存并退出设置
注意事项:date时间已过,会在下个周期执行指令。有些命令是权限不够无法执行的,可以先在外面跑一次或者sudo +at+option+date的方式执行
2. crontab
用途 :每天定时任务计划执行
全拼:cron table
语法:crontab [-u username] [option]
省略用户表表示操作当前用户的crontab
参数:
- -e :编辑工作表
- -l :列出工作表里的命令
- -r :删除工作作
- -i :删除前询问确认
cron格式
-
econds(秒) :可以用数字0-59 表示,
-
Minutes(分) :可以用数字0-59 表示,
-
Hours(时) :可以用数字0-23表示,
-
Day-of-Month(天) :可以用数字1-31 中的任一一个值,但要注意一些特别的月份
-
Month(月) :可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
-
Day-of-Week(每周):可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
-
“/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行
-
“?”:表示每月的某一天,或第周的某一天
-
“L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”
-
“W”:表示为最近工作日,如“15W”放在每月(day-of-month)字段上表示为“到本月15日最近的工作日”
-
““#”:是用来指定“的”每月第n个工作日,例 在每周(day-of-week)这个字段中内容为"6#3" or “FRI#3” 则表示“每月第三个星期五”
Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名 | 允许的值 | 允许的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
日 | 1-31 | , - * ? / L W C |
月 | 1-12 or JAN-DEC | , - * / |
周几 | 1-7 or SUN-SAT | , - * ? / L C # |
年(可选 | empty, 1970-2099 | , - * / |
-
“?”字符:表示不确定的值
-
“,”字符:指定数个值
-
“-”字符:指定一个值的范围
-
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
-
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
-
“W”字符:指定离给定日期最近的工作日(周一到周五)
-
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
实例:
实例1:每1分钟执行一次myCommand
* * * * * myCommand
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
实例11:每一小时重启smb
0 */1 * * * /etc/init.d/smb restart
实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart
七列的实例二:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
玩法1:
第一步:systemctl enable crond启动服务
第二步:先vim一个txt文件,在里面按行编辑指令,并保存退出
第三步:crontab filename 完成安装
玩法2:
第一步:systemctl enable crond启动服务
第二步:crontab [-u username] -e 指定计划任务的用户,并开始按行编辑
第三步: :wr! :q 保存并退出
第七课
1. 配置网络
-
第一步,检查网络配置
-
第二步,使用ifconfig检查网络接口
-
lo:本地环回网络
-
virbr0:虚拟网卡,由于libvirtd服务应该被删除
-
inet 192.168.253.129 # IP地址
-
netmask 255.255.255.0 # 子关掩码
-
broadcast 192.168.253.255 # 广播地址
-
inet6 fe80::be20:fae6:7af2:e4e6 # IPv6地址
-
ether 00:0c:29:6b:e2:63 # Mac地址
- 第三步,移除虚拟网卡和Libvired服务
-
su过去,需要root权限做后面的操作
-
ifconfig virbr0 down
移除虚拟网卡 -
systemctl disable libvirtd.service
关闭Libvired服务
-
用
ifconfig
再次检查网络接口
发现virbr0已经不存在了 -
修改配置设备配置文件
-
cd /etc/sysconfig/network-scripts/ifcfg-ens#
#代表你的设备编号 -
用
vim filename
开始修改该文件 filename是指上面文件的名字 -
把 ONBOOT=no改成 ONBOOT=yes
-
保存并退出
-
重启网络服务
systemctl restart network.service
重启网络服务,必要时可以考虑重启虚拟机 -
检查网络配置成果
ping www.baidu.com
,能ping通即大功告成!!!
2.ifconfig-ens#
查看网络配置
-
TYPE=Ethernet # 以太网,有线网络,而不是WIFI
-
PROXY_METHOD=none
-
BROWSER_ONLY=no
-
BOOTPROTO=dhcp # 通过DHCP自动获取IP地址,等于static就是静态IP
-
DEFROUTE=yes
-
IPV4_FAILURE_FATAL=no
-
IPV6INIT=yes
-
IPV6_AUTOCONF=yes
-
IPV6_DEFROUTE=yes
-
IPV6_FAILURE_FATAL=no
-
IPV6_ADDR_GEN_MODE=stable-privacy
-
NAME=ens33
-
UUID=0b371ad6-9fd0-4920-abb8-b987213a1d7e
-
DEVICE=ens33
-
ONBOOT=yes # 系统启动时自动启动,如果等于no则需要手动启动
3.软件包管理
1.RPM
什么是RPM:
RPM包管理器(RPM)是Red Hat Linux及其派生产品(如CentOS和Fedora)使用的一个强大的包管理系统。
RPM还包括RPM命令和。RPM文件格式。
RPM包由文件和元数据(包括依赖关系和安装位置等信息)的归档文件组成。
2.什么是YUM
YUM (Yellowdog Updater Modified)是基于RPM (RedHat package Manager)的Linux系统的开源包管理工具。
它允许用户和系统管理员轻松地安装、更新、删除或搜索系统上的软件包。 你
YUM使用大量第三方存储库来自动安装包,解决它们的依赖关系问题。
yum repo 地址:
/etc/yum.repos.d/???.repo
-
yum install package_name
安装包和所有依赖项 -
yum install -y package_name
自动安装,没有问题问 -
yum remove package_name
完全删除一个包及其所有依赖项 -
yum update package_name
更新到最新的稳定版本 -
yum list name
确切的名称匹配 -
yum search name
搜索与名称相关的包 -
yum list installed
列出所有已安装的软件包 -
yum check-update
查看系统上安装的软件包中有多少可用的更新 -
yum update
用所有最新的补丁和安全更新更新您的操作系统
两者区别:
rpm相当于windows里面的控制面板中程序卸载与安装的功能,它是一个本地软件包的管理器。
yum是基于rpm的一个软件包管理工具,它可以从网上下载rpm包和依赖。
区别:
rpm管理本地包的安装、卸载、查询,rpm无法解决软件包的依赖关系
yum拥有rpm的功能,还具备了从网络上下载rpm包和依赖的功能
3.SSH远程登录
什么是SSH:
SSH (Secure Shell)是一种远程管理协议,允许用户控制和修改Internet上的远程服务器。
创建该服务是作为未加密Telnet的安全替代,并使用加密技术确保与远程服务器之间的所有通信都以加密的方式进行。
它提供了一种机制,用于对远程用户进行身份验证,将输入从客户机传输到主机,并将输出发回客户机。
参数:
-
-1 强制使用ssh协议版本1
-
-2 强制使用ssh协议版本2
-
-4 强制使用IPv4地址
-
-6 强制使用IPv6地址
-
-A 开启认证代理连接转发功能
-
-a 关闭认证代理连接转发功能
-
-b<IP地址> 使用本机指定的地址作为对位连接的源IP地址
-
-C 请求压缩所有数据
-
-F<配置文件> 指定ssh指令的配置文件,默认的配置文件为“/etc/ssh/ssh_config”
-
-f 后台执行ssh指令
-
-g 允许远程主机连接本机的转发端口
-
-i<身份文件> 指定身份文件(即私钥文件)
-
-l<登录名> 指定连接远程服务器的登录用户名
-
-N 不执行远程指令
-
-o<选项> 指定配置选项
-
-p<端口> 指定远程服务器上的端口
-
-q 静默模式,所有的警告和诊断信息被禁止输出
-
-X 开启X11转发功能
-
-x 关闭X11转发功能
-
-y 开启信任X11转发功能
*如果客户端跟服务端有相同的用户名,那么可以ssh serviceIP
,通用是ssh serviceUsername @serviceIP
例子:
ssh 10.22.75.212
和ssh qiangzibro@10.22.75.212
4.SPY命令
全拼: secure copy
用途:Linux 系统下基于 ssh 登陆进行安全的远程文件和目录拷贝命令
安全性:scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版
语法:scp [option] file_source file_target
参数:
-
-1: 强制scp命令使用协议ssh1
-
-2: 强制scp命令使用协议ssh2
-
-4: 强制scp命令只使用IPv4寻址
-
-6: 强制scp命令只使用IPv6寻址
-
-B: 使用批处理模式(传输过程中不询问传输口令或短语)
-
-C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-
-p:保留原文件的修改时间,访问时间和访问权限。
-
-q: 不显示传输进度条。
-
-r: 递归复制整个目录。
-
-v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-
-c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-
-F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-
-i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-
-l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
-
-o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
-
-P port:注意是大写的P, port是指定数据传输用到的端口号
-
-S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
用例:
复制文件:
-
scp /home/space/music/1.mp3 root@192.168.120.204:/home/root/others/music
-
scp /home/space/music/1.mp3 root@192.168.120.204.runoob.com:/home/root/others/music/001.mp3
-
scp /home/space/music/1.mp3 192.168.120.204:/home/root/others/music
-
scp /home/space/music/1.mp3 192.168.120.204:/home/root/others/music/001.mp3
(区别:
第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;
第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;)
复制目录:
5. scp -r /home/space/music/ root@192.168.120.204.com:/home/root/others/
scp -r /home/space/music/ 192.168.120.204:/home/root/others/
(区别:
第5个指定了用户名,命令执行后需要再输入密码;
第5个没有指定用户名,命令执行后需要输入用户名和密码;
)
如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号:
7. scp -P 4588 remote@192.168.120.204:/usr/local/sin.sh /home/administrator
从远程服务器复制到本地机器和把本地复制到远程服到服务器一样,改到第一个和第二个参数的顺序就行
scp root@192.168.120.204:/home/root/others/music /home/space/music/1.mp3
第八课
1. shell编程
-
创建一个脚本文件:
vim my_shell.sh
.sh后缀是约定俗成,可以不一样。 -
在文件里面按行输入命令
第一行先输入#!/bin/bash
指定bash作为解释器,后面按行输入命令后即可保存并退出 -
执行脚本
玩法一:
sh shell_file_name
玩法二:
先chmod +x shell_file_name
然后./shell_file_name
注意:可以用绝对路径代替./
2. 变量
- 变量定义命名规则:
-
不超过256个字符
-
区分大小写的,LEI和lei是不一样的
-
可以使用大写和小写字母,数字,“_”(下划线)符号
-
第一个字符不能是数字
-
不能使用系统保留名
定义语法:VariableName="Value"
定义只读变量:`readonly VariableName=“Value”
**清空变量:unset VariableName
2. 调用 玩法一:
$VariableName `
玩法二:
${VariableName}
玩法三:
`VariableName`
- 系统变量
常用:
- $HOSTNAME
- $USER
- $UID
- $USERNAME
- $SHELL
- $HOME
- $PWD
- $PATH
env
可以查看所有系统变量
什么是$PATH:
由’:'分隔的一组路径
告诉shell在响应用户发出的命令时搜索可执行文件(即准备运行的程序)的目录
更改 P A T H : ‘ P A T H = PATH: `PATH= PATH:‘PATH=PATH:NewPath`
3. ''和""
相通:
它们都指定了字符串
区别:
" "允许$Var, ${Var}, $(cmd)和’ cmd '在里面工作
’ '排除任何元字符,接受内部的任何内容
4.字符串
- 转义字符
需要转义的字符: ‘’ “” $ \
转义方法:前面加\
echo -e时:\n代表换行,\t代表制表符tab
-
长度属性
${#string_name}
获取长度
例子:
[lei@localhost ~]$ Str=‘abcdefgh’
[lei@localhost ~]$ echo ${#Str}
8 -
字符串截取
${string_name:m:n}
(闭区间)
例子:
[lei@localhost ~]$ Str=‘abcdefgh’
[lei@localhost ~]$ echo ${Str:1:3}
bcd
5.命令别名
语法:`alias NAME=‘COMMAND’``
删除别名: unalias NAME
枚举所有别名: alias
第九课
1.算数运算
-
echo $(( 20 + 5 ))
-
echo $(( 20 - 5 ))
-
echo $(( 20 * 5 ))
-
echo $(( 20 % 3 ))
-
x=5 echo $(( x++ ))
-
x=5 echo $(( x-- ))
-
x=2 y=3 echo $(( x ** y ))
2. 条件和测试
核心: Condition-test && if-True || if-False
测试表达式: [ condition-to-test ]
和test condition-to-test
- [ -e /etc/passwd ]
- test -e /etc/passwd
text
对文件的运算符:
-
-e FILE如果文件存在则为True。
-
-d FILE如果FILE是一个目录,则为True。
-
-f FILE如果文件存在且为常规文件则为True。
-
-r FILE如果文件是可读的,则为True。
-
-w FILE如果文件是可写的,则为True。
-
-x FILE如果文件是你可执行的,则为True。
text
对字符串的运算符:
-
-z String 如果字符串为空则为True。
-
-n String 如果字符串不为空则为True。
-
STRING1 = STRING2 如果两个字符串相等则为True。
-
STRING1 ! = STRING2 如果两个字符串不相等则为True
text
对于算术的运算符:
-
arg1 -eq arg2 如果arg1等于arg2则为True。
-
arg1 -ne arg2 如果arg1不等于arg2则为True。
-
arg1 -lt arg2 如果arg1小于arg2则为True。
-
arg1 -le arg2 如果arg1小于等于arg2则为True。
-
arg1 -gt arg2 如果arg1大于arg2则为True。
-
arg1 -ge arg2 当arg1大于等于arg2时为True。
例子:
- [lei@localhost ~]$ [ 5 -gt 2 ] && echo Y || echo N
Y - [lei@localhost ~]$ [ 5 -gt 22 ] && echo Y || echo N
N - [lei@localhost ~]$ arg1=6
- [lei@localhost ~]$ [ $arg1 -gt 22 ] && echo Y || echo N
N - [lei@localhost ~]$ [ m -gt 22 ] && echo Y || echo N
bash: [: m: integer expression expected
N
3. 逻辑运算符
-
非:
[ ! Statement ]
-
或:
[ Statement1 -o Statement2 ]
[[Statement1 || Statement2 ]]
-
与:
[ Statement1 -a Statement2 ]
[[Statement1 && Statement2 ]]
4. 条件分支
-
if:
if [ condition-is-true ]
then
command 1
command 2
…
command N
fi -
if/else:
if [ condition-is-true ]
then
commands
else
commands
fi -
if/elif/else:
if [ condition-is-true ]
then
commands
elif [ condition-is-true ]
then
commands
else
commands
fi -
case:
case $variable-name in
pattern1)
commands
;;
pattern2)
commands
;;
patternN)
commands
;;
*) # all other cases
commands
;;
esac
例子:
echo 'input a number between 1~4:'
read aNum
case $aNum in
1) echo 'your input is 1'
;;
2) echo 'your input is 2'
;;
3) echo ' your input is 3'
;;
4) echo ' your input is 4'
;;
*) echo 'your input is not in 1~4'
;;
esac
5. read命令
用途:read命令用于从标准输入中读取输入单行,并将读取的单行根据IFS变量分裂成多个字段,并将分割后的字段分别赋值给指定的变量列表var_name。第一个字段分配给第一个变量var_name1,第二个字段分配给第二个变量var_name2,依次到结束。如果指定的变量名少于字段数量,则多出的字段数量也同样分配给最后一个var_name,如果指定的变量命令多于字段数量,则多出的变量赋值为空。
如果没有指定任何var_name,则分割后的所有字段都存储在特定变量REPLY中。
**语法:read <var_name1 var_name2 …>
参数:
-
-a:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的index=0开始。
-
-d:指定读取行的结束符号。默认结束符号为换行符。
-
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。
-
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。
-
-p:给出提示符。默认不支持"\n"换行,要换行需要特殊处理,见下文示例。例如,“-p 请输入密码:”
-
-r:禁止反斜线的转义功能。这意味着""会变成文本的一部分。
-
-s:静默模式。输入的内容不会回显在屏幕上。
-
-t:给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。
例子:
#!/bin/bash
read -p "Enter your name : " name
echo "Hi, $name. Let us be friends!"
第十课
1. 数组
定义语法:array_name=(value1 value2 ... valuen)
数组索引:
-
赋值,通过数组下标进行索引
array_name[index]=value
-
索引可以不连续
-
取值,
${array_name[index]}
例子:
[lei@localhost ~]$ my_array=(hello world)
[lei@localhost ~]$ echo ${my_array[0]}
hello
[lei@localhost ~]$ echo ${my_array[1]}
world
[lei@localhost ~]$ my_array[5]=Linux
[lei@localhost ~]$ echo ${my_array[2]}
[lei@localhost ~]$ echo ${my_array[5]}
Linux[lei@localhost ~]$ echo my_array[5]
my_array[5]
[lei@localhost ~]$ echo $my_array[5]
hello[5]
-
输出整个数组:
${array_name[*]}
或者${array_name[@]}
-
获取数组长度:
${#array_name[@]}
或者${#array_name[*]}
-
获取数组元素长度:
${#array_name[n]}
例子:
[lei@localhost ~]$ echo ${my_array[*]}
hello world Linux
[lei@localhost ~]$ echo ${my_array[@]}
hello world Linux
[lei@localhost ~]$ echo ${#my_array[@]}
3
[lei@localhost ~]$ echo ${#my_array[*]}
3
[lei@localhost ~]$ echo ${#my_array[5]}
5
2. 循环
- for循环
语法:
for var in item1 item2 ... itemN
do
command1
command2
....
commandN
done
for (( EXP1; EXP2; EXP3 ))
do
command1
command2
command3
done
例子:
#!/bin/bash
# A simple shell script to run commands
for command in date pwd ls
do
echo
echo "*** The output of $command command >"
#run command
$command
echo
done
#!/bin/bash
# A shell script to verify user password database
files="/etc/passwd /etc/group /etc/shadow /etc/gshdow"
for f in $files
do
[ -f $f ] && echo "$f file found" || echo "*** Error - $f file missing."
done
#!/bin/bash
# A shell script to print each number five times.
for (( i = 1; i <= 5; i++ )) ### Outer for loop ###
do
for (( j = 1 ; j <= 5; j++ )) ### Inner for loop ###
do
echo "$i "
done
echo "" #### print the new line ###
done
创建列表:
-
{1…5} 从1到5
-
{1…10…2} 从1到10,步长为2
-
{aa,bb,cc} aa到cc
-
{aa,bb,cc}{1…5} 笛卡尔积
- while循环:
语法:
while [ condition ]
do
command1
command2
..
commandN
done
例子:
#!/bin/bash
# set n to 1
n=1
# continue until $n equals 5
while [ $n -le 5 ]
do
echo "Welcome $n times."
n=$(( n+1 )) # increments $n
done
#!/bin/bash
n=1
while (( $n <= 5 ))
do
echo "Welcome $n times."
n=$(( n+1 ))
done
KaTeX parse error: Expected '}', got '#' at position 2: {#̲array_name[@]}和…{#array_name[*]}:
#!/bin/bash
my_arr=(hello kitty)
my_arr[5]='Linux class'
for var in "${my_arr[*]}"
do
echo $var
done
echo '--------------'
for var in "${my_arr[@]}"
do
echo $var
done
echo '--------------'
结果:
hello kitty Linux class
hello
kitty
Linux class
结论:
KaTeX parse error: Expected '}', got '#' at position 2: {#̲array_name[*]}看…{#array_name[@]}理想分割
- until循环:
until循环在返回非零状态之前执行
while命令会一直执行,直到返回零状态为止
until循环总是至少执行一次
语法:
until [ condition ]
do
command1
command2
...
commandN
done
例子:
#!/bin/bash
i=1
until [ $i -gt 6 ]
do
echo "Welcome $i times."
i=$(( i+1 ))
done
##第十一课
- 读入参数:
sh script.sh par1 par2 par3
-
$0 "script.sh"脚本名称
-
$2 "par2 "值的第二个参数
-
$3 "par3 "第三个参数的值
-
$n 第n个参数
-
$# 参数个数
-
$* 所有参数的值
-
$@ 所有参数的值
-
∗
和
*和
∗和@之间的区别
只有"$*"将所有参数作为一个字符串
"
@
"
单独接受每个参数,所有参数作为一个个体列表
]
@"单独接受每个参数,所有参数作为一个个体列表 ~]
@"单独接受每个参数,所有参数作为一个个体列表 ] echo ${#my_array[*]}
3
[lei@localhost ~]$ echo ${#my_array[5]}
5
2. 循环
- for循环
语法:
for var in item1 item2 ... itemN
do
command1
command2
....
commandN
done
for (( EXP1; EXP2; EXP3 ))
do
command1
command2
command3
done
例子:
#!/bin/bash
# A simple shell script to run commands
for command in date pwd ls
do
echo
echo "*** The output of $command command >"
#run command
$command
echo
done
#!/bin/bash
# A shell script to verify user password database
files="/etc/passwd /etc/group /etc/shadow /etc/gshdow"
for f in $files
do
[ -f $f ] && echo "$f file found" || echo "*** Error - $f file missing."
done
#!/bin/bash
# A shell script to print each number five times.
for (( i = 1; i <= 5; i++ )) ### Outer for loop ###
do
for (( j = 1 ; j <= 5; j++ )) ### Inner for loop ###
do
echo "$i "
done
echo "" #### print the new line ###
done
创建列表:
-
{1…5} 从1到5
-
{1…10…2} 从1到10,步长为2
-
{aa,bb,cc} aa到cc
-
{aa,bb,cc}{1…5} 笛卡尔积
- while循环:
语法:
while [ condition ]
do
command1
command2
..
commandN
done
例子:
#!/bin/bash
# set n to 1
n=1
# continue until $n equals 5
while [ $n -le 5 ]
do
echo "Welcome $n times."
n=$(( n+1 )) # increments $n
done
#!/bin/bash
n=1
while (( $n <= 5 ))
do
echo "Welcome $n times."
n=$(( n+1 ))
done
KaTeX parse error: Expected '}', got '#' at position 2: {#̲array_name[@]}和…{#array_name[*]}:
#!/bin/bash
my_arr=(hello kitty)
my_arr[5]='Linux class'
for var in "${my_arr[*]}"
do
echo $var
done
echo '--------------'
for var in "${my_arr[@]}"
do
echo $var
done
echo '--------------'
结果:
hello kitty Linux class
hello
kitty
Linux class
结论:
KaTeX parse error: Expected '}', got '#' at position 2: {#̲array_name[*]}看…{#array_name[@]}理想分割
- until循环:
until循环在返回非零状态之前执行
while命令会一直执行,直到返回零状态为止
until循环总是至少执行一次
语法:
until [ condition ]
do
command1
command2
...
commandN
done
例子:
#!/bin/bash
i=1
until [ $i -gt 6 ]
do
echo "Welcome $i times."
i=$(( i+1 ))
done
##第十一课
- 读入参数:
sh script.sh par1 par2 par3
-
$0 "script.sh"脚本名称
-
$2 "par2 "值的第二个参数
-
$3 "par3 "第三个参数的值
-
$n 第n个参数
-
$# 参数个数
-
$* 所有参数的值
-
$@ 所有参数的值
-
∗
和
*和
∗和@之间的区别
只有"$*"将所有参数作为一个字符串
"$@"单独接受每个参数,所有参数作为一个个体列表