bash - 将文件作为一个字符串参数传递给 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 有什么区别。
解决方案
"$@"
是一种特殊情况,可以按预期正确保留参数。
$ 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'
推荐阅读
- java - 如何从数据库(SQL)中读取 Json 并将其转换为 java 类?
- javascript - 包含括号作为键值的 JSON 文件
- php - Laravel Media - 插入水印(快速管理面板)
- android - 单击推送通知时在导航图中打开特定的片段目的地,并且图表不在启动器活动中
- python - 具有灰度图像的卷积神经网络
- reactjs - 使用谷歌选择器只显示共享驱动器
- android - 在 Android 应用中升级 Xamarin.Forms
- c# - 在 Bootstrap 多选中预设 SelectListItems.Selected
- php - 仅在满足条件时从 api 结果中获取值
- php - Laravel 在 Validator() 中使用 2 个唯一字段