Shell变量
Shell变量
shell变量从创建者角度可以分为系统变量和自定义变量,从作用范围角度可以分为全局变量和局部变量
系统变量
常用的系统变量,eg:$HOME、$PWD、$SHELL、$USER......
输出某个系统变量的值
[root@zookeeper1 java]# echo $HOME
/root
[root@zookeeper1 java]# printenv HOME
/root
查看所有系统变量
[root@zookeeper1 java]# env
XDG_SESSION_ID=1
HOSTNAME=zookeeper1
SELINUX_ROLE_REQUESTED=
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.84.1 10955 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=user01
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user01/.local/bin:/home/user01/bin
MAIL=/var/spool/mail/user01
PWD=/home/user01/java
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
HOME=/root
SHLVL=2
LOGNAME=user01
SSH_CONNECTION=192.168.84.1 10955 192.168.84.136 22
XDG_DATA_DIRS=/home/user01/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:10.0
XDG_RUNTIME_DIR=/run/user/1000
XAUTHORITY=/root/.xauthPaIw5d
_=/usr/bin/env
OLDPWD=/home/user01/java/shell
查看所有变量
set
自定义变量
语法:变量名=变量值(=号前后不能有空格)
[root@zookeeper1 shell]# i=1
[root@zookeeper1 shell]# echo $i
1
# 变量的值如果有空格,需要使用双引号或单引号括起来
[root@zookeeper1 shell]# s="hello world"
[root@zookeeper1 shell]# echo $s
hello world
在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
[root@zookeeper1 shell]# i=1+2
[root@zookeeper1 shell]# echo $i
1+2
撤销变量
语法:unset 变量名
[root@zookeeper1 shell]# unset i
[root@zookeeper1 shell]# echo $i
只读变量
语法:readonly 变量名=变量值
只读变量不能重新赋值和撤销,程序执行完exit退出即结束
[root@zookeeper1 shell]# readonly i
[root@zookeeper1 shell]# echo $i
1+2
[root@zookeeper1 shell]# i=1
bash: i: 只读变量
[root@zookeeper1 shell]# unset i
bash: unset: i: 无法反设定: 只读 variable
注意:以上自定义变量都是局部变量,只在当前shell进程中生效
定义变量i=1,通过bash命令新建子shell进程,然后再输出i则为空,因为子shell进程中是没有定义i变量的,通过exit命令退出子shell进程再输出i则不为空;新建shell脚本,在脚本中输出i,然后执行脚本,输出也是空,因为i是局部变量
把变量提升为全局环境变量,可供其他 Shell 程序使用
export i
特殊变量
$n
$n 功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以 上的参数,十以上的参数需要用大括号包含,如${10}
新建param.sh脚本,内容如下:
[root@zookeeper1 shell]# cat param.sh
#!/bin/bash
echo '---$n'
echo "scriptName:$0"
echo "param1:$1"
echo "param2:$2"
单引号里面的内容会原封不动的输出,但是双引号里面的内容如果包含参数会输出参数值
执行脚本时传入参数
[root@zookeeper1 shell]# ./param.sh a b
---$n
scriptName:./param.sh
param1:a
param2:b
$#
$# 功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及 加强脚本的健壮性
增加param.sh脚本内容:
[root@zookeeper1 shell]# cat param.sh
#!/bin/bash
echo '---$n'
echo "scriptName:$0"
echo "param1:$1"
echo "param2:$2"
echo '---$#'
echo "param number:$#"
执行脚本时传入参数
[root@zookeeper1 shell]# ./param.sh a b
---$n
scriptName:./param.sh
param1:a
param2:b
---$#
param number:2
$*、$@
$* 功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$*
和$@
都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n 的形式输出所有参数;当它们被双引号“”包含时,$*
会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输 出所有参数;$@
会将各个参数分开,以“$1” “$2”…“$n”的形式输出所有参数
增加脚本内容:
[root@zookeeper1 shell]# cat param.sh
#!/bin/bash
echo '---$n'
echo "scriptName:$0"
echo "param1:$1"
echo "param2:$2"
echo '---$#'
echo "param number:$#"
echo '---$*'
echo "param:$*"
echo '---$@'
echo "param:$@"
执行脚本时传入参数
[root@zookeeper1 shell]# ./param.sh a b
---$n
scriptName:./param.sh
param1:a
param2:b
---$#
param number:2
---$*
param:a b
---$@
param:a b
$?
$? 功能描述:最后一次执行的命令的返回状态,如果这个变量的值为 0,证明上一 个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明 上一个命令执行不正确了
增加脚本内容:
[root@zookeeper1 shell]# cat param.sh
#!/bin/bash
echo '---$n'
echo "scriptName:$0"
echo "param1:$1"
echo "param2:$2"
echo '---$#'
echo "param number:$#"
echo '---$*'
echo "param:$*"
echo '---$@'
echo "param:$@"
echo '---$?'
echo "最后一次执行命令状态:$?"
执行脚本时传入参数
[root@zookeeper1 shell]# ./param.sh a b
---$n
scriptName:./param.sh
param1:a
param2:b
---$#
param number:2
---$*
param:a b
---$@
param:a b
---$?
最后一次执行命令状态:0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具