shell的变量分类


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 , 则证明上一个命令执行不正确.

$$              当前进程的进程号

$!              后台运行的最后一个进程的进程号



除了 $! , 另外两个,都有时候会用到.  

文章作者: 陌上人如玉
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陌上人如玉 !
  目录