Linux 管道、重定向、特殊字符

Linux 管道、重定向、特殊字符

重定向

输入重定向是将数据导入到命令中,给命令提供数据。而输出重定向反之,将命令执行之后的结果导入到文件。

使用重定向输出可以对文件清空,又或者追加数据。

输出重定向分为两种:标准输出和错误输出。

它们的区别在于:标准输出是将正常的数据输出文件,而错误输出,是指执行命令过程中发生的错误,通过错误输出重定向可以将错误输出到文件中,而不是显示在屏幕上。

  • 标准输入重定向(STDIN,文件描述符为0)

    • 默认从键盘输入,也可从其他文件或命令中输入
  • 标准输出重定向(STDOUT,文件描述符为1)

    • 默认输出到屏幕。
  • 错误输出重定向(STDERR,文件描述符为2)

    • 默认输出到屏幕。

标准输入

符号表示及其作用:

  • 命令 < 文件
    • 文件的数据作为标准输入的数据给命令
  • 命令 << 分界符
    • 输入内容不从文件获取,将分界符包含的内容输入到命令

将文件中的内容通过 wc -l 命令将统计文件的行数。

[root@localhost ~]# wc -l < err.log
1

使用分界符输入内容:

[root@localhost ~]# echo << over
> 1
> 2
> 3
> 4
> 5
> 6
> 7
> 8
> 9
> over

输出重定向

符号及作用:

  • 命令 > 文件
    • 将命令执行之后的结果输出到文件中
  • 命令 2> 文件
    • 将执行命令导致的错误输出到文件
  • 命令 >> 文件
    • 向文件中追加数据
  • 命令 2>> 文件
    • 将执行命令导致的错误追加输出到文件中
  • 命令 >> 文件 2>&1、命令 &>> 文件
    • 将内容及错误追加到文件中

标准输出

例如说,对于某个命令使用语法不懂,可以使用 man 命令获取命令得手册,但是一般在命令终端看有点不是很方便,所以这种情况就可以将其输出到文件中,这样就方便多了。

[root@localhost ~]# man ls > man.txt

将 ls 命令的手册输出到 man.txt 文件中

或者对文件追加数据命令的手册:

[root@localhost ~]# man man > man.txt

错误输出

将错误输出文中,而不是输出到屏幕:

[root@localhost ~]# man man 2> err.log

Linux 管道

管道,顾名思义,是直行的。在 linux 管道命令符的作用:“将前一个命令执行之后原本要输出的标准正常数据当作是后一个命令的标准输入”,表现形式:| (shift+\)

语法:

命令 | 命令 | 命令 ......

现在有个例子,将统计 /etc/passwd 文件中有多少个用户,如下:

[root@localhost ~]# cat /etc/passwd | wc -l
25

使用管道符,可以将结果进行一遍又一遍的处理,就像是每一个 | 符号都是一个关卡,经过每个 | 交由下一个命令处理,最后是预期想要的结果。

在修改用户密码的时候需要确认密码,这种情况如果是自动化脚本执行修改密码的时候,可能无法处理。

passwd 其中有个选项 --stdin 就是从标准输入读取密码,这样的话通过标准输入加上管道,可以从标准输入读取密码。

[root@localhost ~]# echo 123123 | passwd --stdin root
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。

命令通配符

有些情况忘记了具体文件名,只记住其中几个字符,那么这种情况可以使用通配符来匹配文件,在文件非常多的情况最为有用。

通配符和正则的对应的符号有点类似,不过作用都是匹配字符。

    • 匹配任何任意数量字符
    • 匹配单个字符
  • [example]
    • 匹配方括号内的字符
  • [!example] or [^abcd]
    • 匹配不在方括号内的字符
  • [-]
    • 匹配一个范围
    • 例如:[1-9]
  • {a,[...]}
    • 以逗号分隔
    • 生成集合,如:{a,b,c} a b c
    • 生成序列,如: a b c d

转义字符

常用转义符:

  • 反斜杠(\)

    • 使反斜杠后面的一个变量变为单纯的字符串。
  • 单引号('')

    • 转义其中所有的变量为单纯的字符串。
  • 双引号("")

    • 保留其中的变量属性,不进行转义处理。
  • 反引号(``)

    • 把其中的命令执行后返回结果。

其它特殊字符

  • ~
    • 用户的 /home 目录
  • #
    • 表示注释,如:# echo 123
  • ,
    • 作为间隔用途
  • ;
    • 在 linux 中表示连续执行命令的意思
    • 按顺序执行:ls -l;cat err.log
  • ;;
    • 表示终结
  • .
    • 当前目录
  • ..
    • 上级目录
  • :
    • null
  • $
    • 变量引导符,使用变量需要在前面加上
    • $ 本身就是一个变量,代表着 shell 的进程id
  • $?
    • 进程状态值
    • 子进程退出后会将 status 回传给父进程,通过 $? 可以获得进程的状态
  • $*
    • 引用变量,引用的数量与指令相同,从 0 递增指令本身是 0
    • $* 表示所有引用变量
    • 如:$0, $1 ... ${10}, ${11}......
  • $@
    • 引用变量,与 $* 作用类似
    • 不同之处,保留每个引用变量的区段
  • $#
    • 引用变量的总数
  • $()
    • 被括号包括的指令将被执行 与 `` 作用相同
  • &
    • 表示在后台运行
  • &&
    • 逻辑操作符
    • 表示 与(and)
  • ||
    • 表示 或(or)
  • +-*%
    • 这些符号用在数学运算上表示:加减乘除
  • =
    • 赋值
  • ==
    • 等号,比较两个值是否相等
  • !=
    • 不等
  • ()、$()
    • 指令组,以子 shell 运行指令