阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Shell脚本系列-shell入门第二讲

72次阅读
没有评论

共计 1955 个字符,预计需要花费 5 分钟才能阅读完成。

1、普通环境变量与临时环境变量

1.1、定义普通环境变量

[root@localhost ~]# VAR=value

注意:左边的 VAR 是我们定义的一个变量名,右边则是一个值,我们通过把值赋值给一个变量,从而达到引用一个变量就相当于引用值的目的。一般上而言定义一个变量名也有命令法则,如下所示:

(1)、不能使用程序中的保留字,如 if、while、for、print 等字符串作为变量名

(2)、只能使用数字、字母、下划线,可以组合使用,但不能以数字开头

(3)、最好做到见名知意(建议这样子来做)

1.2、定义临时环境变量

[root@localhost ~]# export VAR=value

用法是一样的,只是我们这里加上了一个 export,普通环境变量和临时环境变量的区别就是:普通环境变量只在当前的 shell 终端有效,而临时环境变量则是在当前 shell 终端以及当前 shell 的子终端中有效。

1.3、变量引用

直接使用 $VAR 即可,比如下面这样,就可以把 $VAR 的值给打印出来。

[root@localhost ~]# echo $VAR

2、操作一下看看效果

[root@localhost ~]# tty

/dev/pts/0

[root@localhost ~]# ps axjf | grep pts/0

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND

1016 36123 36123 36123 ?           -1 Ss       0   0:01  \_ sshd: root@pts/0

36123 36125 36125 36125 pts/0    33060 Ss       0   0:00  |   \_ -bash

36125 33060 33060 36125 pts/0    33060 R+       0   0:00  |       \_ ps axjf

36125 33061 33060 36125 pts/0    33060 S+       0   0:00  |       \_ grep –color=auto pts/0

可以看到当前使用的终端是伪终端类型,序号为 pts/0。我们通过这个命令中,主要关注 PPID、PID、COMMAND 这三列,其中 PPID 表示父进程,PID 表示子进程,COMMAND 表示当前父进程执行的命令,

可以看出来当 SSH 连接 Shell 时,当前终端 PPID(-bash)是 sshd 守护程序的 PID(pts/0),因此在当前终端下的所有进程的 PPID 都是 -bash 的 PID(大家看到倒数第二行中 PID 号为 36125,他是 bash 进程的 PID 号,而我们执行的 ps 命令和 grep 命令则是的 PPID 都是 36125,这说明 ps 和 grep 都是 -bash 的子进程),比如执行命令、运行脚本。

所以当在 -bash 下设置的变量,只在 -bash 进程下有效,而 -bash 下的子进程 bash 是无效的,如果要在子进程中生效需要你使用 export,这样才有效

例如:

[root@localhost ~]# NUM=666

[root@localhost ~]# echo $NUM

666

[root@localhost ~]# bash         ## 此时我又进入了子 shell 中

[root@localhost ~]# echo $NUM    ## 发现是空值

然后我使用 export 定义一下

[root@localhost ~]# unset NUM ## 先接触一下环境变量,重新定义

[root@localhost ~]# export NUM=888

[root@localhost ~]# echo $NUM

888

[root@localhost ~]# bash       ## 此时我又进入了子 shell 中

[root@localhost ~]# echo $NUM ## 子 shell 中也是可以使用这个值的

888

当然,上面的 export 例子也仅仅是对当前的终端以及子 shell 终端有效,如果你重新开一个新的终端,就不会生效了。比如之前我们使用的是 pts/0,现在重新开的窗口,其终端是 pts/1,那么 pts/ 1 这个终端中就没办法使用在 pts/ 0 中定义的变量了。

[root@localhost ~]# tty

/dev/pts/2

[root@localhost ~]# echo $NUM

此外,shell 脚本也是相当于起了一个子 shell 终端,因此我们在命令行中定义的 NUM 变量,即便在 shell 脚本中也是有效的,比如我们还是在 pts/ 0 这个终端上举例子:

[root@localhost ~]# tty

/dev/pts/0

[root@localhost ~]# cat bash.sh

#!/bin/bash

echo $NUM

[root@localhost ~]# bash bash.sh

666

声明:文章来源于网络,如有侵权请联系删除!

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-12-03发表,共计1955字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中