当字符串包含*字符时,如何将bash字符串标记为数组?

时间:2019-07-03 21:57:50

标签: bash

我长期使用类似于:

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

将字符串分成多个字段并引用字符串中的特定元素。

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

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

在这种情况下,“ *”并没有从字面上映射到数组中,而是似乎扩展为环境变量列表,并且数组最终以更大的列表或不代表原始值的值结束字符串。

三个问题:

  1. *扩展到的确切含义是什么?
  2. 是否可以禁用此扩展,以便代码按预期的方式运行?
  3. 是否有更好的方法可以将字符串转换为不受此副作用困扰的令牌数组?

2 个答案:

答案 0 :(得分:2)

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

read -a fields <<< "$string"

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

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

答案 1 :(得分:0)

    • 扩展为当前目录中的所有文件,与ls *
  1. 使用单引号。 {string =“ abc'*'xyz”}
  2. 也许,但这是个好方法:-)