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

shell中func内可以用外部的变量吗 shell变量fruit_子进程


4.title=“boss” 给title变量重新赋值,在内存中开辟新空间,指向boss字符串,因为ceo字符串仍然有name变量指向,所以ceo字符串是不会被执行内存回收。

5.echo $name

eco

shell中func内可以用外部的变量吗 shell变量fruit_子进程_02

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, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它 的参数

shell中func内可以用外部的变量吗 shell变量fruit_bash_03


$1, $2, …${11},${12}:对应第1、第2等参数

$0: 脚本名称

$#:参数数量

$*: 传递给脚本的所有参数,全部参数合为一个字符串

$@: 传递给脚本的所有参数,每个参数为独立字符串

例子:
[root@Centos7 bin]#cat demo.sh #!/bin/bash
echo “当前脚本名称是:`basename shell中func内可以用外部的变量吗 shell变量fruit_字符串_04#个参数,分别是:$*”
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.shroot@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

shell中func内可以用外部的变量吗 shell变量fruit_子进程_05