{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-01-15 18:28:05","updateBy":"admin","updateTime":"2025-06-16 20:16:57","remark":null,"id":43,"articleTitle":"Shell（二）变量","articleUrl":"shell_variables","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/7769fde9ec5445068e41583cb1c71894.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"Shell中变量可以分为全局变量和局部变量：全局变量：所有的程序，包括shell启动的程序，都能访问环境变量，有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。在子shell中更改变量值只会影响子shell，不会影响父shell的值。局部变量：局部变量在脚本或命令中定义，仅在当前shell实例中有效，其他shell启动的程序不能访问局部变量。","articleContent":"Shell中变量可以分为全局变量和局部变量：\n\n全局变量：所有的程序，包括shell启动的程序，都能访问环境变量，有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。在子shell中更改变量值只会影响子shell，不会影响父shell的值。\n\n局部变量：局部变量在脚本或命令中定义，仅在当前shell实例中有效，其他shell启动的程序不能访问局部变量。\n\n变量也可以安装系统预定义变量和用户自定义变量来分类。\n\n## 系统预定义变量\n\n1. 常用系统变量\n\n   ```bash\n   $PWD $HOME $SHELL $USER等\n   ```\n\n2. 案例演示\n\n   1）查看系统变量的值\n\n   ```bash\n   [root@l1 scripts]# echo $PWD\n   /root/scripts\n   \n   [root@l1 scripts]# env #查看当前所有的全局变量\n   XDG_SESSION_ID=89\n   HOSTNAME=l1\n   TERM=xterm\n   SHELL=/bin/bash\n   HISTSIZE=1000\n   SSH_CLIENT=192.168.52.1 50114 22\n   SSH_TTY=/dev/pts/0\n   ...\n   \n   [root@l1 scripts]# printenv USER #不需要加$符号\n   root\n   ```\n\n   2）查看当前定义的所有变量\n\n   ```bash\n   [root@l1 scripts]# set\n   ABRT_DEBUG_LOG=/dev/null\n   BASH=/bin/bash\n   BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath\n   BASH_ALIASES=()\n   BASH_ARGC=()\n   ...\n   ```\n\n## 自定义变量\n\n### 基本语法\n\n1. 定义变量：变量名=变量值，注意，等号前后不能有空格。\n\n2. 撤销变量：unset 变量名。\n\n3. 声明静态变量：readonly 变量，注意，不能unset。\n\n   ```bash\n   name=hello\n   name=\"hello world\"\n   name='hello,world'\n   #自定义的变量一般为局部变量，若想定义为全局变量则需要export命令\n   export name\n   ```\n\n### 定义规则\n\n1. 变量名由数字、字母、下划线组成。\n2. 变量命名不能以数字开头，以字母或下划线开头均可。\n3. 不能使用shell里的关键字。\n4. 在bash中，变量的默认值都是字符串类型，无法直接进行数值运算。\n5. 变量的值如果有空格，需要用单引号或者双引号括起来。\n\n## 特殊变量\n\n1. $n：n为数字，$0表示该脚本名称，$1-9代表第一到第九个参数，十以上的参数需要用大括号包含，如${11}。\n\n   ```bash\n   [root@l1 scripts]# cat parameters.sh \n   #!/bin/bash\n   echo $0\n   echo $1\n   echo $2\n   [root@l1 scripts]# bash parameters.sh te se\n   parameters.sh\n   te\n   se\n   ```\n\n2. $#：获取所有输入的参数的个数，常用于循环，判断参数的个数是否正确及加强脚本的健壮性。\n\n   ```bash\n   [root@l1 scripts]# cat parameters.sh \n   #!/bin/bash\n   echo $0\n   echo $1\n   echo $2\n   echo $#\n   [root@l1 scripts]# bash parameters.sh te se\n   parameters.sh\n   te\n   se\n   2\n   ```\n\n3. $\\*、$@：代表命令行中的所有的参数，$\\*是把所有的参数看做一个整体，而$@则是把每个参数区分对待。\n\n   ```bash\n   [root@l1 scripts]# cat parameters.sh \n   #!/bin/bash\n   echo $*\n   echo $@\n   [root@l1 scripts]# bash parameters.sh abc def\n   abc def\n   abc def\n   ```\n\n4. $?：最后一次执行命令的返回状态，如果这个变量值为0，则表示上一个命令执行正确；反之证明命令执行不正确（返回的值有命令自己决定）。\n\n   ```bash\n   [root@l1 scripts]# bash parameters.sh abc def\n   abc def\n   abc def\n   [root@l1 scripts]# echo $?\n   0\n   ```\n\n   | **状态码** | **描述**             |\n   | ---------- | -------------------- |\n   | 0          | 命令成功结束         |\n   | 1          | 通用未知错误         |\n   | 2          | 误用shell命令        |\n   | 126        | 命令不可执行         |\n   | 127        | 没找到命令           |\n   | 128        | 无效退出参数         |\n   | 128+x      | Linux信号x的严重错误 |\n   | 130        | 命令通过ctrl+c终止   |\n   | 225        | 退出状态码越界       |","categoryId":5,"viewCount":596,"categoryName":"Shell","author":"球接子","authorAvatar":null,"tagIds":[4,10],"tagNames":["Shell","Linux基础"]}}