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

介绍

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

引导顺序

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

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< 和

<< :输入一段文本,直到读到<

> :用于重定向改变标准输出(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/

创建一个一个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

diff

引用

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来简化你的工作,用他来帮你做输入和参数处理的工作,比如下面一个例子:

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

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

总结:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 删除单个创建文件夹,Linux 删除文件夹和创建文件的命令

VS中批注的使用SAL 是 Microsoft 源代码注释语言. 使用源代码批注,可以使代码背后的意图更加清晰. 这些注释还可以使用自动化的静态分析工具更准确地分析代码,显著减少误判.那么什么是批注,举个简单的例子, ...MVVM架构~knockoutjs系列之数组的&dollar;index和&dollar;…

安卓界面组件-文本框

前面三篇文章本质上是围绕着View类进行的。View是安卓UI的基础类&#xff0c;我们的安卓开发“千里之行”是从View开始的。 安卓界面UI有大量的组件&#xff0c;组件的继承和间接继承于View。有一类组件很基本&#xff0c;这就是TextView文本框&#xff0c;作用是显示文本。在T…

linux centos7重启路由命令行,centos7 永久添加静态路由

查看路由表ip route show|column -troute -n永久添加路由vim /etc/sysconfig/network-scripts/route-ens224./ via ../ via重启网络生效systemctl restart networkCentos6C、# vi /etc/sysconfig/static-routes (没有static-routes的话就手动建立一个这样的文件&#xff0c;推荐…

linux内核端口绑定,linux 多网卡bonding 绑定 端口聚合

将多个Linux网络端口绑定为一个&#xff0c;可以提升网络的性能&#xff0c;比如对于备份服务器&#xff0c;需要在一个晚上备份几个T的数据&#xff0c;如果使用单个的千兆网口将会是很严重的瓶颈。其它的应用&#xff0c;比如ftp服务器&#xff0c;高负载的下载网站, 都有类似…

a=a+b和a+=b的区别

1 class Test2 {3 public static void main(String[] args) 4 {5 byte a 127;6 byte b 127;7 byte c(byte)(ab);8 System.out.println(c);9 ab; 10 System.out.println(a); 11 } 12 } 上面的“ab” 操作会先将“…

linux 端口打不开,在线等!!为什么telnet的23端口就是打不开啊

在线等&#xff01;&#xff01;为什么telnet的23端口就是打不开啊发布时间:2007-07-26 19:40:07来源:红联作者:roogger[rootRHEnterprise5 Server]# chkconfig --list |grep telnetekrb5-telnet: offkrb5-telnet: offtelnet: on[rootRHEnterprise5 Server]# netstat -antActiv…

TP框架中的A方法和R方法

ThinkPHP 跨模块调用操作方法&#xff08;A方法与R方法&#xff09;跨模块调用操作方法前面说了可以使用 $this 来调用当前模块内的方法&#xff0c;但实际情况中还经常会在当前模块调用其他模块的方法。ThinkPHP 内置了 A 方法与 R 方法这两个特殊的大写字母方法来处理跨模块调…

C数组逆序

一、标准交换模式 /**** *标准交换模式 *实现数组的逆序&#xff0c;原理就是数组的首尾元素进行交换 ***/ #define N 5; int main(){ int array[N] {15,20,25,30,35} int temp; //声明临时变量 int i; for(i 0;i<N/2;i){ //第i个值和第N-i-1个值相交换 temp array[i]; a…

redis linux 运行依赖,在Ubuntu系统下安装Redis Desktop Manager的方法

以下为你介绍在Ubuntu16.04系统下安装Redis可视化工具Redis Desktop Manager。不管是哪个Redis Desktop Manager版本&#xff0c;都可以采用下面的安装方式进行。Redis Desktop Manager安装方法1.首先在终端中启动redis服务执行命令&#xff1a;sudo service redis start 与 ps…

Ubuntu下搜狗拼音输入法打不出汉字的解决方法

问题 &#xff08;1&#xff09;Ubuntu下&#xff0c;搜狗拼音输入法能启动&#xff08;系统托盘处有图标&#xff09;&#xff0c;但是打不出汉字&#xff0c;打字时选框不正常。 或者 &#xff08;2&#xff09;Deepin下&#xff0c;搜狗输入法无法启动&#xff0c;托盘处不显…

linux rt 应用程序,RTlinux编程

RTlinux主要的api函数实时应用程序分为两部分,内核部分和应用部分,应用部分需要和内核部分通过FIFO进行数据交换和控制,除此之外和一般应用程序没有太多区别,内核部分比较复杂,程序以模块方式挂入内核,这部分程序的编写需要对底层的东西有较高的要求,除了掌握RTLinux的API以外还…

关于dns预解析

DNS 实现域名到IP的映射。通过域名访问站点&#xff0c;每次请求都要做DNS解析。目前每次DNS解析&#xff0c;通常在200ms以下。针对DNS解析耗时问题&#xff0c;一些浏览器通过DNS Prefetch 来提高访问的流畅性。 什么是 DNS Prefetch ? DNS Prefetch 是一种DNS 预解析技术&a…

linux nslcd服务,redhat – sssd vs nslcd for RHEL-5/6

sssd可能是更具“前瞻性”的选择.在这种程度上,其他答案是正确的.也就是说,与流行的观点相反,sssd并没有完全取代nslcd的功能.nslcd优于sssd的主要(情境)优势是您可以编写带参数替换的自定义authz查询&#xff1a;pam_authz_search FILTERThis option allows flexible fine tun…

bzoj4631

4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 260 Solved: 133[Submit][Status][Discuss]Description 六一儿童节到了&#xff0c; SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏&#xff1a;有N个盒子从左到右排成一排&#xff0c;第i个盒子里装着Ai个气球。SH…

hpcp5225设置linux网络,惠普HP color laserjet CP5225打印机驱动

软件标签&#xff1a;惠普CP5225驱动是为同名打印机推出的驱动程序&#xff0c;维持着打印机的正常工作&#xff0c;小编提供了驱动下载&#xff0c;若是你的惠普CP5225打印机在使用过程中出现不能打印或者无法被电脑识别等问题&#xff0c;快来本站下载该驱动来解决问题吧!安装…

Dubbo底层采用Socket进行通信详解

由于Dubbo底层采用Socket进行通信&#xff0c;自己对通信理理论也不是很清楚&#xff0c;所以顺便把通信的知识也学习一下。 n 通信理论 计算机与外界的信息交换称为通信。基本的通信方法有并行通信和串行通信两种。 1.一组信息&#xff08;通常是字节&#xff09;的各位数据被…

linux 网络协议栈变化,ZZ Linux网络协议栈学习

最近学习linux内核网络协议栈&#xff0c;把数据包接收流程大致理了一下&#xff0c;前面也看了瀚海书香兄的总结&#xff0c;感觉总结的比我精炼&#xff0c;抓住了主干&#xff0c;是一目了然的那种我的这篇本来是自己看得&#xff0c;因此把我自己学习中一些遇到的问题写了出…

delete删除

delete只能删除属性&#xff0c;不能删除变量和原型链上的属性 1,对象属性删除 var obj {name: mary } delete obj.name; console.log(obj.name); // undefined 2、删除数组中的元素&#xff0c;删除值&#xff0c;不能删除索引 var arr [1, 2, 3]; console.log(arr[0], arr…

linux安装各种文件格式,Embeded linux中的各类文件系统

Cramfs&#xff1a;(优点&#xff1a;只读&#xff0c;目的&#xff1a;不可更改文件、防入侵)1.下载cramfs-1.1源码工具http://files.cnblogs.com/files/pokerface/cramfs-1.1.tar.gz2.解压tar xvzf cramfs-1.1.tar.gz -C /home/liuzhengwu/tools3.编译make4.得到COPYING cra…

拯救者linux无法正常关机,Ubuntu无法关机解决办法

说明&#xff1a;如果不成功请参考一下文章最后的内容&#xff0c;也许会有帮助。其实不止在ubuntu里面&#xff0c;fedora里面我也遇到了这个问题&#xff0c;就是电脑可以重启&#xff0c;但是不能直接关机&#xff0c;否则就一直停在关机界面&#xff0c;需手动关机。郁闷很…