【问题标题】:Bash: Pass all arguments exactly as they are to a function and prepend a flag on each of themBash:将所有参数完全按原样传递给函数,并在每个参数上添加一个标志
【发布时间】:2017-06-25 09:35:22
【问题描述】:

这似乎是一个相对基本的问题,但经过一个小时的搜索,我在任何地方都找不到。 许多(有很多!)类似的问题似乎没有抓住重点。

我正在编写script ("vims") 以在类似 sed 的模式下使用 vim(因此我可以在流输入上调用普通 vim 命令而无需实际打开 vim),因此我需要将每个参数传递给vim 前面带有“-c”标志。还有很多字符需要转义(我需要传递正则表达式),所以SO上的一些常用方法不起作用。

基本上,当我写的时候:

cat myfile.txt | vims ':%g/foo/exe "norm yyPImyfile: \<esc>\$dF,"' ':3p'

这是在标准输出上运行的两个命令行 vim 参数, 我需要将这两个单引号参数完全传递给我的函数vims(),然后用-c标志标记它们每个,因此它们被解释为命令vim。

这是我迄今为止尝试过的:

vims() {                                                                            
    vim - -nes -u NONE -c '$1' -c ':q!' | tail -n +2              
}   

这似乎适用于单个命令。没有字符被转义,并且“-c”标志在那里。

然后,我尝试使用经常重复的问答,"$@" 技巧:

vims() {
    vim - -nes -u NONE $(for arg in "$@"; do echo -n " -c $arg "; done) -c ':q!' | tail -n +2
}

这似乎打破了我传递的每个字符串中的空格,所以不起作用。正如其他问题中所建议的那样,我还尝试了printf 命令的一些变体,但这与 vim 命令序列有奇怪的交互。我在永久编辑测试循环中尝试了许多其他不同的反斜杠引号组合,但总是在我的方法中发现一个怪癖。

我缺少什么命令序列?

【问题讨论】:

    标签: regex bash unix vim


    【解决方案1】:

    一次将所有参数添加到一个数组中,然后将整个数组传递给 vim 并正确引用以确保正确保留空白。

    vims() {
        local args=()
    
        while (($# > 0)); do
            args+=(-c "$1")
            shift
        done
    
        vim - -nes -u NONE "${args[@]}" -c ':q!' | tail -n +2
    }
    

    根据经验,如果您发现自己试图逃避某些事情、添加反斜杠、使用printf 等,那么您很可能会走错路。谨慎使用引用和数组将涵盖大多数场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多