首页 > 解决方案 > 将文件作为一个字符串参数传递给 bash 函数

问题描述

为了方便起见,我有一个包装java命令的 Bash 函数。该命令接受一个实际上是 JSON 并且可能有点大的参数,所以我更喜欢将它存储在一个多行文件中。

这是一个简化的例子。

Java 程序Test只是按原样打印出它的最后一个命令行参数,并带有 JSON 文件中的换行符和缩进。这有效:

$ java Test -s test "$(cat test.json)"
{
    "id": 123,
    "name": "Test"
}

现在我的 Bash 函数如下所示:

jwt() { java Test $@; }

当我现在使用cat“子命令”调用函数时,传递的参数被破坏:

$ jwt -s test "$(cat test.json)"
{
$ jwt -s test "`cat test.json`"
{

相同的命令行在zsh中工作,但我想学习如何使用bash来做到这一点。


另一个例子 - 而不是java我将只使用echo.

这有效:

$ echo "$(cat test.json)"
{
    "id": 123,
    "name": "Test"
}

重击功能:

e() { echo $@; }

调用它:

$ e "$(cat test.json)"
{ "id": 123, "name": "Test" }

令人惊讶的是,空白在这里被压缩为单个空格。想知道与 Java 有什么区别。

标签: bashshellcommand-line-arguments

解决方案


"$@"是一种特殊情况,可以按预期正确保留参数。

$ cat Foo.java
public class Foo {
  public static void main(String[] args) {
    for (String arg: args) {
      System.out.println("'"+arg+"'");
    }
  }
}

$ cat foo.sh
#!/bin/sh

foo() {
  java Foo "$@"
}

foo arg1 arg2 "arg 3"

$ sh foo.sh
'arg1'
'arg2'
'arg 3'

推荐阅读