如何使用文件的行作为命令的参数?

2024-10-17 08:46:00
admin
原创
68
摘要:问题描述:假设我有一个foo.txt指定N参数的文件arg1 arg2 ... argN 我需要将其传递给命令my_command如何使用文件的行作为命令的参数?解决方案 1:如果你的 shell 是 bash (以及其他 shell), 的快捷方式$(cat afile)是$(< afile)...

问题描述:

假设我有一个foo.txt指定N参数的文件

arg1
arg2
...
argN

我需要将其传递给命令my_command

如何使用文件的行作为命令的参数?


解决方案 1:

如果你的 shell 是 bash (以及其他 shell), 的快捷方式$(cat afile)$(< afile),因此你可以写:

mycommand "$(< file.txt)"

在 bash 手册页的‘命令替换’部分中有记录。

或者,让你的命令从标准输入读取,因此:mycommand < file.txt

解决方案 2:

正如前面提到的,您可以使用反引号或$(cat filename)

我没有提到但我认为需要注意的是,您必须记住,shell 会根据空格拆分该文件的内容,将其找到的每个“单词”作为参数提供给您的命令。虽然您可以将命令行参数括在引号中,以便它可以包含空格、转义序列等,但从文件中读取不会执行相同的操作。例如,如果您的文件包含:

a "b c" d

您将获得的参数是:

a
"b
c"
d

如果要将每一行作为参数,请使用 while/read/do 结构:

while read i ; do command_name $i ; done < filename

解决方案 3:

command `< file`

会将文件内容传递给 stdin 上的命令,但会删除换行符,这意味着您无法单独迭代每一行。为此,您可以编写一个带有“for”循环的脚本:

for line in `cat input_file`; do some_command "$line"; done

或者(多行变体):

for line in `cat input_file`
do
    some_command "$line"
done

$()或者(使用而不是 的多行变体``):

for line in $(cat input_file)
do
    some_command "$line"
done

参考:

  1. For 循环语法:https://www.cyberciti.biz/faq/bash-for-loop/

解决方案 4:

你可以使用反引号来实现这一点:

echo World > file.txt
echo Hello `cat file.txt`

解决方案 5:

如果您想以一种适用于每个可能的命令行参数(带有空格的值、带有换行符的值、带有文字引号字符的值、不可打印的值、带有 glob 字符的值等)的强大方式执行此操作,它会变得更有趣。


要写入文件,给定一个参数数组:

printf '%s' "${arguments[@]}" >file

...根据需要替换为、等"argument one""argument two"


要读取该文件并使用其内容(在 bash、ksh93 或其他具有数组的最新 shell 中):

declare -a args=()
while IFS='' read -r -d '' item; do
  args+=( "$item" )
done <file
run_your_command "${args[@]}"

要从该文件读取并使用其内容(在没有数组的 shell 中;请注意,这将覆盖您的本地命令行参数列表,因此最好在函数内部完成,这样您就是在覆盖函数的参数而不是全局列表):

set --
while IFS='' read -r -d '' item; do
  set -- "$@" "$item"
done <file
run_your_command "$@"

请注意,-d(允许使用不同的行尾分隔符)是非 POSIX 扩展,没有数组的 shell 也可能不支持它。如果是这种情况,您可能需要使用非 shell 语言将 NUL 分隔的内容转换为eval-safe 格式:

quoted_list() {
  ## Works with either Python 2.x or 3.x
  python -c '
import sys, pipes, shlex
quote = pipes.quote if hasattr(pipes, "quote") else shlex.quote
print(" ".join([quote(s) for s in sys.stdin.read().split("")][:-1]))
  '
}

eval "set -- $(quoted_list <file)"
run_your_command "$@"

解决方案 6:

如果你需要做的只是打开文件arguments.txt内容

arg1
arg2
argN

然后my_command arg1 arg2 argN你可以简单地使用xargs

xargs -a arguments.txt my_command

您可以在调用中添加其他静态参数xargs,例如xargs -a arguments.txt my_command staticArg将调用my_command staticArg arg1 arg2 argN

解决方案 7:

以下是我将文件内容作为参数传递给命令的方法:

./foo --bar "$(cat ./bar.txt)"

解决方案 8:

这些答案似乎都不适合我,或者太复杂了。幸运的是,这并不复杂xargs(在 Ubuntu 20.04 上测试)。

正如 OP 所提到的,这与文件中单独一行上的每个参数一起工作,这也是我所需要的。

cat foo.txt | xargs my_command

需要注意的一点是它似乎不适用于别名命令。

如果命令接受包含在字符串中的多个参数,则接受的答案有效。在我使用 (Neo)Vim 的情况下,它不起作用,并且参数都粘在一起了。

xargs正确地执行并实际上为您提供了提供给命令的单独参数。

解决方案 9:

我建议使用:

command $(echo $(tr '
' ' ' < parameters.cfg))

只需修剪行尾字符并将其替换为空格,然后将生成的字符串作为可能的单独参数用 echo 推送。

解决方案 10:

即使行中有空格,这两种解决方案仍然有效:

readarray -t my_args < foo.txt
my_command "${my_args[@]}"

如果readarray不起作用,请将其替换为mapfile,它们是同义词。

我以前尝试过下面这个,但是在my_command脚本中遇到了问题:

xargs -d '
' -a foo.txt my_command

解决方案 11:

在我的 bash shell 中,以下操作非常有效:

cat input_file | xargs -I % sh -c 'command1 %; command2 %; command3 %;'

其中 input_file 是

arg1
arg2
arg3

显然,这允许您使用 input_file 中的每一行执行多个命令,这是我在这里学到的一个很好的技巧。

解决方案 12:

在编辑了@Wesley Rice 的答案几次之后,我决定我的改动太大了,不能继续修改他的答案,而只能自己写。所以,我决定自己写一个!

读取文件的每一行并逐行操作,如下所示:

#!/bin/bash
input="/path/to/txt/file"
while IFS= read -r line
do
  echo "$line"
done < "$input"

这直接来自作者 Vivek Gite:https: //www.cyberciti.biz/faq/unix-howto-read-line-by-line-from-file/。功劳归于他!

语法:在 Bash Unix 和 Linux shell 上逐行读取文件:

  1. bash、ksh、zsh 和所有其他 shell 逐行读取文件的语法如下

  2. while read -r line; do COMMAND; done < input.file

3.-r传递给 read 命令的选项可防止解释反斜杠转义符。4

.IFS=在 read 命令前添加选项可防止修剪前导/尾随空格 -

5.while IFS= read -r line; do COMMAND_on $line; done < input.file


现在来回答这个我也遇到过的、现在已经解决的问题:是否可以从文件中“git add”文件列表? - 以下是我的答案:

请注意,这FILES_STAGED是一个包含文件的绝对路径的变量,该文件包含许多行,其中每行都是我想要执行的文件的相对路径git add。此代码片段将成为此项目中“eRCaGuy_dotfiles/useful_scripts/sync_git_repo_to_build_machine.sh”文件的一部分,以便于将开发中的文件从一台 PC(例如:我编写代码的计算机)轻松同步到另一台 PC(例如:我构建的更强大的计算机):https ://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles 。

while IFS= read -r line
do
    echo "  git add \"$line\""
    git add "$line" 
done < "$FILES_STAGED"

参考:

  1. 我的答案复制自:https: //www.cyberciti.biz/faq/unix-howto-read-line-by-line-from-file/

  2. For 循环语法:https://www.cyberciti.biz/faq/bash-for-loop/

有关的:

  1. 如何逐行读取文件内容并执行操作git add:是否可以从文件中“git add”文件列表?

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用