bash - 当字符串包含 * 字符时,如何将 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
在这种情况下,'*' 并没有按字面意思映射到数组中,而是似乎扩展为环境变量列表,并且数组最终得到一个更大的列表或不代表原始字符串的值。
三个问题:
- * 究竟被扩展成什么?
- 是否可以禁用此扩展以使代码以预期的方式运行?
- 有没有更好的方法来完成将字符串转换为不受此副作用影响的标记数组?
解决方案
去做吧read
;不带引号的参数扩展受路径名扩展和分词的影响,因此*
扩展为当前工作目录中的所有文件名。
read -a fields <<< "$string"
或者,也可以禁用路径名扩展,允许
set -f
fields=( $string )
set +f
推荐阅读
- javascript - 如何在服务器上运行 javascript 实验
- javascript - Node js 护照的 req.isAuthenticated 总是返回 false
- php - htaccess没有传递参数来进入php
- html - 如何在角度应用程序中将当前位置放置在传单打开的街道地图中
- android - Android根据适配器中的屏幕旋转/宽度改变高度
- json - ODATA 在 MS Edge 中不返回 JSON
- java - 如何将以下代码转换为 lamda 表达式
- linux-kernel - bootloader的UART驱动只能用于bootloader,不能用于Linux
- java - 正则表达式替换预定义的字符范围之前的所有内容 - Java
- pointers - fmt.Printf() 格式说明符以默认格式打印指向结构的指针?