将文件内容作为参数传递给 bash 脚本

将文件内容作为参数传递给 bash 脚本

在 bash 脚本中我想执行以下操作:

script.sh < some_file

some_file文件有 1 个单行,我想将其作为参数传递给我的 bash script.sh。我怎样才能做到这一点?

答案1

三种变化:

  1. 在命令行上传递文件的内容,然后在脚本中使用它。
  2. 在命令行上传递文件的文件名,然后从脚本中的文件中读取。
  3. 将文件的内容传递到标准输入,然后在脚本中读取标准输入。

将内容作为命令行参数传递:

$ ./script.sh "$(<some_file)"

脚本内部:

some_data=$1

$1将是第一个命令行参数的值。

如果数据太多(shell 必须执行的命令会变得太大),这将会失败。


传递文件名:

$ ./script.sh some_file

脚本内部:

some_data=$(<"$1")

或者

IFS= read -r some_data <"$1"

将标准输入连接到文件:

$ ./script.sh <some_file

脚本内部:

IFS= read -r some_data

这种方法的缺点是脚本的标准输入现在连接到some_file.然而,它确实为脚本用户提供了很大的灵活性,可以从文件或管道传递标准输入数据。

答案2

cat some_file | ./script.sh `xargs` 

答案3

为了避免担心 Bash shell 引用内容,请使用 xargs 通过参数按原样传递整个文件,甚至包括多行文件:

cat input-file | xargs -0 -I XX mycommand arg1 --foo XX arg3

XX我选择的占位符,可以是任何内容,只要它不出现在命令行中的任何位置(除了您想要input-file放置文本的位置)即可。

-0告诉 xargs 用空字符分隔输入文件,以便行结尾不用作分隔符。这样,整个文件就会作为单个参数传入(除非文件包含文本文件不应包含的空字符)。

既然您可以控制脚本,为什么不将文件名作为参数传递呢?

答案4

使用readshell 内置命令,您可以读取数据stdin并将读取的输入存储到 shell 变量中:

$ echo foo bar baz | read a b c
$ echo $a
foo
$ echo $b
bar
$ echo $c
baz

如您所见,read拆分被输入到字段中。输入的分割位置由变量决定$IFS输入字段分隔符)。通过设置$IFS为空值,输入分割被禁用,您可以将完整的行保存到一个变量中:

$ echo foo bar baz | IFS= read foo
$ echo $foo
foo bar baz

相关内容