管道符、重定向和环境变量
我的想法
所谓重定向,就是把原本要在这里输出的内容输出到另外一个位置中去。
输入输出重定向
标准输入重定向:
可以从键盘中输入,也可以从其他文件或命令中输入。
所用的符号
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符 从标准输入中读入,直到遇到分界符才停止
命令 <文件1> 文件2 将文件1作为命令的标准输入并将标准输出到文件2
标准输出重定向
输出到屏幕中,或者把原本要输出到屏幕中的数据信息写到指定的文件夹中。
所用的符号:
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(...)
命令 >>文件 将标准输出重定向到一个文件中(追加)
命令 2>> 文件 将错误输出重定向到一个文件中(...)
命令 >> 文件 2>&1
或 命令 &>> 文件
将标准输出与错误输出共同写入到文件按中(追加到原有内容的后面)
为什么上面有2没有1,原有描述符1可写可不写
输出重定向例子
ji@ji-virtual-machine:~$ echo 'welcome to my world!' > readm.txt
ji@ji-virtual-machine:~$ cat readm.txt
welcome to my world!
ji@ji-virtual-machine:~$ echo 'welcome to my world!' >>readm.txt
ji@ji-virtual-machine:~$ cat readm.txt
welcome to my world!
welcome to my world!
把错误输出重定向到文件中
ji@ji-virtual-machine:~$ ls -l xxxxx 2> readm.txt
ji@ji-virtual-machine:~$ cat readm.txt
ls: 无法访问xxxxx: 没有那个文件或目录
输入重定向
使用wc -l 命令查看文件有多少行
ji@ji-virtual-machine:~$ wc -l < readm.txt
1
等价于 cat readm.txt|wc -l
管道命令符
把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入。
以找出被限制登录用户的命令为例
grep "/sbin/nologin" /etc/passwd
统计文本行数的命令是wc -l
这样就可以把原本要输出到屏幕的信息进行了过滤统计
ji@ji-virtual-machine:~$ grep "/sbin/nologin" /etc/passwd|wc -l
0
用翻页的形式查看/etc目录中的文件列表及属性信息
ls -l /etc/ | more
在root状态下,通过管道符和passwd命令的--stdin参数相结合,可以用一条命令来完成密码重置操作
echo 'your_pwd' | passwd --stdin root
一条命令实现邮件的发送
echo ‘Content’ | mail -s 'Subject' your_pwd
管道命令符不止在命令行中使用一次,它可以使用多次,A|B|C
命令行的通配符
就是正则中的那些
[0-9]匹配数字0-9的任何一个
*代表0个或多个字符
?代表匹配单个字符
[abc] 匹配a,b,c三个字符的任意一个
ji@ji-virtual-machine:~$ ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 12月 1 14:17 /dev/sda
brw-rw---- 1 root disk 8, 1 12月 1 14:17 /dev/sda1
brw-rw---- 1 root disk 8, 2 12月 1 14:17 /dev/sda2
brw-rw---- 1 root disk 8, 5 12月 1 14:17 /dev/sda5
ji@ji-virtual-machine:~$ ls -l /dev/sda?
brw-rw---- 1 root disk 8, 1 12月 1 14:17 /dev/sda1
brw-rw---- 1 root disk 8, 2 12月 1 14:17 /dev/sda2
brw-rw---- 1 root disk 8, 5 12月 1 14:17 /dev/sda5
ji@ji-virtual-machine:~$ ls -l /dev/sda[1-9]
brw-rw---- 1 root disk 8, 1 12月 1 14:17 /dev/sda1
brw-rw---- 1 root disk 8, 2 12月 1 14:17 /dev/sda2
brw-rw---- 1 root disk 8, 5 12月 1 14:17 /dev/sda5
ji@ji-virtual-machine:~$ ls -l /dev/sda[235]
brw-rw---- 1 root disk 8, 2 12月 1 14:17 /dev/sda2
brw-rw---- 1 root disk 8, 5 12月 1 14:17 /dev/sda5
重用的转义字符
反斜杠():使反斜杠后面的一个变量变为单纯的字符串
单引号(''):转义其中所有的变量为单纯的字符串
双引号(""):保留其中的变量属性,不进行转义处理
反引号(``):把其中的命令执行后返回结果
例子:
先定义变量,然后输出,小写price不可
ji@ji-virtual-machine:~$ PRICE=5
ji@ji-virtual-machine:~$ echo "Price is $PRICE"
Price is 5
美元符号和变量提取符号合并后的$$作用使显示当前程序的进程ID号码
ji@ji-virtual-machine:~$ echo "Price is $$PRICE"
Price is 2597PRICE
这时使用\反斜杠来进行转义;那这里美元符号$提取变量的值
ji@ji-virtual-machine:~$ echo "Price is \$PRICE"
Price is $PRICE
ji@ji-virtual-machine:~$ echo "Price is \$$PRICE"
Price is $5
将命令执行并返回结果
ji@ji-virtual-machine:~$ echo `uname -a`
Linux ji-virtual-machine 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
环境变量
变量是操作系统用于保存可变值的数据类型。
环境变量的位置
每个路径值之间用冒号:分隔
ji@ji-virtual-machine:~$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
env命令查看系统中的环境变量,但是一大堆
常见的环境变量
HOME 用户的主目录(即家目录)
SHELL 用户在使用的Shell解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成随意数字
PS1 Bash解释器的提示符
PATH 定义解释器搜搜用户执行命令的路径
EDITOR 用户默认的文本编辑器
Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的合适的工作环境,即一个相同的变量会由用户不同具有不一样的值。
变量的来源
变量是来自与固定的变量名与用户或系统设置的变量值两部分组成,我们也可以自己创建。。但要大写
例如:
创建一个变量为一个文件目录,可以cd该变量进入目录
赋值变量时候不能空格
root@ji-virtual-machine:/home/ji# WORKDIR = /home/workdir
WORKDIR:未找到命令
root@ji-virtual-machine:/home/ji# WORKDIR=/home/workdir
root@ji-virtual-machine:/home/ji# cd $WORKDIR
当然变量不是全局性的,可以使用export 变量名作为全局性的
## 普通用户无该变量
ji@ji-virtual-machine:~$ echo $WORKDIR
## 变成全局变量;但我这ubuntu好像并不行
root@ji-virtual-machine:/home/ji# export WORKDIR