比如说,我有一个文件foo.txt,指定了N个参数

arg1
arg2
...
argN

我需要传递给命令my_command

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


当前回答

如果您希望以一种适用于所有可能的命令行参数(带有空格的值、带有换行符的值、带有文字引号的值、不可打印的值、带有glob字符的值等)的健壮方式来执行此操作,则会变得更加有趣。


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

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

…替换为“论点一”、“论点二”等。


要从该文件读取并使用其内容(在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语言将null分隔的内容转换为eval安全的形式:

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("\0")][:-1]))
  '
}

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

其他回答

如果你所需要做的就是将文件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

在编辑了几次@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;命令;Done < input.file 3.传递给read命令的-r选项可防止反斜杠转义被解释。 4. 在read命令前添加IFS= option,以防止前导/尾随空格被修剪 5. if = read -r line;do COMMAND_on $lineDone < input.file


现在来回答这个现在已经结束的问题,我也有:它是否可能' git添加'一个文件的文件列表?-这是我的答案:

Note that FILES_STAGED is a variable containing the absolute path to a file which contains a bunch of lines where each line is a relative path to a file I'd like to do git add on. This code snippet is about to become part of the "eRCaGuy_dotfiles/useful_scripts/sync_git_repo_to_build_machine.sh" file in this project, to enable easy syncing of files in development from one PC (ex: a computer I code on) to another (ex: a more powerful computer I build on): https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.

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

引用:

我从哪里复制了我的答案:https://www.cyberciti.biz/faq/unix-howto-read-line-by-line-from-file/ 对于循环语法:https://www.cyberciti.biz/faq/bash-for-loop/

相关:

如何逐行读取文件的内容,并做git添加它:它是可能的' git添加'从一个文件的文件列表?

你可以使用反勾:

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

如果你的shell是bash, $(cat afile)的快捷方式是$(< afile),所以你可以这样写:

mycommand "$(< file.txt)"

bash手册页中的“命令替换”部分中有详细说明。

或者,让你的命令从stdin读取,这样:mycommand < file.txt

如果您希望以一种适用于所有可能的命令行参数(带有空格的值、带有换行符的值、带有文字引号的值、不可打印的值、带有glob字符的值等)的健壮方式来执行此操作,则会变得更加有趣。


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

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

…替换为“论点一”、“论点二”等。


要从该文件读取并使用其内容(在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语言将null分隔的内容转换为eval安全的形式:

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("\0")][:-1]))
  '
}

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