Shell变量、管道府、环境变量配置

1、管道符

管道符

它用于将前一个指令的输出作为后一个指令的输入,例如:

[root@localhost do]# cat 1.txt |wc -l #查看前面的文件有几行
2

作业控制

cat 1.txt |wc -l;cat 1.txt |grep 'aaa'         #把前面输入的内容交给后面的命令,grep过滤掉所有aaa的内容。

ctrl z             暂停一个任务

jobs             查看后台停止的任务

bg[id]                把任务调到后台

fg[id]                   把任务调到前台

例如:使用vi命令编辑1.txt文件,随便输入一些内容,按ESC键,使用CTRL+z组合暂停任务,如下:

[root@localhost do]# vi 1.txt

[1]+ 已停止 vi 1.txt

  • 此时vi 1.txt已经停止,可以使用fg命令恢复它,此时右进入刚才vi窗口。

    [root@localhost do]# fg

  • jobs可以看见被暂停或者在后台运行的任务

    [root@localhost do]# jobs #先看下当下有没有被暂停或者在后台运行的
    [root@localhost do]# vi 1.txt 
    [1]+ 已停止 vi 1.txt
    [root@localhost do]# jobs 
    ?[1]+ 已停止 vi 1.txt

  • 如果想把暂停的任务放到后台重新运行,就使用bg

在后台运行的任务,得fg调至到前台后才可以终止解除CTRL+c

命令后面加&直接丢到后台

常见问题:1.vim一个文件然后ctrl+z没有反应。

先按ESC,再按ctrl z

2.前台运行和后台运行有什么本质的区别?

前台,就是在你的终端或者其他人的终端里运行的,你可以ctrl c直接取消运行的这种进程。像系统的各种各样的服务,都是在后台跑的。

实例:

显示系统的状态,使用命令vmstat。

暂缓执行2秒。后面加一个&,如sleep 2 &:丢到后台去。

查看进程


2、 shell变量

概念:环境变量PATH,它是shell预设的一种变量,通常预设的变量都是大写的。
变量就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。
系统预设环境变量:
PATH、HOME、LOGNAME

PATH,HOME,PWD,LOGNAME

env命令                       #获取系统的变量(都是大写的英文字母)

set命令多了很多变量,而且包括用户自定义的变量

自定义变量a=1

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

变量值有特殊号时需要用单引号括起来

变量的累加

全局变量export b=2

unset变量

实例:

   查看现在系统预设变量的值 echo $PATH,设置 自定义变量A的值。

env 可以列出系统预设的全部系统变量

[root@localhost do]# env

set 不仅可以显示系统预设的变量,也可以显示用户自定义的变量

[root@localhost do]# set

自定义变量

规则:变量名规则可以是:字母 数字 下划线,首位不能为数字
变量值拥有特殊符号时需要用单引号括起来

[root@localhost /]# a=111 #自定义变量
[root@localhost /]# echo $a #查看变量0
111
[root@localhost /]# set |grep 111 #set 查看所有变量里的 111变量
_=111
a=111

查找定义的变量

单引号可以识别特殊符号双引号可以识别变量的前缀。

特殊符号变量应用,假如带空格,单引号

[root@localhost /]# a='a b c'
[root@localhost /]# echo $a
a b cbr/>再或者加上特殊符号!(@*&#(*@!&#什么的。
[root@localhost /]# echo $a
a $bc

表示式复杂的时候,用双引号引起来,变量的累加

假设a=1 b=2 c=a"$b"c
我想echo出来的结果是 a2c, 那么就用双引号给变量推出来。
[root@localhost /]# a=1
[root@localhost /]# b=2
[root@localhost /]# c=a"$b"c
[root@localhost /]# echo $c
a2c

全局变量 export a=zhang1,向下一层生效,上一层不生效

取消变量,unset 后面跟名字,如取消a=zhang1

[root@localhost /]# unset a
[root@localhost /]# echo $a
#没有内容

环境变量配置文件

/etc/profile 用户环境变量,交互、登陆才执行(不要修改)

概念:/etc/profile这个文件预设了几个重要的变量,例如PATH、USER、LOGNAME、等变量。

/etc/bashrc 用户不用登陆,执行shell就生效。(不要修改)

这个文件主要预设umask以及PS1; 这个PS1就是我们在输入命令时前面的那串字符; 例如Linux系统的就是[root@localhost ~]# 我们可以看一下PS1的值,如下: [root@localhost /]# echo $PS1 [\u@\h \W]\$ 其中,\u指用户,\h指主机名,\W指当前目录,\$指字符# (如果是普通用户则为¥)

~/.bashrc

概念:该文件包含专属于自己的shell的bash信息; 当登陆或每次新打开新的shell时,该文件会被读取; 例如,你可以将用户自定义的别名或者自定义变量写到这个文件中。

~/.bash_profile

概念:该文件定义了用户的个人化路径于环境变量的文件名称; 每个用户都可使用该文件输入专属自己的shell信息,当用户登陆时,该文件仅执行一次。

~/.bash_history

概念:该文件用户记录命令历史。

~/.bash_logout

概念:当退出shell时,会执行该文件,可以将一些清理的工作放到这个文件中。

更改用户自定义颜色:

[root@localhost /]# PS1='[\033[01;32m]\u@\h[\033[00m]:[\033[01;36m]\w[\033[00m]\$ '

设置全局变量

取消别名:unset

常见问题:

1.png 

bc并未赋值,相当于是空。


3、 环境变量配置文件

/etc/profile用户环境变量,交互,登录才执行

/etc/bashrc用户不用登录,执行shell就生效

~/.bashrc                     #

~/.bash_history          #

~/.bash_logout                  #

. .bash_profile           #加载配置文件的配置

PS1='\[\033[01;32m\]\u\@\h[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$                            #在/etc/.bashrc

实例:

1、当你直接在机器login界面登陆、使用ssh登陆或者su切换用户登陆时,.bash_profile 会被调用来初始化shell环境?

Note:.bash_profile文件默认调用.bashrc文件

答看看cat  .bash_profile的内容:

发现 在脚本里先执行了 .bash_profile

2.设置一个值

在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)

1. fork  ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令。子级的环境变量不会影响到父级。 

fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.

运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。

sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell

2. exec (exec /directory/script.sh):执行子级的命令后,不再执行父级命令。

exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本.  被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

3. source (source /directory/script.sh):执行子级命令后继续执行父级命令,同时子级设置的环境变量会影响到父级的环境变量。

与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.

可以通过下面这两个脚本来体会三种调用方式的不同:

1.sh 

#!/bin/bash

A=B 

echo "PID for 1.sh before exec/source/fork:$$"

export A

echo "1.sh: \$A is $A"

case $1 in

        exec)

                echo "using exec…"

                exec ./2.sh ;;

        source)

                echo "using source…"

                . ./2.sh ;;

        *)

                echo "using fork by default…"

                ./2.sh ;;

esac

echo "PID for 1.sh after exec/source/fork:$$"

echo "1.sh: \$A is $A"

2.sh 

#!/bin/bash

echo "PID for 2.sh: $$"

echo "2.sh get \$A=$A from 1.sh"

A=C

export A

echo "2.sh: \$A is $A"

执行情况: 

$ ./1.sh     

PID for 1.sh before exec/source/fork:5845364

1.sh: $A is B

using fork by default…

PID for 2.sh: 5242940

2.sh get $A=B from 1.sh

2.sh: $A is C

PID for 1.sh after exec/source/fork:5845364

1.sh: $A is B

$ ./1.sh exec

PID for 1.sh before exec/source/fork:5562668

1.sh: $A is B

using exec…

PID for 2.sh: 5562668

2.sh get $A=B from 1.sh

2.sh: $A is C

$ ./1.sh source 

PID for 1.sh before exec/source/fork:5156894

1.sh: $A is B

using source…

PID for 2.sh: 5156894

2.sh get $A=B from 1.sh

2.sh: $A is C

PID for 1.sh after exec/source/fork:5156894

1.sh: $A is C

$

猜你喜欢

转载自my.oschina.net/u/3803405/blog/1793051
今日推荐