bash特性
Shell是一种脚本语言,在linux中通过shell控制系统内核,完成内核和硬件的交互。
linux支持的shell在/etc/shells中有描述:
一般常用的shell就是bash,它也是linux预设的shell。bash具有很强大的特性,如历史命令、补全功能、设置命令别名、通配符等。
在用户登录时系统就会分配给用户一个shell,这个信息记录在/etc/passwd中:
如果系统不想让使用者登入,就可以给该用户分配一个奇怪的shell,这就是/sbin/nologin。
查看指令是否是bash内置命令:type 命令名
历史命令与命令补全
执行history命令就会查看当前计算机执行过的命令。
列出最近的3个命令:history 3
这些历史记录也会被记录在家目录下的.bash_history中,但是只有当关机时才会将命令同步写入文件中(如果同时有多个用户登入,那么最后一个退出的命令会被记录在最后),如果想立即刷新到文件需要执行history -w
,如果想清空历史命令记录就执行history -c
,但是一般不建议清空历史命令,查看历史命令可以使不同开发成员间熟悉维护的操作。
历史命令默认最多保存1000条,连续重复的命令只会保存一次,这个设置可以在文件/etc/profile中修改。将HISTSIZE=1000修改即可。
使用上箭头或下箭头能直接调出历史命令,执行!数字
可以执行对应的历史命令,执行history后每行的数字与命令一一对应,执行!!
可以执行上一条命令,执行!ser
可以执行最近执行的以ser开头的命令,频繁执行某条命令时很有用。
tab可以补全命令,如果开头的命令不止一个则不会补全,此时按两下tab可以显示开头全部命令,然后再选择即可。
别名与指令搜寻顺序
可以给命令创建别名alias 别名='原命令'
然后执行别名就相当于执行原命令。直接执行alias可以查看所有别名的设置。在linux中执行命令的优先级如下:
1第一顺位执行用绝对路径或相对路径执行的命令。
2第二顺位执行别名。
3第三顺位执行Bash的内部命令。
4第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。(linux中的很多命令都是通过环境变量定位到绝对路径然后执行的)
用alias命令设置别名只会暂时生效,想要永久生效需要修改家目录下的.bashrc文件,该文件还存储了变量设置相关内容。删除别名需要执行unalias 别名
别名的主要用途就是把很麻烦的常用命令简单化,还可以设置alias rm = 'rm -i'
,这样所有的删除操作都必须确认一遍,增加了一定的安全性。
输出重定向与输入重定向、双向重导向
输出重定向就是将本来应该输出在屏幕上的内容输出到文件中,在日志记录中很有用。
输出重定向命令,覆盖模式命令 > 文件
,追加模式命令 >> 文件
错误输出重定向,覆盖模式命令 2> 文件
,追加模式命令 2>> 文件
这两种命令需要事先确定命令是否正确执行,下一条命令可以直接将正确或错误结果直接写入文件:
覆盖模式命令 &> 文件
,追加模式命令 &>> 文件
还可以将输出结果直接输出到dev/null文件,相当于取消输出,在不想显示输出结果时可以用到,如执行命令时在命令后加上空格2>/dev/null,那么错误信息就不会显示在屏幕上了
可以将正确输出和错误输出分别分开输出追加到两个文件中:
命令>>文件1 2>>文件2
输入重定向可以取代键盘的标准输入,如将~/.bashrc的内容重定向到catfile中:
cat > catfile < ~/.bashrc
,这样就生成了一个和~/.bashrc相同的文件。
输入重定向一般用来进行统计,wc 文件名
就可以统计文件的字节数、单词数、行数。直接执行wc回车再输入内容,最后按ctrl+d,可以统计当前输入内容的字节数、单词数和行数。
双向重导向说的是数据流可以同时输入到文件和屏幕上,将执行结果保留在文件一份,同时输出到屏幕:
ls-l /home | tee ~/homefile | more
,tee后跟选项-a可以向文件追加,默认是覆盖。
多命令顺序执行
两条命令用;分隔代表顺序执行两条命令,两条命令是独立状态不会相互影响。用date;命令;date
可以测试命令的执行时间。
用&&分隔代表第一条命令顺利执行第二条命令还执行,常用于一系列有顺序需求的命令执行时。$((1&&1))的结果是1,如果有一个不为1结果就是0。
用||分隔代表第一条命令执行失败第二条命令执行,第一条命令执行成功第二条命令不执行,$((0||0))的结果是0,如果有一个不是0结果就是1。
如果/tmp/abc存在就创建/tmp/abc/hehe:ls /tmp/abc && touch /tmp/abc/hehe
如果/tmp/abc不存在就创建该目录:ls /tmp/abc || mkdir /tmp/abc
不清楚/tmp/abc是否存在,但是就是要建立/tmp/abc/hehe:
ls/tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
创造类似三元运算符的指令:命令 && echo yes || echo no
表示命令正确执行输出yes,否则输出no。
管道符|
基本格式为命令1 | 命令2
,表示命令1正确执行的结果作为命令2的输入。
ll-a /etc/ | more
表示用more来查看ll命令输出的结果。
netstat -an | grep "ESTABLISHED"
表示在网络信息中提取已连接状态的信息并显示出来,相当于查看有多少远程工具连接到服务器。-an可以显示全部连接,此时tcp连接除了listen状态还有established状态(表示正在连接,打游戏时游戏服务器一定与本机连接,此时查找状态为established的连接就可以找到服务器的ip地址)。
通配符和特殊字符
通配符主要用来匹配文件名。
bash中的特殊字符:
当内容中有空格时,必须要用引号括起来,单引号会使括起来的内容原封不动的保存,而双引号中有些特殊字符由特殊含义,如$表示调用变量的值,echo "$name"
和echo '$name'
两者的区别是后者会直接打印$name,而前者则会打印name变量真正的值。
转义符也可以让空格变成一般字符:a1=aliba\ ba
,这样设置也可以不用加单引号或双引号
反引号``括起来的内容会被识别为系统命令,bash会先执行他,如abc=`date`会把date命令的结果赋值给abc,反括号很容易被看成单引号,所以$()用的更多一些,这两个符号用法相同。示例:
cd/lib/modules/$(uname -r)/kernel
一般把一个常用目录路径定义成变量,每次登入时就可以轻松进入该目录:cd $workdir
,变量相关设置在家目录下的.bashrc文件中可以设置。
欢迎提示信息
登录后的欢迎/提示信息文件:/etc/issue(本地登录)、/etc/issue.net(远程登录)、/etc/motd(两种登录都生效)。一般会把大家都关注的信息放到里面,如维护时间等。
想要编辑自己的欢迎信息必须明确该文件中各代码的含义:
登录后提示字符root为#,一般用户未$
。退出登录为exit。