写在前面:
博客书写牢记5W1H法则:What,Why,When,Where,Who,How。
本节主要内容:
◆ bash特征之:命令补全和路径补全
◆ 目录管理命令:
mkdir、rmdir
◆ bash特征之:命令行展开
tree
◆ bash特征之:命令执行状态结果
◆ 文件查看类命令:
more、less、head、tail、stat、touch
◆ 文件管理类命令:
cp、mv、rm
◆ bash特征之:glob(通配符)
◆ bash特征之:变量
set、unset、declare、export、env、printenv、readonly
◆ bash特征之:I/O重定向和管道
tr
回顾:
广义的shell:GUI和CLI
bash特征之:命令补全和路径补全
命令补全:
shell程序在接收到用户执行命令的请求且分析完成之后,最左侧的字符串讲当做命令去查找,分别查找内部命令和外部命令。
由于外部命令文件存储在不同的系统目录中,那么查找外部命令之前就必须让系统知道命令文件路径,而linux中的$PATH变量就是用来存储这个路径的。
$PATH的查找方式为从左到右,当给定的头部字符串能够唯一标识某程序文件名时,则直接补全,不能唯一标识时,再次按tab给出列表。
命令错误时按tab没有响应。
路径补全:
与命令补全类似,当给出的路径名前几个字符串能够唯一标识路径或文件名时,按tab会自动补全
不能唯一标识时,按2下tab会给出列表。
路径错误按tab没有响应。
目录管理命令:
mkdir与rmdir
mkdir
mkdir [OPTION]... DIRECTORY...
-m|--mode=MODE:设置目录权限;
-p|--parents:当父目录不存在时,直接创建,而不是报错
-v|--verbose:显示详细信息
rmdir
rmdir [OPTION]... DIRECTORY...
-p|--parents:删除子目录后,如果其父目录为空,也一并删除
-v|--verbose:显示详细信息
bash特征之:命令行展开
把命令行给定的特殊符号直接自动替换为相应字符串的机制。
~:自动替换为登录用户家目录;
~USERNAME:自动替换为USERNAME的家目录;
{}:路径或文件展开符,可展开用“,”隔开的多个路径;
如:/tmp/{x/y,m/{m,n}}则表示/tmp/x/y,/tmp/m/m,/tmp/m/n三个路径或文件
tree:
list contents of directories in a tree-like format.
-d:只显示目录
-P PATTERN:只显示匹配PATTERN的文件或目录
-I PATTERN:不显示匹配PATTERN的文件或目录
-L LEVEL:显示的最深目录层级
bash特征之:命令执行状态结果
命令的执行状态结果是命令执行完成后返回的一个状态数值,与命令的输出结果不是同一个概念。
通过命令引用,得到的是命令的执行完成输出结果。
・COMMAND・
命令的执行状态结果:
成功:0
失败:1-255
bash将命令执行状态结果保存在特殊变量$?中,注意其只保留了最后一次执行的命令状态结果。
文件查看类命令:
分屏查看命令:more、less
more:
more [options] file [...]
less:
less file [...]
head:
output the first part of files
head [OPTION]... [FILE]...
-n,--lines=[-]N:打印前N行,如果为-N,则打印除最后N行的其他行。
tail:
output the last part of files
tail [OPTION]... [FILE]...
-f,--follow:查看文件尾部并且不退出,当追加新内容时,继续显示;Ctrl+c结束显示;
-n,--lines=[+]N:打印后N行,如果为+N,则打印第N行至最后一行的内容;
stat:
display file or file system status
stat [OPTION]... FILE...
-f,--file-system:display file system status instead of file status
例如:不加任何参数stat的输出如下:
File: `/etc/fstab'
Size: 860 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 131079 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-03-05 18:15:15.642655122 +0800
Modify: 2016-03-05 18:02:57.132999974 +0800
Change: 2016-03-05 18:13:53.404999799 +0800
回顾:文件的数据组成分为元数据(metadata,记录了文件大小,访问权限,属组属主等信息)和数据(data block,数据本身)
这里指出了3个时间戳(timestamps):
Atime:文件最近一次被访问的时间;
Mtime:文件最近一次被修改的时间(数据);
Ctime:文件最近一次被修改的时间(元数据);
touch:
change file timestamps
touch [OPTION]... FILE...
不加任何参数,则修改atime和mtime为当前时间
-a:只修改atime;
-m:只修改mtime;
-t STAMP:使用[[CC]YY]MMDDhhmm[.ss]格式手动设置时间,而不是当前时间;
文件管理工具:
cp:
copy files and directories
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
默认情况下,cp复制遇到软链接文件时,会直接复制链接指向的文件。
-a,--archive:归档复制,保留权限信息、递归、保留链接文件本身;
--bakcup:保留所有属性信息,甚至atime都不会修改;
-i,--interactive:交互式提醒,有重复文件时提醒;
-f,--force:强制覆盖;
-R,-r,--recursive:递归复制目录及其子目录下内容;
-P,--no-dereference:复制链接本身,而非链接指向的文件;
--parents:在目的目录,保留目录路径信息;如cp --parents /etc/fstab .会在当前目录新建etc目录,然后在etc目录里创建fstab文件
--preserve[ATTR LIST]:指定保留的属性列表
默认:mode,ownership,timestamps;
额外:context(上下文),links, xattr, all
-v, --verbose;显示详细信息;
mv:
move (rename) files
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
-i, --interactive:交互式提醒;
-f, --force:强制操作;
-v, --verbose;显示详细信息;
rm:
remove files or directories
rm [OPTION]... FILE...
-f,--force:强制复制,直接操作取消提醒;
-i:交互提醒;
-r, -R, --recursive:递归
-v, --verbose;显示详细信息
bash特征之:glob(通配符)
glob:文件名统配,用以快速引用多个文件。
元字符:通配符中具有特殊意义的专用字符,可编写匹配模式(pattern)。
*:匹配任意长度的任意字符;
如p*匹配:p、p88、prdsfsdflkj、p%%%%%等
?:匹配单个任意字符;
如p?匹配:p1、pr、pp等
[]:匹配指定字符集中的其中一个字符;
[a-z]匹配大小写a-z之间的任意一个字符;
[0-9]匹配0到9之间任何一个字符;
用[]标示各种字符的特定格式如下:
man tr可以看到[:alnum:]等!!!
[[:upper:]]:所有大写字母;
[[:lower:]]:所有小写字母;
[[:digit:]]:所有的数字;
[[:alpha:]]:所有字母;
[[:alnum:]]:所有字母和数字;
[[:space:]]:空白字符;
[[:punct:]]:标点符号;
[^ ]:匹配指定字符以外的任意字符;
如[^0-9]匹配非数字的任意字符
bash特征之:变量
变量:存储于内存空间中的一段有名称可改变值的数据;
变量命名规则:
1.名称中只能使用字母、数字和下划线;
2.不能以数字开头;
3.区分大小写;
4.尽量做到见名知义;
5.不能与系统内置变量及关键字相同;
变量赋值:
VAR_NAME=VAR_VALUE
变量类型:
bash是弱类型编程语言,变量无需事先声明,不区分变量中存储的数据类型,统一认为是字符串类型。
变量引用:
${VAR_NAME};
变量作用域:
变量的生效范围,即可被引用的范围。
变量种类及设置:
本地变量:作用域为当前shell进程,其他进程或当前shell的子进程无法引用,当前shell进程终止,变量会被自动撤销;
定义本地变量:
set VAR_NAME=[VAR_VALUE]
撤销变量:
unset VAR_NAME
环境变量:作用域为当前shell进程及其子进程;
定义环境变量:
declare -x VAR_NAME[=VAR_VALUE]
export VAR_NAME[=VAR_VALUE]
查看环境变量:
export
declare -x
env
printenv
更改为本地变量:
declare +x VAR_NAME
撤销变量:
unset VAR_NAME
局部变量:函数中定义的变量,只在函数中可被引用;
位置参数变量:shell编程中经常用到的,运行脚本时后面跟的参数,在脚本内用$#调用;
特殊变量:如$?等具有特殊含义的变量;
只读变量:
只读变量不支持重新赋值和撤销操作。
declare -r VAR_NAME
readonly VAR_NAME=VAR_VALUE
取消只读:
declare +r VAR_NAME
bash特征之:I/O重定向和管道
重定向允许讲默认打印到屏幕的数据重新定位到文件,或者默认从键盘读取的数据更改为从文件读取。
程序的默认数据流走向:
输入数据流: <--,标准输入(stdin),键盘;
输出数据流:-->,标准输出(stdout), 显示器;
错误数据流:-->,错误输出(stderr),显示器;
文件描述符(File Descriptor,FD):
stdin(标准输入):0
stdout(标准输出):1
stderr(错误输出):2
I/O重定向:
标准输出重定向:
COMMAND > /PATH/TO/FILE
将标准输出写入文件,如文件已存在数据则覆盖;文件不存在自动新建;
COMMAND >> /PATH/TO/FILE
将标准输出追加到文件;文件不存在自动创建;
shell中重定向功能开关设置:
set -C
禁止覆盖输出重定向至已存在文件;仍然可以使用>|来覆盖
set +C
关闭此功能开关
标准错误输出重定向:
COMMAND 2> /PATH/TO/FILE
错误输出写入文件,覆盖原文件数据,文件不存在自动创建
COMMAND 2>> /PATH/TO/FILE
错误输出追加到文件,文件不存在自动创建
合并标准输出和标准错误输出:
1、使用&>或&>>符号
如:COMMAND &> /PATH/TO/FILE
2、使用>和2>&1 或 >>和2>&1
如:COMMAND > /PATH/TO/FILE 2>&1
COMMAND >> /PATH/TO/FILE 2>&1
特殊输入输出文件:
/dev/zero:
会源源不断的提供二进制数据流
/dev/null:位桶
任何重定向到此文件的数据都会被丢弃
标准输入重定向:
COMMAND < /PATH/FROM/FILE
tr:
translate or delete characters
tr [OPTION]... SET1 [SET2]
实现所有字符转换为另一个:
tr [ABC] [abc] < FILE1
FILE1文件中所有A字符替换为a,所有B替换为b,所有C替换为c。并不真的改动文件内容,输出到屏幕内容改变。
实现删除某一字符:
tr -d [ABC] < FILE1
FILE1文件所有A/B/C字符被删除,输出到屏幕,不修改原文件
补充:
man tr可以看到[:alnum:]等!!!
管道:
COMMAND1 | COMMMAND2 | COMMAND3 | ...
用以将前一个命令的标准输出作为后一个命令的标准输入
如:head -n5 /dev/fstab | tail -n1 打印fstab文件的第5行
tee命令:
read from standard input and write to standard output and files
tee [OPTION]... [FILE]...
-a,--append:追加内容到文件
COMMAND | tee FILE 前面COMMAND命令的执行结果输出到屏幕并保存到FILE文件