2.shell脚本之变量

1.变量命名法则


1、不能使程序中的保留字:例如if, for
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法
5、=前后不要带空格
6、字符串建议加" " :如name=“chenjuxni”

变量引用:
语法:$变量名 或者 ${变量名},引用字符串变量建议加"$name"
unset 变量名:删除变量,释放内存空间,脚本执行完之后写上删除变量的命令,避免变量占用内存。

命令引用:
方法一:`hostname`
方法二:$(hostname)

例子:
1.#title=“ceo” 定义变量title,在内存中有对应空间,空间包含着ceo字符串
2.#name=$title 把title变量赋值给name变量,意味着name变量也指向ceo字符串
3.#echo $name 所以name变量输出的是ceo
ceo
在这里插入图片描述
4.title=“boss” 给title变量重新赋值,在内存中开辟新空间,指向boss字符串,因为ceo字符串仍然有name变量指向,所以ceo字符串是不会被执行内存回收。
5.echo $name
eco

在这里插入图片描述

2.变量分类


根据变量的生效范围等标准划分下面变量类型:
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

例子:
[root@Centos7 bin]#echo KaTeX parse error: Can't use function '$' in math mode at position 36: …想查看父进程PID,echo $̲PPID 4297 [root… 查看当前进程,PID=7738
7738
[root@Centos7 bin]#pstree -p | grep sshd pstree -p可以查看进程关系,管道和grep筛选bash进程
|-sshd(1010)-±sshd(4291)—bash(4297)—bash(7738)-±grep(7772)
| |-sshd(4964)—bash(4972)
| `-sshd(7616)—bash(7623)
[root@Centos7 bin]#echo $name 在子进程使用name变量,显示是空。

以上例子说明了局部变量生效范围仅限当前进程,子进程无效,同理父进程也是无效。

环境(全局)变量:生效范围为当前shell进程及其子进程 ,父进程无效。
应用:当A脚本定义一个全局变量的话,B脚本就可以使用A脚本定义的全局变量
定义全局变量格式:#export 变量名=""
查看系统的环境变量:#declare -x ,#env

常见的系统变量:
HOME 用户的主目录(即家目录)
SHELL 用户在使用的Shell解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成一个随机数字
生成31-37的随机数,思路:最大最小同时减去最小值。31-31~37-31=0~6,6+1=7,所以RANDOM%7
#echo $[RANDOM%7+31]
PS1 Bash解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器

例子:
[root@Centos7 bin]#pstree -p | grep sshd
|-sshd(1010)-±sshd(4291)—bash(4297)-±grep(8003)
| |-sshd(4964)—bash(4972)
| `-sshd(7616)—bash(7623)
[root@Centos7 bin]#echo KaTeX parse error: Expected 'EOF', got '#' at position 44: …ot@Centos7 bin]#̲export username… 查看子进程
8014
[root@Centos7 bin]#pstree -p | grep sshd 查看进程关系,和PID=4297是父子关系进程
|-sshd(1010)-±sshd(4291)—bash(4297)—bash(8014)-±grep(8043)
| |-sshd(4964)—bash(4972)
| \ `-sshd(7616)—bash(7623)
[root@Centos7 bin]#echo $username 在子进程可以使用全局变量username
father

脚本执行方式
之前有说过执行一个脚本几种方法:
1.bash demo.sh
2.source demo.sh == .demo.sh
3./data/demo.sh 全路径执行,也可以当前路径执行./demo.sh
但是这几种方式,有什么区别呢?

编写一个脚本:
#!/bin/bash
name=chen
echo “当前进程是:$$”
echo “父进程是:$PPID”

1.bash 方式执行
[root@Centos7 bin]#echo $$ 查看当前进程
8014
[root@Centos7 bin]#bash demo.sh
当前进程是:8420
父进程是:8014
#说明bash执行,是开启子进程执行脚本的。

2.全路径或者当前路径执行
[root@Centos7 bin]#./demo.sh
当前进程是:8443
父进程是:8014
由上2个例子得出,bash和全路径执行脚本,都是开辟子进程运行脚本的。

3.source 方式,也等价于.demo.sh
[root@Centos7 bin]#source demo.sh
当前进程是:8014
父进程是:4297
[root@Centos7 bin]#echo $name
chen
source方式执行,不开辟子进程运行脚本,而是在当前进程执行,即使脚本运行完,我们也可以调用脚本中的变量name。但是这种方式运行脚本,导致脚本中的变量没有释放内存,造成内存占用,仅适用设置配置文件的时候。

所以我们平时执行脚本,推荐使用bash和路径方式执行脚本,配置环境文件的时候使用source方式。

面试题:
():相当与开启子进程执行,变量赋值受影响,子进程结束就没有了。
[root@Centos7 bin]#name=parent;(echo “1:$name”;name=son;echo “2:$name”);echo “3:$name”
1:parent
2:son
3:parent

{}:不开启子进程,在当前进程执行,注意:{ 要带空格 }
[root@Centos7 bin]#name=parent;{ echo “1:$name”;name=son;echo “2:$name”; };echo “3:$name”
1:parent
2:son
3:son

3.特殊变量


位置变量:$1, $2, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它 的参数
在这里插入图片描述
$1, $2, …${11},${12}:对应第1、第2等参数
$0: 脚本名称
$#:参数数量
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串

例子:
[root@Centos7 bin]#cat demo.sh
#!/bin/bash
echo “当前脚本名称是:`basename 0 ‘ " " e c h o " 总 共 有 0`"" echo "总共有 0""echo"#个参数,分别是:$*”
echo “第1个参数为$1,第5个为$5。”

[root@Centos7 bin]#bash demo.sh
当前脚本名称是:demo.sh
总共有0个参数,分别是:
第1个参数为,第5个为。

例子2:文件作为参数
1.脚本内容
[root@Centos7 bin]#cat demo.sh
#!/bin/bash
scp $* root@172.16.34.103:/data/

2.执行脚本,apache34.sh createfile34.sh作为参数
[root@Centos7 bin]#bash demo.sh apache34.sh createfile34.sh
root@172.16.34.103’s password: 输入密码:IP172.16.34.103root的密码
apache34.sh 100% 265 289.9KB/s 00:00
createfile34.sh 100% 143 146.5KB/s 00:00

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值