我长期使用类似于:
的代码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
在这种情况下,“ *”并没有从字面上映射到数组中,而是似乎扩展为环境变量列表,并且数组最终以更大的列表或不代表原始值的值结束字符串。
三个问题:
答案 0 :(得分:2)
让read
这样做;不带引号的参数扩展会受到路径名扩展和单词拆分的影响,因此*
会扩展为当前工作目录中的所有文件名。
read -a fields <<< "$string"
或者,也可以禁用路径名扩展,从而允许
set -f
fields=( $string )
set +f
答案 1 :(得分:0)
ls *