linux中$与()的一点使用疑惑解释

本文详细介绍了Shell脚本中不同方式给变量赋值的区别,包括直接赋值、使用反引号`和$(...)命令替换等,并通过实例展示了各种赋值方法的效果。

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

a=$(cat 1.sh)
等价于
a=`cat 1.sh`


a=(cat 1.sh) 相当于定义一个a数组,内容为cat 1.sh
a=(`cat 1.sh`)相当于把1.sh里面的内容当成a的数组,a仍旧是一个数组
a=$(`cat 1.sh`)此命令会报错,不能执行

 

[root@zejin240 chenzejin]# cat 1.sh 
hello world 2016
better
[root@zejin240 chenzejin]# a=(cat 1.sh) [root@zejin240 chenzejin]# b=(`cat 1.sh`) [root@zejin240 chenzejin]# c=$(cat 1.sh) [root@zejin240 chenzejin]# d=`cat 1.sh`

[root@zejin240 chenzejin]# echo ${a[@]} cat 1.sh [root@zejin240 chenzejin]# echo ${b[@]} hello world 2016 better [root@zejin240 chenzejin]# echo ${c[@]} hello world 2016 better [root@zejin240 chenzejin]# echo ${d[@]} hello world 2016 better
[root@zejin240 chenzejin]#
echo $a cat [root@zejin240 chenzejin]# echo $b hello [root@zejin240 chenzejin]# echo $c hello world 2016 better [root@zejin240 chenzejin]# echo $d hello world 2016 better

[root@zejin240 chenzejin]# e=$(`cat 1.sh`)
-bash: hello: command not found

转载于:https://www.cnblogs.com/zejin2008/p/5132273.html

<think>好的,我现在需要帮助用户理解Linux设备树中reg属性的含义和用法。用户已经提供了几个引用内容,我需要结合这些内容来构建一个清晰准确的回答。首先,我应该先回顾用户提供的引用,确保信息正确无误。 根据引用[2]和[3],reg属性用于描述设备在地址空间中的位置和大小,每个条目由地址和长度组成。而#address-cells和#size-cells则决定了这些值的解析方式。例如,如果父节点的#address-cells是2,#size-cells是1,那么reg中的每个条目就包含两个地址单元和一个长度单元。 接下来,我需要考虑用户可能需要的示例。引用[4]中的代码示例显示reg = <0x38>,这可能是一个I2C设备的地址,但用户可能疑惑为什么只有一个值。这里需要解释,当父节点指定了地址和长度的单元格数目后,子节点的reg可以简化。比如在I2C设备中,可能只需要地址,长度默认为1,因此不需要显式写出。 用户可能还会问到reg属性的常见应用场景,比如内存映射、寄存器访问或DMA配置。根据引用[3],reg属性用于物理或虚拟地址空间中的位置,操作系统通过这些地址访问设备。因此,应用场景需要涵盖这些方面。 另外,用户可能存在的疑问是为什么有些reg属性看起来只有地址没有长度。这时候需要结合父节点的#size-cells是否为0的情况来解释,比如在I2C中,长度可能被省略,因为设备通常只占用一个地址位置。 还需要注意用户提到的“reg属性不好用不建议用”这一点,可能是指在使用reg时需要正确配置父节点的#address-cells和#size-cells,否则容易出错。因此,在注意事项中要强调正确设置这些属性,避免解析错误。 最后,生成的相关问题需要覆盖用户可能进一步想了解的内容,比如address-cells的作用、reg属性的格式解析以及常见错误处理。这些可以帮助用户深入学习和排查问题。 总结一下,回答的结构应该包括作用、示例解析、应用场景、注意事项和相关问题。确保每个部分都有对应的引用支持,并且语言通俗易懂,避免过于技术化,让用户能够逐步理解。</think>### Linux设备树中`reg`属性的作用示例解析 #### 1. **`reg`属性的核心作用** `reg`属性用于描述设备在物理或虚拟地址空间中的位置和大小,通常包含一系列**地址和长度对**。每个地址-长度对对应设备的寄存器集合或内存区域,操作系统通过这些信息访问硬件资源[^3]。例如: - 内存映射的I/O设备(如GPIO控制器)需指定基地址和映射范围。 - I2C/SPI设备可能仅需地址(长度默认为1)。 #### 2. **示例解析** 以下是一个设备树节点的代码片段[^4]: ```dts 115x06:115x06038 { compatible = "edt,edl-fl5306"; reg = <0x38>; // 其他属性... }; ``` - **`reg = <0x38>`的含义**: - 父节点(如I2C总线)的`#address-cells = <1>`和`#size-cells = <0>`,表示地址占1个单元,长度不指定。 - `0x38`是设备的I2C地址,无长度字段(长度默认为1)。 - **典型场景**:I2C设备通常只需地址,而PCI设备可能需要`<基地址 长度>`对。 #### 3. **`reg`属性的格式依赖** `reg`的解析依赖于父节点的两个属性: - **`#address-cells`**:定义地址的单元数(如`1`表示32位地址)。 - **`#size-cells`**:定义长度的单元数(如`1`表示32位长度)。 例如,若父节点配置为: ```dts #address-cells = <2>; #size-cells = <1>; ``` 则子节点的`reg`格式可能为:`reg = <0x10000000 0x00 0x1000>`,表示基地址为`0x10000000 0x00`,长度`0x1000`。 #### 4. **应用场景** - **内存映射设备**:如RAM、GPU显存,需指定完整地址和大小。 - **寄存器访问**:通过`reg`中的地址直接读写设备寄存器。 - **DMA配置**:DMA控制器需知道内存区域的地址和长度。 #### 5. **注意事项** - **避免滥用**:仅在需要硬件地址绑定时使用`reg`,软件配置优先通过其他属性(如`gpio`标签)[^2]。 - **单元数一致性**:必须父节点的`#address-cells`和`#size-cells`匹配,否则解析错误。 - **长度省略**:若`#size-cells = 0`,长度可省略(如I2C设备)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值