Linux入门之路 -1. 变量的类型、转换、设置与删除

本文介绍了Linux Shell中变量的设置规则,包括如何赋值、删除变量,以及环境变量和自定义变量的区别。讨论了如何通过export将自定义变量转化为环境变量,使用declare定义变量类型,以及如何交互式地设置变量。同时,文章讲解了如何判断变量是否存在以及如何处理变量中的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在Linux Shell中,变量的作用和其他语言一样,可以方便脚本中的引用,灵活性是它的一个重要特点。同时,Linux的变量在引用的时候,可以内置部分表达式,让引用变得更加多元化。

设置变量

Linux Shell中使用‘=’来赋值给变量。

username=MyID

如果赋的值中含有空格键,则需要带上双引号("")或单引号(’’)。

username="Blue Sky"
变量设置规则
  1. 赋值时等号和变量名、值之间禁止使用空格。
  2. 变量名不能用数字开头。
  3. 如果值中间没有$ ` \但有其他特殊字符,则可以使用双引号弱引用,如果值中间含有上述$ ` \字符,则必须使用单引号强引用。
  4. 使用``或者$()可以将命令执行结果赋值给变量。version=$(uname -r)
  5. 变量增添内容可以用直接引用拼接来完成: PATH=$PATH:/app
  6. export命令能使变量变成环境变量

删除变量

Linux Shell中使用unset命令来从内存空间中删除变量。

unset variant_name

变量引用表达式:除了从内存空间中删除变量之外,还可以利用通配符和"#"、"%"在引用变量的时候,只截取部分需要的内容。如果需要删除变量中部分字符串,可以使用下列表达式:

表达式作用
${variant#expression}在variant变量中从头向后寻找符合expression的最短字符串,删掉
${variant##expression}在variant变量中从头向后寻找符合expression的最长字符串,删掉
${variant%expression}在variant变量中从后往前寻找符合expression的最短字符串,删掉
${variant%%expression}在variant变量中从后往前寻找符合expression的最长字符串,删掉
${variant/old_str/new_str}把在variant变量中找到的第一个old_str替换成new_str
${variant//old_str/new_str}把在variant变量中找到的所有old_str替换成new_str

在表达式expression中,可以使用*来表示0到多个任意字符。

环境变量

可以使用env/printenv/export查看当前shell环境下的所有环境变量。

env和printenv直接输出环境变量的键值对,以key=value的形式表现,
export则是输出变量的声明类型,键值对,更全面。

# 使用printenv或env
[cadmin@localhost ~]$ printenv
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.219.1 52858 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=cadmin
MAIL=/var/spool/mail/cadmin
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/cadmin/.local/bin:/home/cadmin/bin
PWD=/home/cadmin
LANG=en_US.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/home/cadmin
LOGNAME=cadmin
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/printenv

# 使用export
declare -x CLASSPATH=".:/usr/lib/java/jdk/lib:/usr/lib/java/jdk/jre/lib"
declare -x HOME="/home/cadmin"
declare -x JAVA_HOME="/usr/lib/java/jdk"
declare -x JRE_HOME="/usr/lib/java/jdk/jre"
declare -x LANG="en_US.UTF-8"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="cadmin"
declare -x MAIL="/var/mail/cadmin"
declare -x OLDPWD
declare -x PATH="/app/miniconda2/bin:/usr/lib/java/jdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/app/scraper"
declare -x PWD="/home/cadmin"
declare -x SCRAPER_CONFIG_FILE="config_ubuntu_prod.py"
declare -x SCRAPER_ENV="prod"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="cadmin"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="6813"

部分默认环境变量:

HOSTNAME: 本主机的主机名
TERM: 终端使用环境类型,xterm代表终端,putty/terminator代表终端模拟器
SHELL: 当前终端使用的shell程序
HISTSIZE: history的条目数量,CentOS默认1000
USER: 使用者名
MAIL: 用户mailbox位置
PATH: 执行文件搜索目录及顺序
PWD: 当前工作目录
LANG: 语系
HOME: 家目录

自定义变量

可以使用set命令查看当前shell环境下所有环境变量和自定义变量。

[cadmin@localhost ~]$ set
IFS=$' \t\n'
LINES=56
MAILCHECK=60
OLDPWD=/home
OSTYPE=linux-gnu
PPID=6764
PS1='[\u@\h \W]\$ '
PS2='> '

部分重要自定义变量:

IFS: 预设分隔符
LINES: 终端最大行数
MAILCHECK: 扫描新邮件的频率,单位为秒
OLDPWD: 上一个工作路径,"cd -"就是取用了这个变量
OSTYPE: 操作系统类型
PPID: 父程序
PS1: 命令提示字符格式,常用 - PS1设置详述
PS2: 在shell中使用\在下一行继续输入命令时,下一行的提示字符

特殊变量

变量含义
$代表当前shell的PID,可以用echo $$查看
?代表上一个命令的返回值,如果错误则为错误代码,如果正确返回0,在管道符中经常使用

自定义变量转化为环境变量 - export

自定义变量和环境变量
首先让我们明确自定义变量环境变量的区别:自定义变量仅能在当前bash中使用,环境变量可以在子程序的bash中使用。这里的子程序bash是指由父程序bash触发的另一个bash,子程序并不会继承父程序的自定义变量,只能继承环境变量。
使用export 变量名称即可把自定义变量转化成环境变量。
使用export会显示所有可用环境变量,并且都是以declare命令的形式表示变量的类型,变量名和值。

环境变量转化为自定义变量/宣告变量类型 - declare

默认情况下,Linux会将变量定义为字符串类型,如果变量需要为数值类型等,则需要使用declare来声明。

可选参数作用
-a将变量定义为array类型
-i将变量定义为int类型。特别的,bash环境中的数值运算只能到整数,比如1/4=0
-x将变量变为环境变量
-r将变量定义为readonly类型
+x将变量从环境变量变为自定义变量

语系变量

语系变量会影响shell中的显示方式,如果语系使用不同,可能会造成输出乱码。

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"

交互设置变量 - read

使用read命令可以等待用户输入变量的值,然后赋给变量名。

可选参数作用
-p输入提示符
[cadmin@localhost ~]$ read uname_test
aaa  # 输入要赋的值
[cadmin@localhost ~]$ echo $uname_test
aaa
[cadmin@localhost ~]$ read -p "Please input:"
Please input:aaa

判断变量是否存在(变量引用)

可以使用${variant-default}来判断该变量是否存在。

  1. variant不存在时,此表达式返回default值;
  2. variant为空或有值时,此表达式返回variant值。
  3. 如果此表达式改为${variant:-default},则【variant为空值】也被视为【variant不存在】,即表达式的返回值也为default值。
  4. 如果此表达式改为${variant?error_expr},则当variant不存在时,error_expr会进入stderr。同样,如果variant改为variant:,则variant为空时error_expr也会进入stderr。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值