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

问题描述 投票:118回答:7

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

arg1
arg2
...
argN

我需要传递给命令my_command

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

linux unix shell command-line command-line-arguments
7个回答
179
投票

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

mycommand "$(< file.txt)"

在“命令替换”部分的bash手册页中记录。

另外,让你的命令从标准输入读取,所以:mycommand < file.txt


34
投票

如前所述,您可以使用反引号或$(cat filename)

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

a "b c" d

你将得到的论据是:

a
"b
c"
d

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

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

15
投票

你使用反引号来做到这一点:

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

14
投票
command `< file`

将文件内容传递给stdin上的命令,但会删除换行符,这意味着你不能单独迭代每一行。为此你可以用'for'循环编写一个脚本:

for i in `cat input_file`; do some_command $i; done

6
投票

如果你想以一种强大的方式做到这一点,这种方式适用于每个可能的命令行参数(带空格的值,带换行符的值,带有文字引号的值,不可打印的值,带有glob字符的值等),它会得到一些更有趣的。


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

printf '%s\0' "${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安全形式:

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 "$@"

5
投票

这是我如何将文件的内容作为参数传递给命令:

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

3
投票

在我的bash shell中,以下工作就像一个魅力:

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

其中input_file是

arg1
arg2
arg3

很明显,这允许你使用input_file中的每一行执行多个命令,这是我学习here的一个不错的小技巧。

© www.soinside.com 2019 - 2024. All rights reserved.