您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux

Linux命令行基础,关于Bash需要知道的一些常识

时间:2019-08-27 10:34:55  来源:  作者:

介绍

linux越来越重要,对于开发者来说学习必要的bash技术必不可少,对运维来说更是如此。学习shell可以参考很多学习材料和图书,比如ChinaUnix论坛网中人大哥总结的《Shell十三问》的帖子,《ABS 指导》(《Advanced Bash-Scripting Guide》),《linux shell脚本攻略》等大家可以参考。本文虫虫给大家一些常用的shell技巧分享给大家,希望可以对大家有所帮助。

Linux命令行基础,关于Bash需要知道的一些常识

 

引导顺序

首先我们要说下bash脚本的启动,Linux中系统初始化都是按照一定顺序加载各个文件初始化脚本(Shell脚本)。脚本所在文件启动顺序很重要,下面这个图显示了Linux系统个初始化脚本和环境变量的加载顺序,包括了bash、sh和zsh等常见的shell。

Linux命令行基础,关于Bash需要知道的一些常识

 

bash的加载遵循上图,从上到下顺序执行加载,尤其要注意non-login、非交互(上面蓝色线)执行,它不会加载很多脚本,比如/etc/profile(总profile),/etc/bash.bashrc(总basrc),和个人的.profile, .bash_profie,.bash_login和.bashrc等。所以如果你脚本处于这样环境下(比如cron脚本),你就要在脚本中自我设置一些环境变量。这样就可以避免由于环境变量导致的一些莫名其妙的的问题,比如写的好脚本为什么登陆就可以执行,放到cron里面自动执行就不行。

输入/输出和重定向

我们知道Linux下一切皆文件,包括硬件设备,其中三个特殊的文件句斌,标准输入(stdin)、标准输出(stdout)和标准错误(stderr),其句柄号为三个整数0,1和2。

< :用于重定向改变标准输入(stdin)。

0< :0< 和<一样 ,<符号之前需要制定一个FD,默认为0。

<< :输入一段文本,直到读到<<后指定的内容,这就是常说的heredoc。

> :用于重定向改变标准输出(stdout)。

1> :1> 和>一样 ,> 默认的FD为1。

2> :改变标准错误(stderr)。

>> :重定向输出到文件,追加到文件末尾。

set -o noclobber :设置 > 不能覆盖已经存在的文件。

set +o noclobber :这支 > 可以覆盖已经存在的文件。

>| :设置set -o noclobber后,使用 >| 可以临时覆盖已经存在的文件。

/dev/null 和 /dev/zero

这两个文件是两个比较特殊设备。/dev/null,或称空设备,它会丢弃一切写入它的数据,但是读取它则会抛出错误。在shell中常用它来表示放弃执行的结果(或者错误),这样只关注于程序执行,比如在cron中的任务,输出和错误都没有意义。

command > /dev/null

可以将stdout、stderr都重定向输出到/dev/null:

command > /dev/null 2>&1 或者

command &> /dev/null

command >& /dev/null

/dev/zero 设备用于提供无限制的空null内供读取。当读取该设备(文件)时候,它会提供无限的空字符 null。我们可以从/dev/zero 读取任意数量的 null 字符。和 /dev/null 不同,/dev/zero主要用于作为null数据源供读取,当然/dev/zero也支持写入,可以用做数据黑洞,。

/dev/zero主要用途是提供字符流来初始化数据存储,也就是使用空字符覆盖目标数据。还可以用来一个特定大小的空白文件。

比如用空白文件覆盖分区,删除分区的数据可以用(慎用!):

dd if=/dev/zero of=/dev/<destination partition>

创建一个一个1M的文件,可以使用

dd if=/dev/zero of=cc count=1024 bs=1024

``和$()

反引号(Tab键上面的键)和$(),两者基本上类似,在shell中都表示执行命令。

echo`ls`

echo $(ls)

最常用的用法是将一些命令结果输出传递个其他命令作为参数。比如要查询当前目录和子目录下所有php中的包含"eval"函数(似疑木马),可以用下面命令:

grep eval `find -type f -name "*.php"`

两者主要的区别在于嵌套更简单。

对``来说要实现嵌套就要增加很多反斜杠来转义,比如:

echo `echo `echo \`echo hello,Chongchong!\```

而用$()就简介的多了:

echo $(echo $(echo $(echo hello,Chongchong!)))

<()

这是个很有意义的操作符,他有点类似于$(),而对括弧中命令的输出重用。但是在<上下文中其输出结果被会视为文件,可以用于以文件名为参数的命令中。

比如我们要执行下面一些例子

grep keys file1> /tmp/a

grep keys file2> /tmp/b

diff /tmp/a /tmp/b

用<()以上可以用oneline单行来代替:

diff <(grep keys file1)<(grep keys file2)

引用

bash引用比较复杂,我们先从简单的开始。

首先,引号中的变量:

A='123'

echo "$A"

echo '$A'

这个结果很简单,双引号会解释变量,输出为其值123,而单引号不会解释,输出为$A。

下面三个echo 都会打印啥呢?

mkdir -p tmp

cd tmp

touch a

echo *

echo "*"

echo '*'

Bash中还有很多引用方式的快捷操作符,其中一些可以极大的提高我们的工作效率

!$

表示重复最后一个命令的最后一个参数。如果你正在处理一个文件,通过该操作符可以在命令后重新引入参数,从而节省大量重复输入。

grep xxx /long/path/to/some/file/or/other.txt

vim !$

!:1-$

该操作符,更有意思,它获取上一个命令的所有参数并将它们引入。所以:

grep isthere /long/path/to/some/file/or/other.txt

egrep !:1-$

fgrep !:1-$

!表示'查看上一个命令',:是一个分隔符,1表示'取第一个单词', -表示范围'直到',$表示'最后一个单词'。

我们可以用!*实现同样的目的。但是基于上面规则,我们就可以随意定制参数的范围了。比如如使用!:2-3。

:h

如果把该操作符放在一个文件名后面,它会删除文件夹以外的文件名称。比如:

grep XXX /long/path/to/some/file/or/other.txt

cd !$:h

通配符和正则表达式

通配符合正则表达式中都会用*,看起来很相似,但它们差异很大

请解释下面这个命令:

rename -n 's/(.*)/HEAD$1/' *

上面两个星号表达意思完全不同:

第一个由于用单引号括住,shell不会对其解释,作为参数都提交给rename命令。rename会对其解释 ,而s/(.*)/HEAD$1/是一个正则替换。在正则表达式中 *表示对前面字符的0个或者多个模式。.表示一个字符,所以.*表示匹配所有内容;()表示对括住内容进行引用,在替换后面部分用1或者$1表示它。

第二个会被shell解释,*在shell中表示通配符,表示当前工作文件夹中所有文件的列表替换。

所以整个命令表示将文件下所有文件名都增加上HEAD 前缀。请尝试下面两个命令:

ls *

ls .*

第二个看起来更像是一个正则表达式,但是实际是什么样的呢?请你尝试对输出解释下。

条件语句,[和[[

请尝试执行一下语句会输出什么?

if grep XXX /dev/null

then

echo Chongchong

else

echo lo

fi

grep的返回代码使得像这样的代码更直观地作为其作为退出状态解释时候带来的副作用。

下面两个语句的输出呢?

if [ $(grep XXX /dev/null) = '' ]

then

echo -n Chongchong

else

echo -n lo

fi

if [[ $(grep XXX /dev/null) = '' ]]

then

echo -n Chongchong

else

echo -n lo

fi

[是测试的原始形式,然后[[引入了更灵活和直观的方式。在上面的第一个if块中,if语句因为$(grep XXX /dev/null)被评估为空,导致这种比较:[=''],这会抛出错误,针对这种情况就需要使用[[]]来避免这种异常,还有一个常用的技巧是使用:

if [x$(grep XXX /dev/null)='x']

所以,如果命令没有返回任何内容,它仍然可以正常运行,而不会抛出异常,中断执行。

退出状态码

我们知道每次shell执行,推出是都会给shell一个状态码。

如果命令执行正常,则会返回给shell状态码0。如果不成功,则会得到一个非零代码,用来表具体错误的种类,其中 1表示"一般错误",还有其他更多信息,可以在程序中具体定义。状态码,可以通过$?查看。但有些命令会设置有特殊设置比如grep,请尝试下面的命令:

grep XXX /dev/null

echo $?

grep中使用退出代码来指示它是否匹配。

set 语句

Bash中也提供了可配置的选项,可以即时设置环境变量等。

set -e

如果任何命令返回非零退出状态,则从脚本退出。

set -X

会输出在运行时运行的命令。

所以脚本可能会使用这样的开头:

#!/bin/bash

set -e

set -x

grep XXX /dev/null

echo $?

getopts

如果要写一个较大的程序,涉及的输入比较复杂,则需要使用getopts来简化你的工作,用他来帮你做输入和参数处理的工作,比如下面一个例子:

Linux命令行基础,关于Bash需要知道的一些常识

 

getopts后面跟的是参数列表字符串,每个字母表示一个选项,带:选项表示选项还会有值,比如上面例子中对应的-j /home/soft/JAVA 和-m /home/soft/maven 。而getopts字符串中没有跟随:的字母就是开关型选项,不需要指定值,等同于true/false,只要带上了这个参数就是true。

getopts是shell内部命令,可以在shell脚本中直接使用,同时shell也支持一个外部命令getopt有很多发行版本也都自带。详细可以搜索参考具体文档,本文不在赘述。

总结:

抛砖引玉,本文中列出了shell中一些常见的技巧和容易混淆的知识点,希望能对大家有所帮助,如果大家有更好的想法技巧也可以一起分享出来,一起参考学习。



Tags:Linux命令   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1. ls &mdash; Listls会列举出当前工作目录的内容(文件或文件夹)。ls命令演示2.mkdir &mdash; Make Directorymkdir 用于新建一个新目录执行mkdir命令创建相应的文件夹3.pwd &...【详细内容】
2021-11-30  Tags: Linux命令  点击:(29)  评论:(0)  加入收藏
常见执行Linux命令的格式是这样的:命令名称 [命令参数] [命令对象]注意,命令名称、命令参数、命令对象之间请用空格键分隔。命令对象一般是指要处理的文件、目录、用户等资源,...【详细内容】
2021-10-21  Tags: Linux命令  点击:(57)  评论:(0)  加入收藏
今天,就整理了一下,在部署、部署后日志排错、端口占用等等方面的一些常用的linux命令。下面,咱们开始一.端口相关查看端口占用情况:lsof -i : 端口号例如:查询8080端口的运行情...【详细内容】
2021-02-02  Tags: Linux命令  点击:(205)  评论:(0)  加入收藏
有位小伙伴留言问道tee工具的代码在哪: 这篇文章我们就来简单分享一下。首先,我们需要了解Linux下的命令分为大致分为两类:内置命令与非内置命令。查看内置命令源码内置命令是S...【详细内容】
2021-01-28  Tags: Linux命令  点击:(241)  评论:(0)  加入收藏
一提到操作系统,我们首先想到的就是windows和Linux。Windows以直观的可视化的方式操作,特别适合在桌面端PC上操作执行相应的软件。相比较Windows来说,Linux的很多管控都需要用...【详细内容】
2021-01-20  Tags: Linux命令  点击:(208)  评论:(0)  加入收藏
我决定把今年装x的机会,留给sar命令。它是一个Linux下的监控工具,一直站在鄙视链的顶端。之所以让人望而生畏,主要是由于它繁多的参数。但,这么强大的命令,并非无章可循,实际上是...【详细内容】
2021-01-12  Tags: Linux命令  点击:(216)  评论:(0)  加入收藏
文本编辑软件在任何操作系统上都是必备的软件。我们在 Linux 上不缺乏非常现代化的编辑软件,但是它们都是基于 GUI(图形界面)的编辑软件。正如你所了解的,Linux 真正的魅力在于...【详细内容】
2020-10-13  Tags: Linux命令  点击:(86)  评论:(0)  加入收藏
#命令预览1.top2.ps3.nice4.kill5.iostat6.mpstat7.vmstat8.df9.du10.netstat11.ss#首先我们先来了解一下什么是进程#进程:是Linux用来表示正在运行的程序的一种抽象概念,Linu...【详细内容】
2020-07-31  Tags: Linux命令  点击:(73)  评论:(0)  加入收藏
作为一名网络安全工作者,一说到渗透测试,所有人都会想到Kali Linux,Kali Linux系统是一款预装了许多渗透测试软件的Linux系统,是最常用的一款渗透测试系统工具,既然是一款Linux系...【详细内容】
2020-07-17  Tags: Linux命令  点击:(83)  评论:(0)  加入收藏
今天扣丁学堂给大家介绍一下关于一些Linux培训之常用Linux命令行使用技巧汇总,这些工具在几位回答者的日常工作中都很有用。对于任何不了解的命令,请使用“man“查看,或者使用G...【详细内容】
2020-06-30  Tags: Linux命令  点击:(62)  评论:(0)  加入收藏
▌简易百科推荐
作用显示文件或目录所占用的磁盘空间使用命令格式du [option] 文件/目录命令功能显示文件或目录所占用的磁盘空间一些写法的区别du -sh xxx 显示总目录的大小,但是不会列出...【详细内容】
2021-12-23  mitsuhide1992    Tags:du命令   点击:(12)  评论:(0)  加入收藏
什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼...【详细内容】
2021-12-23  linux上的码农    Tags:linux内核   点击:(15)  评论:(0)  加入收藏
本文将比较 Linux 中 service 和 systemctl 命令,先分别简单介绍这两个命令的基础用法,然后进行比较。从 CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 service服务(dae...【详细内容】
2021-12-23  软件架构    Tags:systemctl   点击:(14)  评论:(0)  加入收藏
mv是move的缩写,可以用来移动文件或者重命名文件名,经常用来备份文件或者目录。命令格式mv [选项] 源文件或者目录 目标文件或者目录命令功能mv命令中第二个参数类型的不同(...【详细内容】
2021-12-17  入门小站    Tags:mv命令   点击:(23)  评论:(0)  加入收藏
大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 98篇原创内容 -->公众号 Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处...【详细内容】
2021-12-17  仙风道骨的宝石骑士    Tags:sed命令   点击:(22)  评论:(0)  加入收藏
Node是个啥?  写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性地拿了下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段...【详细内容】
2021-12-15  linux上的码农    Tags:node   点击:(25)  评论:(0)  加入收藏
难道只有我一个人觉得Ubuntu的unity桌面非常好用吗?最近把台式机上面的Ubuntu 16.04格式化了,装了黑苹果用了一周,不得不说,MacOS确实很精美,软件生态比Linux丰富很多,比Windows简...【详细内容】
2021-12-14  地球末日村    Tags:ubuntu   点击:(41)  评论:(0)  加入收藏
简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。输出信息含义执行net...【详细内容】
2021-12-13  窥镜天    Tags:Linux netstat   点击:(28)  评论:(0)  加入收藏
对于较多数量的文件描述符的监听无论是select还是poll系统调用都显得捉襟见肘,poll每次都需要将所有的文件描述符复制到内核,内核本身不会对这些文件描述符加以保存,这样的设计...【详细内容】
2021-12-13  深度Linux    Tags:Linux   点击:(19)  评论:(0)  加入收藏
今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。截至目前,业界使用范...【详细内容】
2021-12-10  架构驿站    Tags:eBPF   点击:(29)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条