首页 > 解决方案 > 当字符串包含 * 字符时,如何将 bash 字符串标记为数组?

问题描述

我长期以来使用的代码类似于:

string="abc 123 xyz"
fields=( ${string} )
echo "The 3rd field = ${fields[2]}"

将字符串分解为字段并引用字符串中的特定元素。

但是我今天遇到了一个奇怪的用例,其中源字符串包含一个“*”星号字符。IE:

string="abc * xyz"
fields=( ${string} )
echo "The 3rd field = ${fields[2]}"
declare -p fields

在这种情况下,'*' 并没有按字面意思映射到数组中,而是似乎扩展为环境变量列表,并且数组最终得到一个更大的列表或不代表原始字符串的值。

三个问题:

  1. * 究竟被扩展成什么?
  2. 是否可以禁用此扩展以使代码以预期的方式运行?
  3. 有没有更好的方法来完成将字符串转换为不受此副作用影响的标记数组?

标签: bash

解决方案


去做吧read;不带引号的参数扩展受路径名扩展和分词的影响,因此*扩展为当前工作目录中的所有文件名。

read -a fields <<< "$string"

或者,也可以禁用路径名扩展,允许

set -f
fields=( $string )
set +f

推荐阅读