您的位置:首页 > 运维架构 > Shell

Shell基础知识 (2) 之 管道符和作业控制、变量、环境变量配置文件

2018-04-02 00:00 966 查看

8.6 管道符和作业控制

1. 管道符“|”

管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。

cat 1.txt | wc -l
cat 1.txt |grep 'aaa'
find ./ -type f | wc -l

2. 作业控制

2.1 作业和进程的区别

进程和作业的概念也有区别。一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”这个作业就同时启动了三个进程。

2.2 作业控制

作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多shell(包括bash和tcsh)的一个特性,使用户能在多个独立作业间进行切换。

使用 Ctrl + z 停止进程并放到后台

vim 1.txt
[1]+  已停止              vim 1.txt
vim aa.txt
[2]+  已停止              vim aa.txt


使用jobs命令查看后台所有运行的进程

jobs
[1]-  已停止              vim 1.txt
[2]+  已停止              vim aa.txt


使用fg[id号]将任务调到前台

fg 1


再查看进程

jobs
[1]+  已停止              sleep 200
[2]-  运行中              sleep 100 &


使用bg[id号]将任务调到后台,如果进程还在不断刷新运行的话,其实进程没有停止

bg 1
[1]+ vim 1.txt &

[1]+  已停止              vim 1.txt


使用sleep停止

sleep 1000    停止1000秒

jobs
[1]  已停止              vim 1.txt
[2]  已停止              vim aa.txt
[3]-  已停止              sleep 1000

8.7/8.8 shell变量

1. 变量

在shell中有3种变量:系统变量,环境变量和用户自定义变量,其中系统变量在对参数判断和命令返回值判断时会使用,环境变量主要是在程序运行时需要,用户自定义变量在编程过程中使用量最多。==系统内置变量一般都是大写,而自己定义的变量尽量写成小写区分。==

2. 显示系统的内置变量命令 env

env    显示系统的内置变量命(只保留一部分)
HOSTNAME=localhost.localdomain
SHELL=/bin/bash
HISTSIZE=1000
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
...

3. 显示系统内的变量也可以用户自定义变量 set

a=1              自定义变量
1=a              错误的格式
-bash: 1=a: 未找到命令
set |grep 1      查看是1的自定义变量
a=1

4. shell变量的格式

变量名规则:可以是字母、数字下划线,首位不能为数字

变量值有特殊符号时需要用单引号括起来,比如 a='a b c',a='a$b#C'

尽量少用大写字母,因为大写字母大多都是系统的一些变量

有很多特殊的关键字,最好不要用作变量名,比如 if for do done

变量的累加

a=1
b=2
echo $a$b
12
a='a$bc'
echo $a$b
a$bc2
c="a$bc"      **?是$bc没定义,不能识别的原因吗?**
echo $c
a
c="a$b"c
echo $c
a2c
c='a$b'c
echo $c
a$bc
a=a"$b"c    学会这样使用"",是命令更清晰


全局变量

export命令 设置或显示环境变量
在shell中执行程序时,shell会提供一组环境变量,这也使shell变量只能在当前使用。export可新增,修改或删除环境变量,供后续执行的程序使用,已达到使shell达到类似全局变量的目的。export的效力仅及于该此登陆操作,shell退出时失效。

==父shell中定义的NAME环境变量传递到了子shell中,在子shell中定义的NAME环境变量没有被带到父shell中。
如何改变呢?==

永久的:需要修改/etc/profile配置文件,export变量永久生效。

打开这个文件后,会看到里面有很多已经定义好的变量,按照格式把自定义变量写入进去,然后source /etc/profile重启服务就可以生效了


临时的:使用export命令进行全局行声明即可,变量在关闭shell时失效

aming=linux
echo $aming
linux

bash                进入bash
echo $aming
无结果
exit                退出bash
export aming=linux  全局声明
bash
echo $aming
linux


查看当前用户在哪个shell中 pstree命令
pstree命令可以把linux系统中所有进程通过树形结构打印出来

pstree |grep bash
|-login---bash
|-sshd---sshd---bash-+-grep
bash
pstree |grep bash
|-login---bash
|-sshd---sshd---bash---bash-+-grep


取消变量 unset命令

unset + 变量名 把设置的变量取消掉

echo $aming
linux
unset aming
echo $aming

8.9 环境变量配置文件

1. 系统级环境变量配置文件

/etc/profile 用户环境变量,交互,登录才执行
/etc/bashrc 用户不用登录,执行shell就生效

2. 普通用户级境变量配置文件

~/.bashrc          该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。
~/.bash_profile    定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
~/.bash_history    记录命令历史用的。
~/.bash_logout    当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell
相关文章推荐