shell中变量

一 变量概念:

(1)变量分为:本地变量、环境变量和位置参数。

*本地变量:仅可以在用户当前Shell生命期的脚本中使用的变量,本地变量随着Shell进程的消亡而无效。

*环境变量:适用于所有由登录进程所产生的子进程。

*位置参数:用于向Shell脚本传递参数,是只读的。

补充:Shell脚本变量是无类型的,bash shell不支持浮点型,只支持整型和字符型。默认情况下,shell脚本变量是字符型的,尽管如此,bash shell不要求在定义一个变量时声明其类型,但shell会根据上下文判断出数值型的变量,并进行变量的算数运算和比较等数值操作。shell变量使用前不必显式的进行声明。


(2)变量赋值与替换

赋值:

*赋值方式:显式定义(var=value)、读取(read var)和命令替换(var=`command`或var=$(command))

注意三点:等号的两边可以有空格;如果值中包含空格,必须使用双引号括起来;变量名只能包含大小写字母、数字和下划线,并且变量不能以数字开头。


除了“=”赋值之外,变量赋值还有如下形式:

${varname: -word}:如果varname存在且非null,则返回其值;否则,返回word。

用途:如果变量未定义,则返回默认值。

${varname:+word}:如果varname存在且不是null,则返回word;否则返回null。

用途:如果变量为定义,则设置为默认值。

${varname: =word}:如果varname存在且不是null,则返回它的值;否则设置它为word,并返回其值。

用途:为了捕捉由于变量未定义所导致的错误。

${varname:?message}:如果varname存在且非null,则返回它的值;否则,显示varname:message,并退出当前的命令或脚本。用途:为测试变量存在。

上述每个运算符内的冒号(:)都是可选的。如果省略冒号,则将每个定义中的“存在且非null”改为“存在”。


模式匹配运算符:

${variable#pattern}:如果模式匹配于变量值的开头处,则删除匹配的最短部分,并返回剩下的部分。

${variable#pattern}:如果模式匹配于变量值的开头处,则删除匹配的最长部分,并返回剩下部分。

${variable%pattern}:如果模式匹配于变量值的结尾处,则删除匹配的最短部分,并返回剩下的部分。

${variable%pattern}:如果模式匹配于变量值的结尾处,则删除匹配的最长部分,并返回剩下的部分。

${#variable}返回$variable值里的字符长度。

unset命令从执行中的shell中删除变量和函数:-v选项删除变量(没有任何选项时,这是默认行为);-f选项删除函数。


(3)环境变量:

*环境变量不仅在Shell编程方面,而且在linux系统管理方面,都起着非常重要的作用。

1. 定义和清除环境变量:

环境变量的替换和赋值依然遵循普通变量的定义和清除规律。

export用于修改或打印环境变量。

readonly:使得变量不可修改。

env:当command_name被env执行时,可针对被command_name继承而来的环境有更细致的控制。

格式:env [-i] [var=value ... ] [command_name [ arguments ...]]


2.linux系统中重要的环境变量:

$+"变量名":如$#:表示进程的参数个数。



*HOSTNAME:主机名字。

*HOSTTYPE:主机类型。

*BASH_VERSION:显示bash的版本。

*BASH_SOURCE、FUNCNAME、LINENO和BASH_LINENO:相当有用的调试变量。

*SHELL:显示当前shell类型。

*SECONDS:返回shell运行的秒数(整)。在shell脚本中,它是脚本运行的时间。

*TMPDIR:用于任何临时文件,如果没被复制,则使用/tmp。


二 位置参数:

(1)位置参数:指的是shell脚本的命令行参数和函数的函数参数。$0为脚本名字,$1表示第一个参数,$2表示第二个参数,从${10}开始,参数号要用花括号括起来。

*shift命令时用来“截去”来自列表的位置参数,由左开始。一旦执行shift,$1的初始值会永远消失,取而代之的是$2的旧值。$2的值,变成$3的旧值,一次类推,$#则会逐次减1。shift也可使用一个可选的参数,也就是要位移的参数的计数,如:shift + n。单纯的shift等于shift1。



<think>好的,用户想知道如何在Shell脚本中正确调用和使用变量。首先,我需要回忆Shell变量的基本知识。根据引用[2],Bash中没有布尔类型,但可以用0和1来模拟。这可能是一个需要注意的点。 首先,变量声明。在Shell中,变量赋值不需要任何符号,直接等号,比如name="value"。但要注意等号两边不能有空格,否则会报错。这点需要强调,因为容易出错。 然后,调用变量的时候需要用$符号或者${}。比如$var或者${var}。后者在变量名后有其他字符时特别有用,可以避免歧义。比如${var}abc,这样就能正确解析变量名。引用[4]中的例子也用了$IP和$PORT,说明直接使用$变量名是常见做法。 接下来是变量的作用域。默认情况下,变量是局部的,只在当前Shell中有效。如果想在子Shell中使用,需要用export导出为环境变量。引用[1]提到,如果被调用的脚本在当前Shell执行,变量可以被主脚本获取,所以需要确认用户是否需要跨脚本使用变量。 另外,用户可能对字符串中的变量替换有疑问。比如如何在双引号和单引号中使用变量。双引号内变量会被替换,而单引号不会。例如echo "Hello $name"会替换变量,而echo 'Hello $name'则不会。引用[4]的例子中使用了单引号和双引号混合的情况,可能需要特别注意引号的嵌套。 还有,特殊变量如$0、$1、$#等,这些是Shell脚本中的位置参数和特殊变量,用户可能需要了解这些的使用方法。比如$1表示第一个参数,$#表示参数个数。 此外,变量的默认值和错误处理。比如${var:-default}表示如果var未设置或为空,使用默认值。这在脚本中处理未定义的变量时很有用,避免脚本出错。 最后,引用[3]提到了Shell的配置文件,如~/.profile,这些文件中的变量是在登录时加载的,可能影响脚本的环境变量。用户如果在脚本中遇到变量未定义的问题,可能需要检查环境变量的来源。 总结下来,用户的问题需要涵盖变量的声明、调用、作用域、引号使用、特殊变量、默认值设置以及环境变量配置等方面。需要结构清晰,逐步解释每个部分,并给出示例代码帮助理解。</think>### 如何在 Shell 脚本中调用和使用变量 #### 1. **变量声明与赋值** 在 Shell 脚本中,变量声明无需指定类型,直接通过等号赋值,且等号两侧不能有空格。例如: ```bash name="Alice" # 字符串变量 count=10 # 整型变量 failed=0 # 模拟布尔变量:0 表示 False,1 表示 True[^2] ``` #### 2. **变量调用** - **直接调用**:使用 `$` 符号引用变量: ```bash echo $name # 输出 Alice ``` - **明确作用域**:若变量名后紧跟其他字符,需用 `${}` 包裹变量名以避免歧义: ```bash echo "Value: ${count}th" # 输出 Value: 10th ``` #### 3. **变量作用域** - **局部变量**:默认仅在当前 Shell 中有效。 - **环境变量**:使用 `export` 声明后可在子进程中访问: ```bash export PATH="/usr/local/bin:$PATH" # 修改环境变量 ``` #### 4. **字符串中的变量调用** - **双引号内解析变量**:双引号允许变量替换,单引号则保持原样: ```bash echo "Hello $name" # 输出 Hello Alice echo 'Hello $name' # 输出 Hello $name ``` - **复杂场景示例**(如引用[4]的代码片段): ```bash IP="192.168.1.1" PORT=8080 php -r '$sock=fsockopen("'$IP'",'$PORT');' # 变量嵌入字符串中 ``` #### 5. **特殊变量** - **位置参数**:`$0`(脚本名)、`$1`(第一个参数)、`$#`(参数个数)等。 - **返回值**:`$?` 表示上一条命令的退出状态。 #### 6. **默认值与错误处理** - **设置默认值**:`${var:-default}` 表示若 `var` 未定义或为空,则使用 `default`: ```bash echo ${name:-"Unknown"} # 若 name 未定义,输出 Unknown ``` #### 7. **配置文件中的变量** - **全局配置**:如 `/etc/profile` 或用户级 `~/.profile`,这些文件在登录时加载[^3]。 - **脚本内生效**:若需跨脚本共享变量,需通过 `source` 命令加载配置文件: ```bash source ~/.profile # 使配置文件中变量在当前 Shell 生效 ``` --- ### 示例代码 ```bash #!/bin/bash # 声明变量 user="Bob" retries=3 # 调用变量 echo "User: $user, Retries left: ${retries}" # 修改布尔变量 failed=1 if [[ $failed -eq 1 ]]; then echo "Error occurred!" >&2 fi # 使用环境变量 export LOG_DIR="/var/log" echo "Logs saved to $LOG_DIR" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值