Linux Shell Bash 变量赋值

例子 4-2. 简单的变量赋值

  1 #!/bin/bash
  2 # "裸体"变量
  3 
  4 echo
  5 
  6 # 变量什么时候是"裸体"的, 比如前边少了$的时候?
  7 # 当它被赋值的时候, 而不是被引用的时候.
  8 
  9 # 赋值
 10 a=879
 11 echo "The value of \"a\" is $a."
 12 
 13 # 使用'let'赋值
 14 let a=16+5
 15 echo "The value of \"a\" is now $a."
 16 
 17 echo
 18 
 19 # 在'for'循环中(事实上, 这是一种伪赋值):
 20 echo -n "Values of \"a\" in the loop are: "
 21 for a in 7 8 9 11
 22 do
 23   echo -n "$a "
 24 done
 25 
 26 echo
 27 echo
 28 
 29 # 使用'read'命令进行赋值(这也是一种赋值的类型):
 30 echo -n "Enter \"a\" "
 31 read a
 32 echo "The value of \"a\" is now $a."
 33 
 34 echo
 35 
 36 exit 0



例子 4-3. 简单和复杂, 两种类型的变量赋值

  1 #!/bin/bash
  2 
  3 a=23              # 简单的赋值
  4 echo $a
  5 b=$a
  6 echo $b
  7 
  8 # 现在让我们来点小变化(命令替换).
  9 
 10 a=`echo Hello!`   # 把'echo'命令的结果传给变量'a'
 11 echo $a
 12 #  注意, 如果在一个#+的命令替换结构中包含一个(!)的话, 
 13 #+ 那么在命令行下将无法工作.
 14 #+ 因为这触发了Bash的"历史机制."
 15 #  但是, 在脚本中使用的话, 历史功能是被禁用的, 所以就能够正常的运行.
 16 
 17 a=`ls -l`         # 把'ls -l'的结果赋值给'a'
 18 echo $a           # 然而, 如果没有引号的话将会删除ls结果中多余的tab和换行符.
 19 echo
 20 echo "$a"         # 如果加上引号的话, 那么就会保留ls结果中的空白符.
 21                   # (具体请参阅"引用"的相关章节.)
 22 
 23 exit 0

使用$(...)机制来进行变量赋值(这是一种比后置引用(反引号`)更新的一种方法).事实上这两种方法都是命令替换的一种形式.

  1 # From /etc/rc.d/rc.local
  2 R=$(cat /etc/redhat-release)
  3 arch=$(uname -m)



出处

本文引用文


<think>我们正在处理用户的问题:在Linux shell中将包含通配符的字符串赋值变量 用户的问题:我想在Linux shell中将包含通配符的字符串赋值变量 根据引用[1],双引号字符串会进行变量扩展,但不会进行路径扩展(通配符扩展)。而单引号字符串则完全不进行扩展。 通配符(如*)在赋值时不会被扩展,除非我们使用特定的方式让shell进行扩展。 有两种情况: 1. 我们想将字符串本身(包含通配符)作为字符串值赋给变量,而不进行扩展。例如,变量值应该是"*.txt"。 2. 我们想将通配符扩展的结果(即匹配的文件列表)赋给变量。 根据用户的问题,他可能想要第一种情况,即只是将字符串(包含通配符)赋值变量,而不进行扩展。因为如果进行扩展,那么变量将是一个文件列表。 如何实现: 情况1:将通配符字符串原样赋值变量 - 使用单引号:因为单引号内所有字符都保持字面意义。 var='*.txt' - 或者使用双引号,但需要转义通配符: var="\*.txt" 或者 var="*.txt" # 注意:在双引号中,通配符不会被扩展,但是双引号中如果有变量会被扩展。所以如果只是通配符,双引号也可以,但为了安全,通常用单引号。 情况2:将通配符扩展后的结果赋值变量 - 使用数组(推荐,因为可以处理多个文件,包括空格): arr=(*.txt) 然后可以通过下标访问,如${arr[0]},或者遍历数组。 - 或者使用字符串(但如果有空格,可能会出现问题): var="*.txt" # 这样赋值不会扩展 要扩展,我们需要使用: var=$(ls *.txt) # 但是这样如果文件名有空格,会出问题 或者 var=`ls *.txt` # 同样的问题 但是,使用ls命令来赋值是不安全的,因为文件名可能包含空格、换行等特殊字符。 因此,对于情况2,推荐使用数组。 根据引用[4],我们也要注意性能,但这里只是赋值,影响不大。 根据用户的问题,他可能只是想要将字符串(包含通配符)赋值变量,而不扩展。所以我们重点讲解第一种情况。 但是,用户的问题没有明确,所以我们两种都讲。 步骤: 1. 明确用户意图:是保留通配符还是扩展通配符? 2. 分别给出两种情况的解决方案。 由于用户没有明确,我们按照两种可能性来回答。 另外,引用[2]提到eval的使用有风险,所以我们在扩展时避免使用eval。 引用[3]是关于type命令,这里不直接相关。 引用[5]是docker compose,不相关。 因此,我们主要参考引用[1]和引用[4](关于shell函数,但这里我们不是用函数,而是直接赋值)。 回答结构: 1. 解释问题:在shell中,通配符在赋值时的行为。 2. 情况一:将通配符作为字符串赋值(不扩展) 3. 情况二:将通配符扩展为文件列表赋值 4. 注意事项 生成相关问题: 1. 如何防止shell扩展通配符? 2. 如何将多个文件名的列表安全地存储在变量中? 3. shell中单引号和双引号的区别是什么?</think>### 在 Linux Shell 中将含通配符的字符串赋值变量Linux Shell 中处理含通配符(如 `*`, `?`)的字符串时,需根据需求选择以下两种方法: #### ✅ 方法 1:保留通配符原义(不扩展) **适用场景**:仅存储通配符字符串本身(如 `"*.txt"`),后续手动扩展或传递给命令。 ```bash # 使用单引号(推荐) var='*.txt' echo "$var" # 输出 *.txt(未被扩展) # 或双引号+转义(效果相同) var="\*.txt" ``` #### ✅ 方法 2:立即扩展通配符 **适用场景**:获取匹配的文件列表。 ```bash # 存储为数组(支持空格/特殊字符) files=(*.txt) echo "第一个文件: ${files[0]}" echo "所有文件: ${files[@]}" # 存储为字符串(仅限简单文件名) files_str="$(echo *.txt)" echo "$files_str" # 输出 file1.txt file2.txt ... ``` #### ⚠️ 关键注意事项 1. **引号规则**: - 单引号 `' '`:完全禁止扩展(包括变量和通配符) - 双引号 `" "`:允许变量扩展 `$var`,但**禁止通配符扩展** [^1] - 无引号:通配符和变量均会被扩展 2. **避免错误扩展**: ```bash # 错误!双引号内通配符不会扩展,输出字面 "*.txt" var="*.txt" ls "$var" # 尝试列出名为 "*.txt" 的文件 # 正确:先扩展再存储 files=$(ls *.txt) # 或使用数组更安全 ``` 3. **数组优势**: - 安全处理带空格的文件名:`files=("file with space.txt")` - 直接遍历元素:`for f in "${files[@]}"; do ...` #### 示例应用 ```bash # 存储通配符模式供后续使用 pattern='image_*.jpg' convert "$pattern" -resize 50% output.jpg # 实际命令需支持通配符 # 获取当前目录所有 .log 文件 log_files=(*.log) grep "ERROR" "${log_files[@]}" > errors.txt ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值