在 bash 脚本中我想执行以下操作:
script.sh < some_file
该some_file
文件有 1 个单行,我想将其作为参数传递给我的 bash script.sh
。我怎样才能做到这一点?
答案1
三种变化:
- 在命令行上传递文件的内容,然后在脚本中使用它。
- 在命令行上传递文件的文件名,然后从脚本中的文件中读取。
- 将文件的内容传递到标准输入,然后在脚本中读取标准输入。
将内容作为命令行参数传递:
$ ./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
使用read
shell 内置命令,您可以读取数据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