参考
https://www.runoob.com/linux/linux-shell-variable.html(shell变量)
基本知识
1,Shell是弱类型的语言,
没有向C、java那样的强类型变量,都是弱类型变量。都会统一存储为字符串类型。
2,语法
your_name="runoob.com" 支持3种方式 name=nick name='nick' mame="nick"
3,格式
变量名和等号之间不能有空格
命名只能使用英文字母,数字和下划线
4,变量使用
使用一个定义过的变量,只要在变量名前面加美元符号即可
your_name="qinjx" echo $your_name echo ${your_name}
注意:变量名外面的{}是可选的,加不加都行,加{}是为了帮助解释器识别变量的边界
已定义的变量,可以被重新定义
your_name="tom" echo $your_name your_name="alibaba" #这里不能加$,使用变量的时候才要加$ echo $your_name
5,只读变量
#!/bin/bash myUrl="https://www.google.com" readonly myUrl myUrl="https://www.runoob.com" #会报错
6,删除变量
注意:unset 命令不能删除只读变量,
删除只读变量待整理
unset variable_name
变量作用域
参考:http://c.biancheng.net/view/773.html(C编程网:shell变量作用域)
运行shell时,会同时存在三种变量:
- 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
局部变量
在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果。
#!/bin/bash #定义函数 function func(){ a=99 } #调用函数 func #输出函数内部的变量 echo $a #输出99
要想变量的作用域仅限于函数内部,可以在定义时加上local
命令,此时该变量就成了局部变量
#!/bin/bash #定义函数 function func(){ local a=99 } #调用函数 func #输出函数内部的变量 echo $a #为空
全局变量
所谓全局变量,就是指变量在当前的整个 Shell 进程中都有效。每个 Shell 进程都有自己的作用域,彼此之间互不影响。
在 Shell 中定义的变量,默认就是全局变量。
想要实际演示全局变量在不同 Shell 进程中的互不相关性,可在图形界面下同时打开两个 Shell,或使用两个终端远程连接到服务器
环境变量
1,全局变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。如果使用export
命令将全局变量导出,那么它就在所有的子进程中也有效了,这称为“环境变量”。
2,环境变量被创建时所处的 Shell 进程称为父进程,如果在父进程中再创建一个新的进程来执行 Shell 命令,那么这个新的进程被称作 Shell 子进程。
当 Shell 子进程产生时,它会继承父进程的环境变量为自己所用,所以说环境变量可从父进程传给子进程。不难理解,环境变量还可以传递给孙进程。环境变量只能向下传递而不能向上传递
3,通过exit
命令可以一层一层地退出 Shell。
4,环境变量也是临时的
通过 export 导出的环境变量只对当前 Shell 进程以及所有的子进程有效,如果最顶层的父进程被关闭了,那么环境变量也就随之消失了,其它的进程也就无法使用了,所以说环境变量也是临时的。
如果想让一个变量在所有 Shell 进程中都有效,不管它们之间是否存在父子关系,
只有将变量写入 Shell 配置文件中才能达到这个目的!Shell 进程每次启动时都会执行配置文件中的代码做一些初始化工作,如果将变量放在配置文件中,那么每次启动进程都会定义这个变量。
shell配置文件
参考:https://blog.csdn.net/xiao_dan_/article/details/107935972(CSDN:shell配置文件)
全局配置类
/etc/profile /etc/profile.d/*.sh /etc/bashrc
个人配置类
~/.bash_profile
~/.bashrc
profile 类
profile 类为交互式登录的shell 提供配置,用于定义环境变量或运行命令和脚本
bashrc类
bashrc类为非交互式和交互式登录的shell 提供配置,用于定义命令别名和函数或定义本地变量
配置文件生效
1 重新启动shell 进程 2 source | . 配置文件名
执行顺序
交互式登录
直接通过终端输入账号密码登录
使用 su - UserName 切换的用户
非交互式登录
su UserName
图形界面下打开的终端
执行脚本
bash 退出任务
保存在~/.bash_logout 文件中(用户),在退出登录shell 时运行。用于创建自动备份,清除临时文件
注释
注释符#
#-------------------------------------------- # 这是一个注释 # author:菜鸟教程 # site:www.runoob.com # slogan:学的不仅是技术,更是梦想! #--------------------------------------------
多行注释
:<<EOF 注释内容... 注释内容... 注释内容... EOF #或者 :<<' 注释内容... 注释内容... 注释内容... '