第2节. shell编程特殊位置变量

初识变量生效范围

1、tty再开一个终端就没了

2、退出后就没了

3、再次运行/bin/bash后就没了👇

[23:15:39 root@host1 ~]#NAME=ming
[23:15:43 root@host1 ~]#echo $NAME
ming
[23:16:21 root@host1 ~]#pstree |grep -A 2 bash
        |-sshd---sshd---bash-+-grep
        |                    `-pstree
        |-systemd-journal
[23:16:34 root@host1 ~]#pstree -p |grep -A 2 bash
           |-sshd(1191)---sshd(2132)---bash(2140)-+-grep(2207)
           |                                      `-pstree(2206)
           |-systemd-journal(502)
[23:17:10 root@host1 ~]#/bin/bash
[23:17:17 root@host1 ~]#pstree -p |grep -A 2 bash
           |-sshd(1191)---sshd(2132)---bash(2140)---bash(2208)-+-grep(2239)
           |                                                   `-pstree(2238)
           |-systemd-journal(502)
[23:17:29 root@host1 ~]#echo $NAME

[23:17:36 root@host1 ~]#echo $BASHPID
2208
[23:17:49 root@host1 ~]#exit
exit
[23:17:52 root@host1 ~]#echo $BASHPID
2140
[23:17:56 root@host1 ~]#echo $NAME
ming
[23:17:58 root@host1 ~]#

父进程的NAME变量并没有传给子进程。

每个账号都有个shell类型,比如👇,表示root账号一登入就会自动去运行/bin/bash

[23:23:25 root@host1 ~]#getent passwd root
root:x:0:0:root:/root:/bin/bash

父进程的NAME变量并没有传给子进程,如果需要传进去,就要使用环境变量。

其上👆这句话也不完全对,换个方式就能将局部变量传进去了,比如小括号

image-20220929194012681

环境变量

img

img

img

查看上级父进程编号

查看环境变量

img

举例EDITOR=vim

默认编辑器是

vipw是调用的EDITOR编辑器这个变量,而EDITOR默认复制应该就是vi,如下:

image-20220204153802553

现在将EDITOR改成vim,再看,发现还是黑底白字,只有将EDITOR提升为环境变量,才会出彩,也就是vipw调用的是环境变量EDITOR里的值,普通变量没有关系。

image-20220204154115391

unset name普通变量和环境变量都适用

环境变量可以由父进程传给子进程但是不能从子进程传给父进程,也就是说子进程里修改的环境变量只在子进程里有效,退出子进程后,在父进程中还是原来的值;但是子进程再次赋值可以影响身后的子进程

img

[23:49:22 root@host1 ~]#export name=ming
[23:49:42 root@host1 ~]#echo $name
ming
[23:49:46 root@host1 ~]#bash
[23:49:51 root@host1 ~]#echo $name
ming
[23:49:55 root@host1 ~]#name=yi
[23:50:11 root@host1 ~]#echo $name
yi
[23:50:13 root@host1 ~]#export name=yi   👈多余动作,name早就是环境变量了,所以无需再次申明
[23:50:24 root@host1 ~]#echo $name
yi
[23:50:28 root@host1 ~]#exit
exit
[23:50:29 root@host1 ~]#echo $name
ming
[23:50:31 root@host1 ~]#

image-20220204155221438

shell的嵌套深度

img

上一次执行的命令

img

image-20220204160922084

常量就是只读变量

img

img

可能父进程和子进程配合使用是有用的,

img

img

小括号就是开启子shell,一运行完,子shell就退出了

注意只针对内部命令和变量赋值

img

img

证明小括号就是开启了子shell

img

上图👆此时可以再开一个窗口pstree -p看到确实8542就是7703的子进程

image-20220204162108153

大括号和小括号是不同的

img

上图说明,小括号开启子进程,大括号不开启子进程。

img

img

位置变量

img

img

img

这样的话,就可以将输入的固定位置的参数变量传到脚本里面。

img

img

img

img

对比下$*和$@

img

img

img

img

img

img

img

引号引起来才是一个整体,不能去掉。

img

练习,rm=rm.sh,rm.sh里写mv f1.txt /tmp/当前日期精确到秒,开局设置里可以用

用mv替代rm

img

img

img

img

如果要使用原来的rm,则\rm就行了,不过要自带-i了

img

其他注意事项

img

img

Copyright 🌹 © oneyearice@126.com 2022 all right reserved,powered by Gitbook文档更新时间: 2024-07-28 14:48:02

results matching ""

    No results matching ""