当前位置:首页 > 科技  > 软件

基础不牢地动山摇——shell中的变量和参数如何定义和使用?有什么注意点

来源: 责编: 时间:2024-01-10 09:35:51 322观看
导读Shell中的变量和参数如何定义和使用?变量是编程和脚本语言表示数据的方式。变量其实不仅仅是一个标签,一个分配给计算机内存中保存项目的位置或位置集的数据的标签,变量没有其他意义。变量出现在算术运算和和数量操作中,

Shell中的变量和参数如何定义和使用?9uM28资讯网——每日最新资讯28at.com

变量是编程和脚本语言表示数据的方式。变量其实不仅仅是一个标签,一个分配给计算机内存中保存项目的位置或位置集的数据的标签,变量没有其他意义。9uM28资讯网——每日最新资讯28at.com

变量出现在算术运算和和数量操作中,以及字符串解析时。9uM28资讯网——每日最新资讯28at.com

9uM28资讯网——每日最新资讯28at.com

Shell中的变量是什么?

变量的名称是对它所持有的数据的占位符(代名词)。引用(检索)其值称为变量替换。获取变量值使用美元符号:9uM28资讯网——每日最新资讯28at.com

$

让我们仔细区分变量的 名称 及 变量值。如果 variable1 是 变量,则 $variable 是对其值的引用, 它包含的数据项。9uM28资讯网——每日最新资讯28at.com

从技术上讲,变量的名称称为左值,这意味着它出现 在作业的左侧 语句,如 VARIABLE=23 所示。变量的值为 右值,这意味着 它出现在赋值语句的右侧,如 VAR2=$VARIABLE。事实上,变量的名称是引用,是指向内存的指针,即该变量的值被保留在变量指向的内存位置起始的内存字节空间中。9uM28资讯网——每日最新资讯28at.com

9uM28资讯网——每日最新资讯28at.com

用一段shell命令演示变量的定义、赋值、读取(bash$ 后面的是具体执行的shell命令):9uM28资讯网——每日最新资讯28at.com

bash$ variable1=23bash$ echo variable1variable1bash$ echo $variable123

以“裸露”方式使用变量(没有 $ 前缀)的唯一时间是 声明或分配、未设置时、导出(export)时、 在双括号内的算术表达式中 (( variable1 )),或者在变量的特殊情况下 表示信号时(参见示例 32-5)。9uM28资讯网——每日最新资讯28at.com

示例 32-5:shell的变量与信号9uM28资讯网——每日最新资讯28at.com

#!/bin/bash# Hunting variables with a trap.trap 'echo Variable Listing --- a = $a  b = $b' EXIT#  EXIT is the name of the signal generated upon exit from a script.##  The command specified by the "trap" doesn't execute until#+ the appropriate signal is sent.echo "This prints before the /"trap/" --"echo "even though the script sees the /"trap/" first."echoa=39b=36exit 0#  Note that commenting out the 'exit' command makes no difference,#+ since the script exits in any case after running out of commands.

shell中如何给变量赋值?

赋值可以带有 =(如 var1=27), 在 READ 语句中:9uM28资讯网——每日最新资讯28at.com

#!/bin/bash# 读取用户输入echo "请输入你的名字:"read name# 输出用户输入的内容echo "你输入的名字是:$name"

或在循环的头部(for var2 in 1 2 3方式循环给变量var2赋值并打印值):9uM28资讯网——每日最新资讯28at.com

bash$ for var2 in 1 2 3;do echo $var2;done123

将引用的值括在英文的双引号中 ("...") 不会干扰变量操作。这是被称为部分引用 或称为“弱引用”。9uM28资讯网——每日最新资讯28at.com

使用英文的单引号 ('...') 导致按字面意思使用变量名,而不是将其替换为实际值。如:9uM28资讯网——每日最新资讯28at.com

var1=123echo '$var1'# 输出结果为 $var1, 也就是原原本本,未做变量替换。echo "$var1"# 输出结果为123, 也就是双引号有会按变量替换。

单引号内的变量效果是全引用,有时称为“强”引用。请参阅第 5 章 详细讨论SHELL的引用[1]。9uM28资讯网——每日最新资讯28at.com

请注意,$variable实际上是 ${variable} 的简化形式。在有的shell上下文中  语法会导致错误,那时使用{variable}`形式可能是推荐的做法(请参阅下面的第 10.2 节 SHELL的参数[2])。9uM28资讯网——每日最新资讯28at.com

shell的变量和赋值的综合例子:

#!/bin/bash# ex9.sh# 变量:赋值和替换a=375hello=$a# ---------------------------------------# 赋值时,等号两边不能有空格,否则初始化变量时会出错。# 如果有空格会怎样?# "VARIABLE =value"# ^#% 脚本尝试运行"VARIABLE"命令,参数为"="value"。# "VARIABLE= value"# ^#% 脚本尝试运行"value"命令,将"VARIABLE"设置为空字符串。# ---------------------------------------echo hello    # hello# 对echo来说,这不是变量引用,只是字符串"hello"...echo $hello   # 375# ^# 这是变量引用。echo ${hello} # 375# ^# 同样是变量引用。# 引用...echo "$hello"    # 375echo "${hello}"  # 375echohello="A B  C   D"echo $hello   # A B C Decho "$hello" # A B  C   D# 可以看到,echo $hello 和 echo "$hello" 的输出结果不同。# =======================================# 引用变量时保留空格。# =======================================`echo '$hello' # $hello`:输出变量 $hello,该变量被单引号括起来,因此不会进行变量替换。# 这演示了单引号的作用,即禁用变量引用,导致 $ 被解释为字面量。# 注意不同类型引号的影响。hello= # 将变量 hello 设置为空值。echo "/$hello (null value) = $hello" # 输出变量 $hello的值,该变量为空值。所以打印结果为 $hello (null value) = # 注意将变量设置为空值与取消设置变量不同,尽管最终结果相同(见下文)。# 允许在同一行设置多个变量,如果用空格分隔开。# 可能会导致旧版“sh”出现问题......# 如果变量中嵌入了空格,则需要使用双引号包裹。numbers="one two three"echo "numbers = $numbers"other_numbers=1 2 3  # 会报错说bash: 2: command not found# 使用双引号包裹other_numbers="1 2 3" # 不会报错echo "other_numbers = $other_numbers" # 此时输出为:other_numbers = 1 2 3# 也可以用/符号,作为前导转义空格mixed_bag=2/ ---/ Whatever # 设置变量 mixed_bag 的值,包含一个转义空格。那么mixed_bag的值为"2 --- Whatever"这字符串。echo "$mixed_bag" # 2 --- Whatever`:输出变量 mixed_bag 的值。echo; echo`:输出空行。echo "uninitialized_variable = $uninitialized_variable" # 输出变量 uninitialized_variable,该变量具有空值。uninitialized_variable= # 声明,但不初始化它 -- #+ 与将其设置为 null 值相同,如上所述。echo "uninitialized_variable = $uninitialized_variable" # 输出变量 uninitialized_variable,该变量仍然具有空值。uninitialized_variable=23 # 设置变量 uninitialized_variable 的值。unset uninitialized_variable # 取消设置变量 unitialized_variable。使用unset命令echo "uninitialized_variable = $unitialized_variable" # 输出变量 uninitialized_variable,该变量已被取消设置,具有空值。exit 0

未赋值

以上例子中,未初始化的变量,有一个"null"值,不是字符串"null",而是未赋值的状态。变量的为赋值状态,可以用if [ -z "$xxxx" ] 的-z 参数去判断。9uM28资讯网——每日最新资讯28at.com

9uM28资讯网——每日最新资讯28at.com

if [ -z "$unassigned" ]then  echo "/$unassigned is NULL."fi     # $unassigned is NULL.

直接使用未赋值的变量,可能引起一些问题,但可以对未赋值的变量做算数运算,达到初始化变量的效果。例如:9uM28资讯网——每日最新资讯28at.com

echo "$uninitialized"     # 空行空变量let "uninitialized += 5"  # 将该空变量加 5 echo "$uninitialized"     # 现在该变量有值了,等于5# 注意# shell中,未初始化的变量没有值。# 但在shell的算数运算中使用未初始化的变量,则该变量将被作为值等于0的变量使用。

参考资料:9uM28资讯网——每日最新资讯28at.com

  • [1]第 5 章 详细讨论SHELL的引用: https://tldp.org/LDP/abs/html/abs-guide.html#QUOTING
  • [2]第 10.2 节 SHELL的参数: https://tldp.org/LDP/abs/html/abs-guide.html#PARAMETER-SUBSTITUTION

本文链接:http://www.28at.com/showinfo-26-59674-0.html基础不牢地动山摇——shell中的变量和参数如何定义和使用?有什么注意点

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Rust 切片与 Go 有何区别?

下一篇: 一个用于批量给图片增加水印的Python库

标签:
  • 热门焦点
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
Top