详细建议参考http://c.biancheng.net/linux_tutorial/100/
快捷键
快捷键 | 作 用 |
---|---|
Ctrl+A | 把光标移动到命令行开头。如果我们输入的命令过长,则在想要把光标移动到命令行开头时使用 |
Ctrl+E | 把光标移动到命令行结尾 |
Ctrl+C | 强制中止当前的命令 |
Ctrl+L | 淸屏,相当于 clear 命令 |
Ctrl+U | 刪除或剪切光标之前的命令。假设输入了一行很长的命令,无须使用退格键一个一个字符地刪除, 使用这个快捷键会更加方便 |
Ctrl+K | 删除或剪切光标之后的内容 |
Qrl+Y | 粘贴 Ctrl+U 或 Ctrl+K 剪切的内容 |
Ctrl+R | 在历史命令中搜索,按下 Ctrl+R 组合键之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索 |
Ctrl+D | 退出当前终端 |
Ctrl+Z | 暂停,并放入后台。这个快捷键涉及工作管理的内容,我们会在后续中详细介绍 |
Ctrl+S | 暂停屏幕输出 |
Ctrl+Q | 恢复屏幕输出 |
Tab | 自动补充,点击两下会显示所有文件,例如:输入a,点击两下Tab,会显示出所有a开头的文件 |
多命令顺序
多命令执行符 | 格 式 | 作 用 |
---|---|---|
; | 命令1 ; 命令2 | 多条命令顺序执行,命令之间没有任何逻辑关系 |
&& | 命令1 && 命令2 | 如果命令1正确执行( ? = 0 ) , 则 命 令 2 才 会 执 行 < / p > 如 果 命 令 1 执 行 不 正 确 ( ?=0),则命令2才会执行</p>如果命令1执行不正确( ?=0),则命令2才会执行</p>如果命令1执行不正确(?≠0),则命令2不会执行 |
II | 命令1 || 命令2 | 如果命令1执行不正确( ? ≠ 0 ) , 则 命 令 2 才 会 执 行 < / p > 如 果 命 令 1 正 确 执 行 ( ?≠0),则命令2才会执行</p>如果命令1正确执行( ?=0),则命令2才会执行</p>如果命令1正确执行(?=0),则命令2不会执行 |
ls /root/test && echo "yes"||echo "no" #如果/root/test存在,则会打印yes;如果/root/test不存在,则会打印no
history
qydev@qydev011:~$ history #显示系统中的历史命令
…省略部分输出…
421 chmod 755 hello.sh
422/root/sh/hello.sh
423 ./hello.sh
424 bash hello.sh
425 history
!! #重复执行上一条命令,即将425命令再次执行
!bash #重复执行最后一条以bash开头的命令,即将424命令再次执行
vi !$ # "!$"代表上一条命令的最后一个参数,假如上一条命令是424,则"!$"就是hello.sh
grep
grep [选项] "搜索内容" 文件名
grep "400,Bad Request" test100.jtl #打印出test100.jtl文件中所有含"400,Bad Request"的内容
grep -c "400,Bad Request" test100.jtl #打印出test100.jtl文件中所有含"400,Bad Request"的行数
grep -i "400,Bad Request" test100.jtl #打印出test100.jtl文件中所有含"400,Bad Request"的内容,同时忽略大小写
选项:
- -A:显示符合的行及之后的内容
- -B:显示符合的行及之前的内容
- -C:显示符合的行及前后的内容
- -c:计算符合的行数目
- -n:显示匹配行和行号
- -i:忽略大小写
find(同grep属于精准查询)
find -name "abc" #精确查找abc文件
选项:
- -name:按照文件名查找文件
- -perm:按照文件权限查找文件
- -user:按照文件属主来查找文件
- -size:按照指定的文件大小查找文件【+n:大于,-n:小于,n:等于】
- -group:按照文件所属的组来查找文件
- -mtime<-n><+n>:按照文件更改时间来查找文件,-n表示n天之内,+n表示n天以前
- -newer file1 file2:查找更改时间在file1和file2之间的文件
cat
cat 命令用于连接文件并打印到标准输出设备上
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"选项;
cut
grep 命令是在文件中提取符合条件的行,也就是分析一行的信息,如果行中包含需要的信息,就把该行提取出来。
而如果要进行列提取,就要利用 cut 命令了。不过要小心,虽然 cut 命令用于提取符合条件的列,但是也要一行一行地进行数据提取。也就是说,先要读取文本的第一行数据,在此行中判断是否有符合条件的字段,然后再处理第二行数据。我们也可以把 cut 成为字段提取命令。
cut [选项] 文件名
选项:
- -f 列号:提取第几列;与-d一起使用,指定显示哪个区域。
- -d 分隔符:按照指定分隔符分割列;
- -c 字符范围:不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段提取。"n-"表示从第 n 个字符到行尾;“n-m"表示从第 n 个字符到第 m 个字符;”-m"表示从第 1 个字符到第 m 个字符;
- -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
- -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除
sed
sed 命令是利用脚本来处理文本文件
sed [-hnV][-e<script>][-f<script文件>][文本文件]
sed -i "s/jack/tom/g" `grep "jack" -rl ./` # 将当前目录下包含jack串的文件中,jack字符串替换为tom
sed -i "s/jack/tom/g" test.txt # 将某个文件中的jack字符串替换为tom
选项:
- -e
动作说明:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
touch
touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件
touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
选项:
- a 改变档案的读取时间记录。
- m 改变档案的修改时间记录。
- c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
- f 不使用,是为了与其他 unix 系统的相容性而保留。
- r 使用参考档的时间记录,与 --file 的效果一样。
- d 设定时间与日期,可以使用各种不同的格式。
- t 设定档案的时间记录,格式与 date 指令相同。
- –no-create 不会建立新档案。
- –help 列出指令格式。
- –version 列出版本讯息。
mkdir
mkdir命令用于建立名称为 dirName 之子目录。
mkdir [-p] dirName
选项:
- -p 确保目录名称存在,不存在的就建一个
mv
mv 命令用来为文件或目录改名、或将文件或目录移入其它位置。
mv [options] source dest
选项:
- -i: 若指定目录已有同名文件,则先询问是否覆盖旧文件;
- -f: 在 mv 操作要覆盖某已有的目标文件时不给任何指示;
cp
cp命令主要用于复制文件或目录。
cp [options] source dest
选项:
- -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
- -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
- -f:覆盖已经存在的目标文件而不给出提示。
- -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
- -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
- -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
- -l:不复制文件,只是生成链接文件。
scp
cp 命令用于 Linux 之间复制文件和目录。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
scp [可选参数] file_source file_target
选项:
- -B: 使用批处理模式(传输过程中不询问传输口令或短语)
- -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
- -p:保留原文件的修改时间,访问时间和访问权限。
- -q: 不显示传输进度条。
- -r: 递归复制整个目录。
- -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
- -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
- -P port:注意是大写的P, port是指定数据传输用到的端口号
- -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
rm
用于删除一个文件或者目录。
rm [options] name...
选项:
- -i 删除前逐一询问确认。
- -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- -r 将目录及以下之档案亦逐一删除。
echo
echo "hello word" #直接打印内容
hello word
echo -n "hello word" #加入了 "-n"选项,则在输出内容结束后,不会换行,直接显示新行的提示符
hello word
echo -e "ab\bc" #加入了 "-e"选项,可以支持控制字符,如表下表所示
ac
source
source 命令会强制执行脚本中的全部命令,而忽略脚本文件的权限。该命令主要用于让重新配置的环境变量配置文件强制生效。
source 配置文件
或
.配置文件 # "."就是 source 命令,使用哪种方法都是可以的。
ll(小写LL)
ll #查看当前文件夹下文件的长格式
总用量 9948
drwxrwxr-x 2 qydev qydev 4096 5月 6 14:52 ./
drwxrwxr-x 4 qydev qydev 4096 5月 6 20:04 ../
-rw-rw-r-- 1 qydev qydev 10169098 5月 5 20:43 test100.jtl
-rw-rw-r-- 1 qydev qydev 7497 5月 5 20:38 test100.txt
env和set
env #查看环境变量
set #查看所有变量
|(通道符)
在 Bash 中,管道符使用"丨"代表。管道符也是用来连接多条命令的,如"命令1丨命令2"。不过和多命令顺序执行不同的是,用管道符连接的命令,命令 1 的正确输出作为命令 2 的操作对象。这里需要注意,命令 1 必须有正确输出,而命令 2 必须可以处理命令 1 的输出结果;而且命令 2 只能处理命令 1 的正确输出,而不能处理错误输出。
ps -ef | grep jmeter #查看当前所有进程,然后从其中查找与jmeter相关的服务
qydev 16278 5469 0 20:48 pts/20 00:00:00 grep --color=auto jmeter
通配符
通配符 | 作 用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配中括号中任意一个字符。例如,[abc] 代表一定匹配一个字符,或者是 a,或者是 b,或 者是 c |
[-] | 匹配中括号中任意一个字符,- 代表一个范围。例如,[a-z] 代表匹配一个小写字母 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如,[^0-9] 代表匹配一个不是数字的字符 |
ls ????100.jtl #查找test100.jtl、auto100.jtl这一类文件,1个?代表一个字符
ls *100.jtl #查找test100.jtl、ab100.jtl这一类文件,*代表0或多个字符
ls * #查看当前文件夹下所有文件名,*代表0或多个字符
ls [a]* #查看当前文件夹下a开头的所有文件
ls [0-9]* #查看当前文件夹下数字开头的所有文件
ls [^0-9]* #查看当前文件夹下非数字开头的所有文件
双引号” “、单引号‘ ’
引号有单引号和双引号之分,二者的主要区别在于,被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义;而被双引号括起来的字符中,"KaTeX parse error: Can't use function '\"' in math mode at position 4: "、"\̲"̲和反引号是拥有特殊含义的,""代表引用变量的值,而反引号代表引用命令。
name=sc
echo ’$name‘ #单引号作为普通字符
echo “$name” #双引号可以引用
sc
echo “\” #同直接执行\,反斜杠一般用作转义字符
( )、{ }
在执行一串命令时,如果使用的是小括号,则这串命令所做的修改只在子 Shell 中生效,一旦命令执行结束,回到父 Shell 中,这个修改就会丟失;而如果使用的是大括号,则此串命令直接在父 Shell 中执行,命令执行结束后,修改依然会生效。
- () 执行一串命令时,需要重新开启一个子 Shell 来执行。
- {} 执行一串命令时,在当前 Shell 中执行。
- () 和 {} 都是把一串命令放田括号里面,并且命令之间用";"隔开。
- () 最后一条命令可以不用分号。
- {} 最后一条命令要用分号。
- {} 的第一条命令和左括号之间必须有一个空格。
- () 里的各命令不必和括号有空格。
- () 和 {} 中括号里面的某条命令的重定向只影响该命令,但括号外的重定向则会影响到括号里的所有命令。
关于父 Shell 和子 Shell,大家可以想象成在 Windows 中我们开启了一个"cmd"字符操作终端,那么 Windows 本身就是父 Shell,而"cmd"终端则是子 Shell;也可以理解为在一个操作界面中又开启了一个操作界面。
$
我们需要调用变量时,需要在变量名之前加入"$"符号。
name=ab
echo $name
ab
$( )
如果需要调用命令的输出,或把命令的输出赋予变量,则命令必须使用反引号包含,这条命令才会执行,反引号的作用和 $(命令) 是一样的,但是反引号非常容易和单引号搞混,所以推荐大家使用 $(命令) 的方式引用命令的输出。
echo $(date) #date为打印时间的命令,命令中套用命令要用$()
${ }
一般情况下, v a r 与 var与 var与{var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围。
A=(a b c def)
${A[0]} #返回数组第一个元素a,当出现空格符号等字符时${}可以精准圈定范围。
( ( ) ) 或 (( ))或 (())或[]
echo $((2*3)) #用于整数运算
6
echo $((2#110)) #其中,2为进制,110为该进制下某个数值,命令执行后可以得到该进制数转成十进制后的值。
6
(( ))
用于重定义变量值
a=5;b=7
((a++));echo $a
6
((a<b));echo $?
0
((a>b));echo $?
1
? 、 ?、 ?、、$!
$?是上一条命令执行的结果,如果 $? 返回值是 0,则证明上一条命令正确执行;如果 $? 返回值是非 0,则证明上一条命令执行错误。
预定义变量 | 作 用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这 个变量的值为非 0 (具体是哪个数由命令自己来决定),则证明上一条命令执行错误 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
变量
name=sc #定义变量name的值,用户自定义变量只在当前的 Shell 中生效
unset name #删除自定义变量name,清空变量而不是调用变量所以不用加符号
- 变量名可以由字母、数字和下画线组成,但是不能以数字开头。如果变量名是"2name",则是错误的。
- 在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
- 变量用等号"=“连接值,”="左右两侧不能有空格。这是 Shell 语言特有的格式要求。
- 变量值中如果有空格,则需要使用单引号或双引号包含,如 test=“hello world!”。双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符。
- 在变量值中,可以使用转义符""。
- 如果需要増加变量值,那么可以进行变量叠加。
变量叠加可以使用两种格式:"$变量名"或 ${变量名}。 - 如果要把命令的执行结果作为变量值赋予变量,则需要使用反引号或 $() 包含命令。
- 环境变量名建议大写,便于区分。
位置参数(命令行参数)
当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数。
其中,$0 代表命令行本身,$1 代表第 1 个参数, 2 代 表 第 2 个 参 数 , 依 次 类 推 。 当 参 数 个 数 超 过 10 个 时 , 就 要 用 大 括 号 把 这 个 数 字 括 起 来 , 例 如 , 2 代表第 2 个参数,依次类推。当参数个数超过 10 个时,就要用大括号把这个数字括起来,例如, 2代表第2个参数,依次类推。当参数个数超过10个时,就要用大括号把这个数字括起来,例如,{10} 代表第 10 个参数,${14} 则代表第 14 个参数。
∗ 、 *、 ∗、@区别:假如使用for循环时, ∗ 会 把 所 有 参 数 视 为 一 个 整 体 , 只 循 环 1 次 ; *会把所有参数视为一个整体,只循环1次; ∗会把所有参数视为一个整体,只循环1次;@会把每一个参数视为一个整体,循环n次
位置参数变量 | 作 用 |
---|---|
$n | n 为数字,$0 代表命令本身,$1〜 9 代 表 第 1 〜 9 个 参 数 , 10 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9 代表第 1〜9 个参数,10 以上的参数需要用大括号包含, 如 9代表第1〜9个参数,10以上的参数需要用大括号包含,如{10} |
$* | 这个变量代表命令行中所有的参数,把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待 |
$# | 这个变量代表命令行中所有参数的个数 |
read
read [选项] [变量名]
read -t 30 -p "Please input your name、age:" name age
Please input your name、age:fyib 24
echo $name
fyb
echo $age
24
选项:
- -p “提示信息”:在等待read输入时,输出提示信息;
- -t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间;
- -n 字符数:read命令只接收指定的字符数就会执行;
- -s: 隐藏输入的数据,适用于机密信息的输入;
变量名:
- 变量名可以自定义。如果不指定变量名,则会把输入保存到默认变量REPLY中;
- 如果只提供了一个变量名,则将整个输入行赋予该变量;
- 如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有字;
数据类型(数字、字符串、数组)
A="a b c def" # 定义字符串,所有的变量的默认类型是字符串型
A=(a b c def) # 定义字符数组
echo ${A[*]} # 打印数组中的左右内容
echo ${A[1]} # 打印数组中的第二个变量
declare声明变量类型
declare [+/-] [选项] 变量名
aa=1
bb=2
declare -i cc=$aa+$bb #声明变量cc的类型是整数型,它的值是aa和bb的和
echo $cc
3
选项:
- -:给变量设定类型属性;
- +:取消变量的类型属性;
- -a:将变量声明为数组型;
- -i:将变量声明为整数型(integer);
- -r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过 +r 取消只读属性;
- -x:将变量声明为环境变量;
- -p:显示指定变量的被声明的类型;
运算符
符号 | 功能 |
---|---|
+ - * / % | 分别为加、减、乘、除、余数运算(模) |
& | ^ ! | 分别为“AND、OR、XOR、NOT” |
=,+=,•=,*=,/=,%=,&=, |=, <<=, >>= | 赋值、运算且赋值 |
== ,!= | 等于、不等于 |
<=, >=, <, > | 小于或等于、大于或等于、小于、大于 |
<<, >> | 按位左移、按位右移 |
变量测试与内容置换
变量置换方式 | 变量y没有设置 | 变量y为空值 | 变量y设置值 |
---|---|---|---|
x=${y-新值} | x= 新值 | x 为空 | x=$y |
x=${y:-新值} | x= 新值 | x= 新值 | x=$y |
x=${y+新值} | x 为空 | x= 新值 | x=新值 |
x=${y:+新值} | x 为空 | x 为空 | x=新值 |
x=${y=新值} | x= 新值 | x 为空 | x=$y |
y= 新值 | y 值不变 | y值不变 | |
x=${y:=新值} | x= 新值 | X= 新值 | x=$y |
y= 新值 | y= 新值 | y值不变 | |
x=${y?新值} | 新值输出到标准错误输出(屏幕) | x 为空 | x=$y |
x=${y:?新值} | 新值输出到标准错误输出 | 新值输出到标准错误输出 | x=$y |
如果大括号内没有":",则变量 y 为空或没有被设置,处理方法是不同的;如果大括号内有":",则变量 y 不论是为空,还是没有被设置,处理方法是一样的。
如果大括号内是"-“或”+",则在改变变量 x 的值的时候,变量 y 的值是不改变的;如果大括号内是"=",则在改变变量 x 的值的同时,变量 y 的值也会改变。
如果大括号内是"?",则当变量 y 不存在或为空时,会把"新值"当成报错输出到屏幕上。