Linux就该这么学28期——Day04 管道符、重定向符、环境变量
3.1输入输出重定向 顾名思义就是将输入输出的结果指向另一个地方 > <
输出重定向分两类:
标准输出重定向: 一个“>”会清空源文件信息 两个">"可以追加不清空
> 覆盖
>> 追加
错误输出重定向: 报错信息不能通过标准重定向符输出到文件中,需要使用错误输出重定向符
2> 覆盖
2>> 追加
命令 >> 文件 2>&1 或 命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的
输入重定向符:
< 文件 将文件作为命令的标准输入
<< 分界符 从标准输入中读入,直到遇见分界符才停止
< 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2
[root@linuxprobe ~]# wc -l < readme.txt 信息流传给命令 2 [root@linuxprobe ~]# wc -l /etc/passwd 38 /etc/passwd “wc -l /etc/passwd”是一种非常标准的“命令+参数+对象”的执行格式 而这次的“wc -l < readme.txt”则是将readme.txt文件内的内容通过操作符导入到的命令中,没有被当作命令对象进行执行的过程 因此wc命令只能读到信息流的数据,没有文件名称的信息。
3.2 管道命令符 任意门
命令A | 命令B A执行的结果数据 传给B的动作继续执行
[root@linuxprobe ~]# grep /sbin/nologin /etc/passwd | wc -l 40
passwd --stdin 参数 接收标准输入或管道符进来的密码 把管道符和passwd命令的--stdin参数相结合,可以用一条命令来完成密码重置操作。 [root@linuxprobe ~]# echo "linuxprobe" | passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully.
3.3 命令行的通配符
* 匹配 零个或多个字符
? 匹配单个字符
[0-9]· 单个数字
[a-z] 单个小写字母
[A-Z] 单个大写字母
[1,3,5] 匹配精准数字
{1,2,23} 大括号可以匹配23 强匹配
[1,4,23] 中括号,只要字符出现就会匹配 2 3 23
[:alpha:] 任意字母
[:upper:] 任意大写字母
[:lower:] 任意小写字母
[:digit:] 任意数字
[:alnum:] 任意字母加数字
[:punct:] 标点符号
通配符不仅可以被用于搜索文件或代替被通配的字符,还可以与创建文件的命令相结合,一口气创建出好多个文件。唯一区别是要用到大括号,并且字段之间用逗号间隔: [root@linuxprobe ~]# touch {AA,BB,CC}.conf [root@linuxprobe ~]# ls -l *.conf -rw-r--r--. 1 root root 0 Sep 22 01:54 AA.conf -rw-r--r--. 1 root root 0 Sep 22 01:54 BB.conf -rw-r--r--. 1 root root 0 Sep 22 01:54 CC.conf 再或者输出一些指定的信息,玩法特别多,接下来大家就自己开发吧~: [root@linuxprobe ~]# echo file{1,2,3,4,5} file1 file2 file3 file4 file5
3.4 转义字符
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符。
单引号(' '):转义其中所有的变量为单纯的字符串。
双引号(" "):保留其中的变量属性,不进行转义处理。
反引号(` `):把其中的命令执行后返回结果。
$$ 显示当前程序的进程ID
[root@linuxprobe ~]# PRICE=5 [root@linuxprobe ~]# echo "Price is $PRICE" Price is 5 接下来,我们希望能够输出“Price is $5”,即价格是5美元的字符串内容,但碰巧美元符号与变量提取符号合并后的$$作用是显示当前程序的进程ID号码,于是命令执行后输出的内容并不是我们所预期的: [root@linuxprobe ~]# echo "Price is $$PRICE" Price is 3767PRICE 要想让第一个“$”乖乖地作为美元符号,那么就需要使用反斜杠(\)来进行转义,将这个命令提取符转义成单纯的文本,去除其特殊功能: [root@linuxprobe ~]# echo "Price is \$$PRICE" Price is $5
参数中如果出现了空格,那么就加双引号,如果参数中没有空格,那就不用加~
3.5 重要的环境变量
命令在Linux中的执行分为四个步骤:
1. 绝对路径、相对路径 直接执行
2. 别名 alias 执行其本身命令 “alias 别名=命令” unalias 取消别名
3.内部命令 使用率仅0.1% “type 命令名称”来判断用户输入的命令是内部命令还是外部命令:
4.外部命令 PATH:解释器小助手 告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
[root@linuxprobe ~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin [root@linuxprobe ~]# PATH=$PATH:/root/bin [root@linuxprobe ~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin:/root/bin
接手新电脑后,执行命令前先检查PATH变量中是否有可疑目录
env命令 查看当前Linux系统中所有的环境变量
重要的10个环境变量:
HOME 用户的主目录
SHELL 用户在使用的shell解释器的名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令条数
MAIL 邮件保存路径
LANG 系统语言。语系名称
RANDOM 生成随机数字
PS1 Bash解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器
[root@linuxprobe ~]# echo $PS1 [\u@\h \W]\$ [root@linuxprobe ~]# echo $MAIL /var/spool/mail/root [root@linuxprobe ~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin [root@linuxprobe ~]# echo $HOME /root [root@linuxprobe ~]# echo $SHELL /bin/bash [root@linuxprobe ~]# echo $HISTSIZE 1000 [root@linuxprobe ~]# echo $HISTFILESIZE 1000 [root@linuxprobe ~]# echo $LANG en_US.UTF-8
自行创建的变量属于个人私有,想要变为全局变量需要使用export命令将其提升。
直接在终端设置的变量能够立即生效,但重启服务器后就会消失掉,因此我们需要将变量和变量值写入到.bashrc或者.bash_profile文件中以确保永久能使用它们。
[root@linuxprobe ~]# mkdir /home/workdir [root@linuxprobe ~]# WORKDIR=/home/workdir [root@linuxprobe ~]# cd $WORKDIR [root@linuxprobe workdir]# pwd /home/workdir 但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用: [root@linuxprobe workdir]# su linuxprobe [linuxprobe@linuxprobe ~]$ cd $WORKDIR [linuxprobe@linuxprobe ~]$ echo $WORKDIR [linuxprobe@linuxprobe ~]$ exit 如果工作需要,可以使用export命令将其提升为全局变量,这样其他用户也就可以使用它了: [root@linuxprobe ~]# export WORKDIR [root@linuxprobe ~]# su linuxprobe [linuxprobe@linuxprobe ~]$ cd $WORKDIR [linuxprobe@linuxprobe workdir]$ pwd /home/workdir 后续要是不用这个变量了,那么就顺手执行下unset命令取消掉它吧: [root@linuxprobe ~]# unset WORKDIR [root@linuxprobe ~]#