仅仅是学习Linux系统的命令还不够,只有把多个命令按照自己想要的方式进行组合使用,才能提高工作效率。今天的内容主要是关于如何把命令组合在一起使用,使得输入的命令更准确、更高效,也为接下来的Shell脚本打好基础。

一、输入输出重定向


  输入重定向:指把文件内容导入到命令中。

  输出重定向:指把原本要输出到屏幕的数据信息写入到指定的文件中,又分为标准输出重定向错误输出重定向两种。

    •   标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或命令输入。
    •   标准输出重定向(STDIN,文件描述符为1):默认输出到屏幕。
    •   错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。

  要区别对待两种输出信息,第一种是命令的标准输出信息,第二种是命令的报错提示信息(错误输出),如下所示:

[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. root root Feb anaconda-ks.cfg //ls命令的标准输出信息,也是我们想要的信息
[root@linuxprobe ~]#
[root@linuxprobe ~]# ls -l xxxxx
ls: cannot access xxxxx: No such file or directory //因为xxxxx文件不存在,所以输出的是报错提示信息
[root@linuxprobe ~]#

  对于输入重定向来说,用到的符号及其作用如下所示:

符号 作用
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符 从标准输入中读入,直到遇见分界符才停止(分界符可以自己定义,如"EOF"、"over"等)
命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2

  对于输出重定向来说,用到的符号及其作用如下所示:

符号 作用
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原来文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有文件的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >>  文件 2>&1  或  命令 &>> 文件 将标准输出和错误输出共同写入到文件中(追加到原有内容的后面)

  通过标准输出重定向将 man ls 命令原本要输出到屏幕的信息写入文件readme.txt中,然后显示readme.txt文件中的内容,具体命令如下:

[root@linuxprobe ~]# man ls > readme.txt
[root@linuxprobe ~]#
[root@linuxprobe ~]# cat readme.txt
LS() User Commands LS() NAME
ls - list directory contents SYNOPSIS
ls [OPTION]... [FILE]... DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor
--sort is specified.
---------------------------------省略部分输出内容---------------------

  通过覆盖写入模式向readme.txt文件中写入一行数据,然后再通过追加写入模式再写入一行数据,具体命令如下:

[root@linuxprobe ~]# echo "Welcome to my home" > readme.txt      //清除原有的内容
[root@linuxprobe ~]# echo "Learning Linux is happy to me" >> readme.txt //追加至原来文件内容的后面
[root@linuxprobe ~]#
[root@linuxprobe ~]# cat readme.txt
Welcome to my home
Learning Linux is happy to me
[root@linuxprobe ~]#

  如果想把命令的报错信息写入文件,该如何操作呢?

[root@linuxprobe ~]# ls -l xxxxx
ls: cannot access xxxxx: No such file or directory //提示xxxxx文件不存在
[root@linuxprobe ~]#
[root@linuxprobe ~]# ls -l xxxxx > readme.txt //将报错信息写入readme.txt文件
[root@linuxprobe ~]#
[root@linuxprobe ~]# cat readme.txt
ls: cannot access xxxxx: No such file or directory //报错信息写入readme.txt文件成功
[root@linuxprobe ~]#

  输入重定向相对来说比较冷门,在工作中遇到的概率较小。输入重定向的作用是把文件内容直接导入命令中。接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计文件内容的行数。

[root@linuxprobe ~]# cat readme.txt
ls: cannot access xxxxx: No such file or directory
[root@linuxprobe ~]#
[root@linuxprobe ~]# wc -l < readme.txt //使用输入重定向 [root@linuxprobe ~]#

二、管道命令符


  管道符,即“|”,其执行的格式“命令A | 命令B”,当然可以这样使用:“命令A | 命令B | 命令C”。管道命令符的作用是把前一个命令A原本要输出到屏幕的标准正常数据当作是后一个命令B的标准输入,比如把搜索命令的输出值传递给统计命令,具体如下:

[root@localhost ~]# grep "/sbin/nologin" /etc/passwd | wc -l

[root@localhost ~]#

  再比如用翻页的形式查看/etc目录中的文件列表及属性信息:

[root@localhost ~]# ls -l /etc/ | more
total
-rw-r--r--. root root Jun adjtime
-rw-r--r--. root root Jun aliases
-rw-r--r--. root root Jun aliases.db
drwxr-xr-x. root root Jun alternatives
-rw-------. root root Mar anacrontab
-rw-r--r--. root root Nov asound.conf
-rw-r--r--. root root Oct at.deny
drwxr-x---. root root Jun audisp
drwxr-x---. root root Jun audit
drwxr-xr-x. root root Jun bash_completion.d
-rw-r--r--. root root Nov bashrc
drwxr-xr-x. root root Nov binfmt.d
-rw-r--r--. root root Nov centos-release
--More--

  在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过管道符和passwd命令的--stdin参数相结合,可以用一条命令来完成密码重置的操作:

[root@localhost ~]# echo "" | passwd --stdin root     //一条命令修改root用户密码
Changing password for user root.
passwd: all authentication tokens updated successfully.
[root@localhost ~]#

  通过重定向技术能够一次性地把多行信息打包输入或输出,比如让用户一直输入内容,直到用户输入了其自定义的分界符时,才结束输入。这种方法在编写自动化脚本时经常用到。

[root@localhost ~]# mail -s "readme" root@localhost << over     //"over"为用户自定义地分界符
> i think linux is very practical
> i hope to learn more
> can you teach me?
> over //遇到分界符后结束输入,以上3行信息则为用户输入的有效内容

[root@localhost ~]#

三、命令行的通配符


  通配符,顾名思义,就是通用的匹配信息的符号,常见的通配符如下所示:

    •   星号(*)代表匹配零个或多个字符;
    •   问号(?)代表匹配单个字符;
    •   中括号内加上数字([0-9])代表匹配0~9之间的单个数字的字符;
    •   中括号内加上字母([abc])则代表匹配a、b、c三个字中的任意一个字符。

  匹配在/dev目录中所有以sda开头的文件:

[root@localhost ~]# ls -l /dev/sda*
brw-rw----. root disk , Feb : /dev/sda
brw-rw----. root disk , Feb : /dev/sda1
brw-rw----. root disk , Feb : /dev/sda2
[root@localhost ~]#

  匹配以sda开头,且后面还紧跟某一个字符(字符包括字母、数字、特殊符号等等)的文件:

[root@localhost ~]# ls -l /dev/sda?       //该命令排除了/dev/sda文件,因为不匹配空值
-rw-r--r--. root root Feb : /dev/sda@ //该文件为本人所创建,用来实验测试
brw-rw----. root disk , Feb : /dev/sda1
brw-rw----. root disk , Feb : /dev/sda2
[root@localhost ~]#

  匹配以sda开头,且后面还紧跟某一个数字的文件:

[root@localhost ~]# ls -l /dev/sda[-]
brw-rw----. root disk , Feb : /dev/sda1
brw-rw----. root disk , Feb : /dev/sda2
[root@localhost ~]#

  匹配以sda开头,且后面还紧跟1、3、5中的某一个数字的文件:

[root@localhost ~]# ls -l /dev/sda[]       //最好写成[1,3,5],因为这种写法更规范
brw-rw----. root disk , Feb : /dev/sda1
[root@localhost ~]#

四、常用的转义字符


  Shell解释器提供了丰富的转义字符来处理输入的特殊数据,常见的4个转义字符如下所示:

    •   反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串;
    •   单引号(''):转义其中所有的变量为单纯的字符串;
    •   双引号(""):保留其中的变量属性,不进行转义处理
    •   反引号(``):把其中的命令执行后返回结果。

  实验:先定义一个名为PRICE的变量并赋值5,然后输出以双引号括起来的字符串与变量信息:

[root@localhost ~]# PRICE=
[root@localhost ~]#
[root@localhost ~]# echo "Price is $PRICE" //保留其中变量属性
Price is 5

  实验:想要输出“Price is $5”,需要使用反斜杠进行转义。

[root@localhost ~]# echo "Price is $$PRICE"    //$$的作用是显示当前程序的进程ID号码
Price is
2571PRICE
[root@localhost ~]#
[root@localhost ~]# echo "Price is \$$PRICE" //使用反斜杠进行转义
Price is $

[root@localhost ~]#

  实验:输出命令执行的结果。

[root@localhost ~]# echo `uname -a`     //先执行uname -a命令,然后输出执行结果
Linux localhost.localdomain 3.10.-.el7.x86_64 # SMP Tue Nov :: UTC x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]#

五、重要的环境变量


  变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都用大写表示,这是一种约定俗成的规范。可以直接通过变量名称来提取对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户的家目录、邮件存放的位置等。

  在执行了一条命令后,Linux系统中到底发生了什么呢?简单来说,主要分为4个步骤:

  第1步:判断用户是否以绝对路径相对路径的方式输入命令(如/bin/ls就是以绝对路径的方式执行命令),如果是的话则直接执行。

  第2步:Linux系统检查用户输入的命令是否为“别名命名”,即用一个自定义的命令名称来替换原本的命令名称。alias命令可以用来创建属于自己的命令别名,格式为“alias 别名=命令”。unalias命令用来取消命令别名,格式为“unalias 别名”。在上图中,输入ls命令后,不同的文件类型显示不同的颜色,这其实就是Linux系统为了方便用户区分文件类型而特意设置的ls命令别名。

[root@localhost ~]# alias ls='ls --color=auto'    //设置命令的别名,执行ls命令则等同于执行ls --cloar=auto
[root@localhost ~]#

  第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的命令,会被直接执行。而用户在绝大多数输入的是外部命令,这些外部命令交由第4步处理。可以用“tyep 命令名称”来判断输入的命令是内部命令还是外部命令,能定位到命令存放的路径的都是外部命令。

[root@linuxprobe ~]# type cat
cat is /usr/bin/cat
[root@linuxprobe ~]# type more
more is /usr/bin/more

  第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,作用是告诉Bash解释器将要执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些路径下逐个查找。PATH变量包含多个路径值,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。

[root@linuxprobe ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@linuxprobe ~]#
[root@linuxprobe ~]# PATH=$PATH:/root/bin //添加新的路径,不过系统重启后失效
[root@linuxprobe ~]#
[root@linuxprobe ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin //添加成功
[root@linuxprobe ~]#

  综上所述,作为一名态度谨慎的运维工作者来说,在接手一台新的Linux系统后一定要检查PATH变量中是否有可疑的目录。另外,可以使用env命令来查看Linux系统中所有的环境变量,其中最重要的10个环境变量如下所示:

变量名称 作用
HOME 用户的主目录(即家目录)
SHELL 用户当前使用的SHELL解释器的名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称(出现乱码后,首先检查该变量)
RANDOM 生成一个随机数字
PS1 Bash解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器

  Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。

[root@linuxprobe ~]# echo $HOME
/root
[root@linuxprobe ~]# su - linuxprobe //切换至linuxprobe用户
Last login: Sat Feb :: BNT on :
[linuxprobe@linuxprobe ~]$
[linuxprobe@linuxprobe ~]$ echo $HOME
/home/linuxprobe
[linuxprobe@linuxprobe ~]$

  我们完全可以自行创建一个变量,来满足工作需求。例如设置一个名为WORKDIR的变量,如下所示:

[root@linuxprobe ~]# mkdir /home/workdir    //新建一个目录
[root@linuxprobe ~]#
[root@linuxprobe ~]#
[root@linuxprobe ~]# WORKDIR=/home/workdir //新建一个变量,并将路径赋值给WORKDIR变量
[root@linuxprobe ~]#
[root@linuxprobe ~]# cd $WORKDIR
[root@linuxprobe workdir]# pwd
/home/workdir
[root@linuxprobe workdir]#

  这样的变量不具有全局性,作用范围有限,可以使用export命令将其提升为全局变量,这样其他用户就可以使用了。注意:当使用su - 命令切换用户时,export命令无效

[root@linuxprobe ~]#
[root@linuxprobe ~]# WORKDIR=/home/workdir/ //给WORKDIR变量赋值
[root@linuxprobe ~]# echo $WORKDIR
/home/workdir/
[root@linuxprobe ~]# export WORKDIR //提升为全局变量
[root@linuxprobe ~]#
[root@linuxprobe ~]# su linuxprobe //切换至linuxprobe用户
[linuxprobe@linuxprobe root]$
[linuxprobe@linuxprobe root]$ echo $WORKDIR //成功输出WORKDIR变量的值
/home/workdir/
[linuxprobe@linuxprobe root]$ su - linuxprobe //使用su -命令切换至linuxprobe用户
Password:
Last login: Sat Feb :: BNT on pts/
[linuxprobe@linuxprobe ~]$ echo $WORKDIR //无法查看WORKDIR变量的值 [linuxprobe@linuxprobe ~]$

Linux学习Day4:管道符、重定向与环境变量的更多相关文章

  1. Linux学习--第十一天--source、环境变量目录、欢迎信息、正则、cut、awk、sed、sort、判断表达式、if、for、case、一些脚本

    source source /root/.bashrc #让修改后的配置文件在不重启系统的情况下生效.source等同于. 环境变量目录 /etc/profile /etc/profile.d/*.s ...

  2. Linux学习之管道符、重定向、通配符、转义符、环境变量

    Linux学习之管道符.重定向.通配符.转义符.环境变量 1. 输入输出重定向 输入重定向是指把文件导入命令中. 输出重定向是指把原本要输出到屏幕的数据信息写入指定文件中. a 标准输入重定向(STD ...

  3. 《Linux就该这么学》培训笔记_ch03_管道符、重定向与环境变量

    <Linux就该这么学>培训笔记_ch03_管道符.重定向与环境变量 文章最后会post上书本的笔记照片. 文章主要内容: 输入输出重定向 管道命令符 命令行的通配符 常用的转义字符 重要 ...

  4. Linux学习之CentOS(一)--CentOS6.4环境搭建

    Linux学习之CentOS(一)--CentOS6.4环境搭建http://www.cnblogs.com/xiaoluo501395377/archive/2013/03/31/CentOs.ht ...

  5. 【linux草鞋应用编程系列】_2_ 环境变量和进程控制

    一. 环境变量     应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作.     在linux中有两种方法获取环境变量,分述如下.   1.通过main函数的参数获取环境变量 ...

  6. Linux下Jdk的安装和jdk环境变量的设置

    我们在Linux下安装系统软件的时候,经常遇到一些系统环境变量配置的问题.什么是环境变量?如何定制环境变量?我将在下面做一些介绍.一.什么是环境变量?Linux是一个多用户的操作系统.多用户意味着每个 ...

  7. Linux上安装jdk1.8和配置环境变量

    前言 Linux 上安装jdk1.8 和配置环境变量,参考相关文档,本人在此总结,操作归纳如下. 第一步:创建jdk安装目录(该/usr/local/src 目录是空的,最好把我们自己下载的放到这,容 ...

  8. Linux—export命令查看、修改用户环境变量

    Linux export 命令用于设置或显示环境变量. 在 shell 中执行程序时,shell 会提供一组环境变量. export 可新增,修改或删除环境变量,供后续执行的程序使用. export ...

  9. Linux就该这么学(3)-管道符、重定向与环境变量(学习笔记)

    1.Linux命令与文件读写操作有关的重定向技术: 学习目标:主要解决输出信息的保存问题. 标准覆盖输出重定向: 标准追加输出重定向 错误覆盖输出重定向 错误追加输出重定向 输入重定向 标准输入(ST ...

随机推荐

  1. 深入理解大数据之——事务及其ACID特性

    目录 事务简介 事物的定义 事务的目的 事务的状态 事务的ACID属性 ACID简介 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durabi ...

  2. 个人第四次作业Alpha2版本测试

    个人第四次作业Alpha2版本测试 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 团队名称 GP工作室 这个作业的目标 对其他小组的项目进行测试 测试人员 陈杰 学号 20173102 ...

  3. 创建dynamics CRM client-side (九) - 用JS来获取look up 信息

    我们用以下的代码可以获取到look up 的信息. 大家可以查看微软文档来查看更多关于 lookup object的信息 https://docs.microsoft.com/en-us/powera ...

  4. Nginx-Http服务器常用配置

    #运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; ...

  5. ElasticSearch入门篇Ⅰ --- ES核心知识概括

    C01.什么是Elasticsearch 1.什么是搜索 垂直搜索(站内搜索) 互联网的搜索:电商网站,招聘网站,各种app IT系统的搜索:OA软件,办公自动化软件,会议管理,员工管理,后台管理系 ...

  6. springboot整合elasticJob实战(纯代码开发三种任务类型用法)以及分片系统,事件追踪详解

    一 springboot整合 介绍就不多说了,只有这个框架是当当网开源的,支持分布式调度,分布式系统中非常合适(两个服务同时跑不会重复,并且可灵活配置分开分批处理数据,贼方便)! 这里主要还是用到zo ...

  7. C++使用类调用CUDA核函数

    正如CUDA C所称,CUDA对C语言进行了很好的扩展,直接使用C语言可以非常简单方便的调用CUDA核函数.但是当想使用C++的类成员函数直接调用核函数是不可行的,第一,核函数不能作为类的成员函数,第 ...

  8. session、cookie、sessionStorage、localStorage的简要理解

    一.cookie和session 首先 session 和 cookie 用于浏览器客户端与服务端数据交互,通过会话的方式跟踪浏览器用户身份. 1.cookie (1).一般由服务器生成,可以设置失效 ...

  9. Java并发编程(二):volatile关键字

    volatile是Java虚拟机提供的轻量级的同步机制.volatile关键字有如下两个作用,一句话概括就是内存可见性和禁止重排序. 1)保证被volatile修饰的共享变量对所有线程总是可见的,也就 ...

  10. Request和Session的生命周期

    request的生命周期是request请求域,一个请求结束,则request结束 session的生命周期是session会话域,打开一个浏览器请求一个网站的页面后,Session开始,当sessi ...