shell里的变量分为用户自定义变量, 环境变量, 位置参数变量, 预定义变量.
变量的分类
用户自定义变量: 这种变量是最常见的变量, 由用户自由定义变量名和变量的值.
环境变量: 这种变量中主要保存的是和系统操作环境相关的数据.
位置参数变量: 这种变量主要是用来向脚本当中传递参数或数据的, 变量名不能自定义, 变量作用是固定的.
预定义变量: 是Bash 中已经定义好的变量, 变量名不能自定义, 变量作用也是固定的.
简记
变量分类:
用户自定义变量: 名称:自定义 作用:自定义 内容:自定义
环境变量:
用户自定义环境变量: 名称:自定义 作用:自定义 内容:自定义
系统自带环境 变量: 名称:确定 作用:确定 内容:自定义
位置参数变量: 名称:确定 作用:确定 内容:自定义
预定义变量: 名称:确定 作用:确定 内容:自定义
用户自定义变量
变量定义
name="wait for you "
变量名不能以数字开头; 等号两边不能有空格; 变量的值如果有空格,必须用引号包围
变量调用
echo $name
变量调用, $变量名
变量查看
set [选项]
选项:
-u: 如果设定此选项, 调用未声明变量时会报错(默认无任何提示)
-x: 如果设定此选项, 在命令执行之前, 会把命令先输出一次
执行了 set -u 之后, 调用不存在的变量,会有报错提示, 调用 值为空的变量依然是输出空, 如果不执行set -u 则是两个情况下,终端看到的结果都是一致的.
但是只是执行了 set -u 只是临时生效的, 要想永久生效还是要设置环境变量的配置文件,后面会讲到的.
如果set 后面不加参数,就是查看所有的变量, 包括环境变量的,用户定义变量等,但是环境变量查看的不全.
用 env 命令可以查看最全的环境变量,但是看不到用户自定义变量.
环境变量
用户自定义环境变量和系统自定义环境变量
用户自定义的环境变量 和 系统自带环境变量有点类似,但是有区别, 用户自定义变量只能在当前shell 起效, 在 子shell中无效, 但是系统自带环境变量却可以在当前shell 和子shell中都起效. 不过 这个细微的 区别,一般都用不上,了解即可.
用户自定义环境变量
设置环境变量
export age="18"
设置环境变量 export AGE="18" 也可以先 给变量赋值, 再 export 变量 让其成为环境变量
环境变量建议用大写的变量名,, 以便于区分.
修改 环境变量
只要重新赋值即可
查看环境变量
通过set 或者 env 可以查看环境变量
系统自带环境变量之PATH
查询 PATH 环境变量的值
echo $PATH
以我的linux 举例, 终端显示的结果如下
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PATH 变量的值是用 ";" 分割的路径, 这些路径就是系统查找命令的路径.
也就是说当我们下终端输入了一个程序名, 如果没有写路径, 系统就会到PATH 变量定义的路径中去查找, 是否有可以执行的程序。 如果找到就会执行, 否则就会报"命令没有发现"的错误
如果我们想把自己写的shell 文件也直接在终端命令行中执行, 不再使用绝对路径,咋办呢?
方法一, 直接将 shell 脚本文件拷贝到PATH 变量定义的路径中, 如下面, 将shell 脚本添加到 /bin/ 下
方法二, 修改PATH 变量的值,将shell 脚本文件所在的目录叠加到 PATH变量中 , 通过变量的叠加即可(但是只能临时生效)
PATH="$PATH":/root/sh
如果要持续生效,就要去配置文件中修改,因为linux 中一切皆文件.
位置参数变量
位置参数的定义
位置参数变量 作用
$n n为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数, 十以上的参数需要用大括号包含, 如 ${10}
$* 这个变量代表命令行中所有的参数, $* 把所有的参数看成一个整体
$@ 这个变量代表命令行中所有的参数, 不过 $@ 会把每个参数区别对待,可以用for 循环遍历每一个参数
@# 这个变量代表命令行中所有参数的个数
预定义变量
预定义变量 作用
$? 最后一次执行的命令的返回状态. 如果这个变量的值为0 , 证明上一个命令正确执行; 如果这个变量值是非0 , 则证明上一个命令执行不正确.
$$ 当前进程的进程号
$! 后台运行的最后一个进程的进程号
除了 $! , 另外两个,都有时候会用到.