【问题标题】:How to pass in arguments from text file line by line to a command that is wrapped in string如何将文本文件中的参数逐行传递给包含在字符串中的命令
【发布时间】:2019-12-29 04:45:38
【问题描述】:

我有一个 txt 文件,其中包含一堆 1 个单词的字符串,它们将用作参数:

input.txt

arg1 
arg2 
arg3
…
argN

我需要在命令如下所示的 (zsh) 终端中传递这些参数:

$run_program "settings:default argument:{NEED TO PUT ARGUMENT HERE}" 

请注意引号需要保留其位置。

所以我试图调用程序 N 次。有没有办法做到这一点?

【问题讨论】:

    标签: shell arguments zsh


    【解决方案1】:

    读取文件的行并将它们存储在一个数组中(请参阅 zsh there 中的操作方法)。之后,只需遍历数组并为每个元素触发所需的命令即可。

    # read the file (zsh-only syntax):
    args=( "${(@f)$(< file.txt)}" )
    # loop through its lines (sh-compatible syntax):
    for arg in "${arg[@]}" ; do
      "$run_program" "settings:default argument:$arg"
    done
    

    当然,如果你不需要文件的内容来做其他事情,你可以将前两行合并为一行,避免命名一个数组来存储这些行。

    for arg in "${(@f)$(< file.txt)}" ; do
      "$run_program" "settings:default argument:$arg"
    done
    

    或者,您可以逐行读取文件并直接处理这些行。为此,您将使用 canonical pattern,它结合了 read 原语(小心使用)和 while 循环,并且不特定于 zsh。

    # sh-compatible syntax:
    while IFS= read -r arg || [ -n "$arg" ] ; do
      "$run_program" "settings:default argument:$arg"
    done < file.txt
    

    【讨论】:

    • 您好,感谢您的回答!我对编程比较陌生,我为这个相当幼稚的问题道歉,但这是你正在编写的 bash 脚本吗?所以我会在 .sh 文件中编写您提到的这些选项之一,然后运行该文件?
    • 所以我设法在 bash 上关注了一些 youtube 视频并了解了如何制作 .sh 文件,然后我尝试使用 ./run.sh 运行该文件,但出现此错误:第 4 行:$ {(@f)$(
    • 欢迎来到 SO!我使用 zsh 因为它是您在问题中提到的语言。 “Bash”和“zsh”是两个不同的shells,共享一个共同的祖先,叫做“sh”。因此,它们在语法和功能上相似,但并不完全相同。特别是,神秘的 ${(@f)…} 部分是 zsh 特有的,所以如果你想使用它,你必须用 zsh 调用它,它不适用于 bash(这是一种无效的语法)。或者,您可以使用我的第三个 sn-p,它是纯 sh 语法,因此与 sh、bash 和 zsh 兼容。
    • 要让zsh执行一个脚本,给它文件扩展名.zsh(而不是.sh)并使用shebang#!/usr/bin/env zsh(而不是例如#!/usr/bin/env bash) .
    • 没有真正的理由不在zsh 中使用sh-compatible 循环。请注意,|| [ -n "$arg" ] 是一个 hack,用于容纳不以换行符结尾的非 POSIX 输入文件。 (read 有一个非零退出代码,但仍会使用在这种情况下可以读取的内容填充 arg。)
    【解决方案2】:
    for a in `cat input.txt`; do
        run_program "settings:default argument:{$a}"
    done
    

    如果你的参数中有一个“空格”字符,那么它将不起作用。

    【讨论】:

    • 通过稍微修改你读取文件的方式,你可以让这个程序对每一个可能的输入都是正确的(错误的引用,不管是空格还是其他“特殊字符”,可能是第一个缺陷)网络上的代码 sn-ps)。您还可以避免产生不必要的进程cat。看我的回答。
    【解决方案3】:

    使用 xargs:

    xargs -I {} "$run_program" "settings:default argument:{}" <input.txt
    

    请注意,-I 不仅为参数 ({}) 建立了占位符,它还确保为输入的每一行调用一次程序。

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2021-05-06
      • 2011-04-03
      相关资源
      最近更新 更多