bash函数中的通配符扩展

时间:2015-11-19 11:49:33

标签: bash glob

请不要采取错误的方式,但在有人回答并告诉我应该使用数组之前,我正在寻找以下代码无效的原因,而不是'如何正确地执行此操作”。 我在互联网上搜索了这个原因。

在bash中给出:

/home/user/abc*.cfg

返回/home/user/abc-def.cfg

为什么不展开*以提供file=$HOME/$(ls -1 $HOME|grep $1)

解决方法:

java.nio.ByteBuffer

不优雅。

背景:我知道只有一个文件以'abc'开头,但文件名的其余部分可能会有所不同,我不关心,只是初始标识符(上面的例子中为abc)。

最后,很棒的论坛,使用它很多,但这是我第一次没有找到答案,所以我的第一篇帖子 - 善良: - )

1 个答案:

答案 0 :(得分:1)

适合我。

$ function fn1 {
>   file=$HOME/$1*.cfg
>   echo $file
> }
$ 
$ touch $HOME/abc-def.cfg
$ fn1 abc
/home/jackman/abc-def.cfg

然而,如果我禁用文件名扩展,我会看到您的结果:

$ set -f
$ fn1 abc
/home/jackman/abc*.cfg

你事先做过set -f吗?如果您想在功能中考虑到这一点:

function fn1 { 
    local filename_expansion_disabled
    [[ $- == *f* ]]; filename_expansion_disabled=$?

    local file=$HOME/"$1"*.cfg

    [[ $filename_expansion_disabled -eq 0 ]] && set +f
    echo $file
    [[ $filename_expansion_disabled -eq 0 ]] && set -f || true
}

然后

$ set +f
$ fn1 abc
/home/jackman/abc-def.cfg
$ set -f
$ fn1 abc
/home/jackman/abc-def.cfg

在子shell中运行该函数具有相同的效果,并且以不显着的性能损失为代价更简单:

fn1() (
    file=$HOME/"$1"*.cfg
    set +f
    echo $file
)