说明:文章仅供学习交流,转载请标明出处,欢迎转载。
参考资料:《鸟哥的Linux私房菜基础学习篇:第三版》
shell是用户程序与系统内核沟通的唯一渠道,通过shell命令,我们可以很轻松的读写内核中的相关信息。本文参照《鸟哥的Linux私房菜基础学习篇:第三版》相关知识,对一些Shell基本知识做了总结。
1.Shell有很多种,bash是很多Linux系统默认的Shell,目前bash也是标准的Shell,bash的有点如下:
(1)命令记忆。通过#history查询,记录在/.bash_history中;
(2)命令和文件补全。通过连续按两次[tab]键;
(3)可设置命令别名。记得C++中的引用吧,这里的别名就如同C++中变量的引用,通过#alias命令查询;
(4)通配符。如*、?、[]等通配符的引用,可以快速定位文件;
(5)可以编写Shellscript脚本。一提到脚本应该都听过吧,如PHP,Python,perl等。
2.type命令
作用:查询命令是外部命令还是内置命令。
格式: type 选项 命令名
选项:
不加,显示出是外部命令还是bash内置命令
-t:直接显示命令类型(file,alias,builtin)
-p:显示完整的文件名(包含路径)
注意:当命令很长时,可将命令分成两行,用反斜杠\,例如:
例如:mv aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt \
>bb.txt
3.变量
环境变量:相当于C/C++中的全局变量,通常用全大写字母表示;
自定义变量:相当于C/C++中的局部变量;
变量相关操作:
(1)定义一个变量x。#declare x。(变量的命名规则跟C/C++一样)
-a:数组型 -i:整型 -x:环境变量 -r:相当于C++中的const型,只读。
变量的默认类型为字符串,declare +x sum 取消sum环境变量的性质。
(2)将自定义变量x设置为全局变量。 #export x
(3)取消变量x的定义。#unset x
(4)输出变量x所代表的值。 #echo $x
(5)给变量x赋值。#x="abc"
(6)给变量本身增加内容。#x=$x:aaa,此时变量x=abc:aaa
(7)输出变量x的内容,并在后面加一个!。#echo "$name ! [空格]“,切记空格不能丢。
几个特殊的字符:\ (反斜杠) '(单引号) "(双引号) `(反单引号)的意义如下:
反斜杠:转义字符,C/C++接触过吧;
单引号和双引号:Shell中两者都可以表示字符串,区别在于,双引号考虑实际意义,而单引号全部都视为字符。所谓实际意义 指的是,字符串中可能含有变量,如str=”$x+$y=$z",echo str。
反单引号:单引号可用于返回执行命令的结果,例如:x=`ls -l` 等价于 x=$(ls -l)
查询当前系统只有哪些环境变量的命令:#export 或 env
查询当前系统所有命令(包括自定义的和环境变量):#set
常见的环境变量:
HOME:当前工作目录
SHELL:当前使用的SHELL版本
HISTSIZE:历史命令记录条数
MAIL:邮箱路径
PATH:文件查找路径(还记得jdk1.6使用的第一步就是设置路径吧)
LANG:语言,可以用#locale命令查询。
PS1:#左边的那个提示符
$:线程PID
?:上一次执行命令的结果,执行成功则返回0
4.读取变量值read
类似于C语言中的scanf和C++中的cin.
read 选项 变量名
选项:-p:接提示符
-t:提示的秒数
例如:
#read -p "input your name:" -t 30 name
#Tom
#echo $name
5.两个重要登录配置文件
/etc/issue:显示登录前信息
/etc/motd:显示登录后信息
可以通过修改者两个文件,来更改登陆前后的相关提示。
6.通配符
*: 0~无穷个字符 ?:仅代表一个任意字符
[]:一定有一个字符位于[]中 [a-z]:一定有一个字符位于a-z范围内
[^}:一定有一个字符不在[]中
例如:
/etc/a* //以a开头的文件名
/etc/???? //刚好有四个字符的文件名
/etc/*[0-9]* //含有数字的文件名
/etc/[^a-z]* //非小写字母开头的文件名
7.特殊字符
# 注释(相当于c中的//) $ 变量标志 \ 转义字符
&作业控制 | 管道 ; 连续命令
~ 主文件夹 > 输出重定向,覆盖 >> 输出重定向,追加
’str'原封不动输出str "str" 考虑 str的实际意义输出 $(cmd)执行cmd,等价于 `cmd`
8.创建文件的三种方法
(1)vim 1.txt
(2) touch 1.txt
(3) cat >1.txt <<"终止字符“ //终止字符等价于[ctrl]+[d]
9. ; && ||
cmd1;cmd2 先执行cmd1,再执行cmd2
cmd1 && cmd2 cmd1成功才执行cmd2(想到C语言中的逻辑与)
cmd1 || cmd2 cmd1执行失败时才执行cmd2(想到C语言中的逻辑或)
cmd1 && cmd2 || cmd3<==> exe(cmd1)==0 ? cmd2:cmd3 //cmd1执行成功时返回0
cmd1|| cmd2 && cmd3 <==> exe(cmd1)==0? cmd3:cmd2,cmd3
10 管道命令
还记得操作系统中进程间的通信的几种常用的方式(共享存储器,消息传递系统,管道,套接字)吗?没错,管道就是一种FIFO的文 件。在 Linux中,管道命令指的是:将前一个命令的输出作为后一个命令的输入。管道命令分类如下:
选取命令: cut,grep
排序命令:sort ,wc ,uniq
双向重定向:tee
字符转换命令:tr, col , join, paste, expand
分割命令: split
下面一一列举这几种命令的用法。
( I). 选取命令
cut命令:对每一行的内容分段
格式: cut -d '分隔符' -f 第K个
选项:
-d:后接分隔符
-f:去分开后的第几个字段
-c:确定分区范围
举例:
#cat 1.txt
==> 12345aaa
12345bbb
12345ccc
#cat 1.txt | cut -d '5' -f 1
==>1234
1234
1234
#cat 1.txt | cut -c 1-6
==>12345a
12345b
12345c
grep命 令:根据匹配信息输出对应的整行信息
格式:grep 选项 '匹配str' 文件名
选项:
-a:将二进制文件以text文件的方式查找数据
-c:计算找到'str'的次数
-i:忽略大小写
-n:顺便输出行号
-v:将不匹配的输出
--color=auto 对找到的匹配项对应的关键字用特殊颜色显示
(2)排序命令
sort 命令:依据不同的数据类型排序
格式:sort 选项 文件
选项:
-f:忽略大小写差异
-b:忽略最前面的空格部分
-M:按月份排序
-n:按数字顺序(默认以文字类型排序)
-r:逆序
-u:(uniq)相同的数据中,仅出现一行代表
-t:分隔符,默认用[tab]分开
-k:对第k个属性排序
uniq命令:将重复数仅列出一个显示
格式:uniq 选项
选项:
-i:忽略大小写
举例:
#last | cut -d ' ' -f 1 | sort | uniq -c
==>1
12 reboot
41 root
1 wtmp
wc命令:统计字数,行数
格式:wc 选项
选项:
-l :仅列出行
-w:仅列出多少字
-m:多少字符
例如:
#cat 1.txt | wc
==>aaa
bbb
ccc
ddd
行数:4
字数:4
字符数:16
(3)双向重定向
tee命令:同时将结果输出至屏幕和文件中。
格式:tee 选项 文件名
选项:
-a:以追加的方式将数据加入至文件中。
例如:
#cat 1.txt | tee -a 2.txt //将1.txt显示出来并追加到2.txt中
(4)字符转换命令
tr命令:对一段数据中的文字做删除或替换,但不会对原文件处理,只会对中间数据使用
用法:tr 选项 str...
选项:
-d:删除数据中的str
-s:替换掉重复的字符str
举例:
I.cat 1.txt | tr a A //将1.txt中的a 用A替换
II. cat 1.txt | tr -d a //删除所有的a
III. cat 1.txt | tr -s a //将同一行中重复且连续的字符去掉
col命令:用于处理特殊键
用法:col 选项
选项:
-x :将[tab]->对等的[空格]
-b:在文字内有反斜杠(/)时,仅保留反斜杠最后接的那个字符。
join命令:将两个文件中相同的数据的哪一行加在一起。
用法: join 选项 file1 file2
选项:
-t:后接分隔符,默认为空格符
-i:忽略大小写
-1:对第一个文件
-2:对第二个文件
举例:
#cat 1.txt
输出: a:aa
b:bb
c:cc
d:dd
#cat 2.txt
输出: a:11
a:22
a:33
a:44
#join 1.txt 2.txt
无反应,默认为空格分割
#join -t ':' 1.txt 2.txt
输出: a:aa:11
a:aa:22
a:aa:33
a:aa:44
paste命令:对应同行合并(第一个文件的第k行与第二个文件的第K行合并)
用法:paste -d file1 file2
选项:
-d:后接分隔符
-:如果file部分为-,表示标准输入
举例:
#cat 1.txt
输出:aaaa
#cat 2.txt
输出:1111
2222
3333
4444
#paste -d '|' 1.txt 2.txt
输出: aaaa | 1111
2222
3333
4444
expand命令:将[tab]转换成空格
用法: expand -t 文件名
选项:
-t:后面接数字,默认情况下,一个[tab]可以用8个空格键替换,我们可以自行定义一个[tab]对应多少个字符
split命令:将一个大文件分割成小文件
用法:split 选项 文件名 小文件的前缀
选项:
-b:分割大小,可加 b,k,m
-l:以行数进行分割
>>:合并操作
#cat 1.txt 2.txt >>3.txt //将1.txt 2.txt合并成3.txt
注意:在管道命令中,经常会使用到前一个命令的stdout作为下一个命令的stdin,当某些命令需要要到文件名来处理时,该 stdin与stdout可以用-(建号)来替换,例如:#tar -cvf - 1.txt 2.txt | tar -xvf -