$variable
我曾经在存储编译器标志时使用不带引号的扩展variable
,但我最近了解到像*
和?
包含在variable
中的 glob 元字符仍然被扩展,例如
$ f='*'
$ echo $f
foo.bash
除了set -f
.
在 bash 中,我能想出的最明确的方法是定义一个read_words
这样的函数,它使用作为参数传入的字符串的内容填充数组名称,然后用于${arr[@]}
扩展字符串。
#!/bin/bash
count() {
printf '%s\n' "$#"
}
read_words() {
IFS=$' \t\n' read -a "$1" <<< "$2"
return 0
}
read_words arr 'a b *'
count "${arr[@]}"
set -f
是在不使用通配符的情况下进行字段拆分的最便捷方法。在
bash
中,您可以测试是否已使用-o
测试设置了 shell 选项。因此,您可以这样做:这将检测
noglob
shell 选项的状态( 的长名称set -f
)。如果未设置,则会设置并RETURN
安装陷阱。如果脚本是 sourced的,陷阱将noglob
在脚本完成后取消设置 shell 选项。如果脚本不是源代码,陷阱将不执行任何操作。有趣的注意事项:源脚本非常像 shell 函数。
在 Bash 中,您可以将
set
选项(的内容$-
)设置为函数的本地选项local -
。或者您可以set -f
在子 shell 中运行需要的部分,它应该是可移植的。或者