首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Bash函数中将字符串列表格式化为一组命令选项/参数对

如何在Bash函数中将字符串列表格式化为一组命令选项/参数对
EN

Stack Overflow用户
提问于 2017-12-20 18:23:03
回答 3查看 69关注 0票数 1

我想做的是

我正在Windows上运行Git Bash,并且正在尝试为ls编写一个包装器函数,它可以正确地处理Windows的隐藏文件标志。

命令cmd.exe /c "dir /b /a/h"将输出目录中具有隐藏标志的文件列表。每个文件名都在一行中输出,由\r\n分隔(为Windows)。带空格的文件名用单引号括起来。

代码语言:javascript
复制
$ cmd.exe /c "/b /ah"
.gitconfig
desktop.ini
'hidden file.txt' 

然后,我想将其格式化为最终ls调用的--ignore选项列表。

代码语言:javascript
复制
--ignore='.gitconfig' --ignore='desktop.ini' --ignore='hidden file.txt'

我尝试过的

在设置了IFS='\r\n'之后,我使用了一个for循环,它应该允许我用--ignore=''格式化每个文件名字符串。

代码语言:javascript
复制
function ls {
    options=""
    IFS="\r\n"
    for filename in $(cmd.exe /c "dir /b /ah")
        do options="${options}--ignore='$filename' "
    done

    echo $options
    # command ls $options "$@"
}

但是,字符串没有被拆分,并且输出中nr的所有实例都被替换为一个空格,因此得到的字符串是乱码。

代码语言:javascript
复制
$ ls
--ig o e='.gitco fig
desktop.i i
hidde  file.txt'

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-20 18:34:10

将选项收集到单个字符串变量中将是一个糟糕的结局。请改用数组。

代码语言:javascript
复制
ls () {
    options=()
    local IFS="\r\n"
    while read -r filename; do
        case $filename in \'*\')
            filename=${filename#\'}; filename=${filename%\'};;
        esac
        options+=("--ignore=$filename")
    done < <(cmd.exe /c "dir /b /ah")

    # echo will flatten the arguments, maybe just run git here
    echo "${options[@]}"
}

另请参阅http://mywiki.wooledge.org/BashFAQ/050以获得更多讨论。

票数 2
EN

Stack Overflow用户

发布于 2017-12-20 18:27:43

您在optionsecho文件名而不带引号,echo将它们作为单独的参数进行回显:

代码语言:javascript
复制
echo "$options"

应该工作得很好。

票数 0
EN

Stack Overflow用户

发布于 2017-12-23 14:40:37

最后,我使用了@tripleee推荐的数组,但没有使用while read,而是使用了一个简单的for循环。不需要显式地处理多字文件名周围的引号。

代码语言:javascript
复制
function ls {
    local IFS=$'\r\n'
    options=()
    for filename in $(cmd.exe /c "dir /b /ah 2> null")
        do options+=("--hide=$filename")
    done

    command ls "${options[@]}" "$@"
}

使用--hide选项而不是--ignore选项,以允许-a--all按预期工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47903762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档