标签: array

BASH 关联数组打印

有没有办法在不遍历所有元素的情况下打印整个数组([key]=value)?

假设我创建了一个包含一些元素的数组:

declare -A array
array=([a1]=1 [a2]=2 ... [b1]=bbb ... [f500]=abcdef)
Run Code Online (Sandbox Code Playgroud)

我可以打印回整个数组

for i in "${!array[@]}"
do
echo "${i}=${array[$i]}"
done
Run Code Online (Sandbox Code Playgroud)

但是,似乎 bash 已经知道如何一次性获取所有数组元素 - 键${!array[@]}和值${array[@]}

有没有办法让 bash 在没有循环的情况下打印这个信息?

编辑:
typeset -p array这样做!
但是,我无法在一次替换中同时删除前缀和后缀:

a="$(typeset -p array)"
b="${a##*(}"
c="${b%% )*}"
Run Code Online (Sandbox Code Playgroud)

有没有更干净的方法来获取/打印输出的键=值部分?

bash array associative-array

26
推荐指数
3
解决办法
3万
查看次数

引用 bash 数组值时 [@] 和 [*] 之间有什么区别?

这个 Bash 指南说:

如果索引号是@*,则引用数组的所有成员。

当我这样做时:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
  echo "example.$i"
done
Run Code Online (Sandbox Code Playgroud)

它给出了想要的结果:

example.1
example.2
example.3
Run Code Online (Sandbox Code Playgroud)

但是当我使用时${LIST[*]},我得到

example.1 2 3
Run Code Online (Sandbox Code Playgroud)

反而。

为什么?

编辑:使用的时候printf@*实际做给了相同的结果。

bash array

25
推荐指数
2
解决办法
1万
查看次数

将 JSON 数组中的一个字段解析为 bash 数组

我有一个 JSON 输出,其中包含存储在变量中的对象列表。(我可能措辞不对)

[
  {
    "item1": "value1",
    "item2": "value2",
    "sub items": [
      {
        "subitem": "subvalue"
      }
    ]
  },
  {
    "item1": "value1_2",
    "item2": "value2_2",
    "sub items_2": [
      {
        "subitem_2": "subvalue_2"
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我需要数组中 item2 的所有值,以便在 ubuntu 14.04.1 上运行 bash 脚本。

我找到了很多方法来将整个结果放入一个数组中,而不仅仅是我需要的项目

bash ubuntu array shell-script json

23
推荐指数
3
解决办法
7万
查看次数

Bash - 反转数组

有没有一种简单的方法来反转数组?

#!/bin/bash

array=(1 2 3 4 5 6 7)

echo "${array[@]}"
Run Code Online (Sandbox Code Playgroud)

所以我会得到:7 6 5 4 3 2 1
而不是:1 2 3 4 5 6 7

bash array shell-script bash-array

23
推荐指数
8
解决办法
3万
查看次数

在 awk 中删除一个数组

在awk中,我可以用循环清空一个数组,使其成为空数组,相当于删除它。

for (key in array) delete array[key];
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法?我可以完全删除一个数组,以便变量名可以重新用于标量吗?

array awk

22
推荐指数
1
解决办法
2万
查看次数

Bash 中可能的错误?: foo() { echo "${var[0]}"; }; var=(bar baz) foo

操作系统:Ubuntu 16.04.3

外壳:Bash 4.3.48


我知道可以像 中那样临时更改变量的内容var=value command,这可能IFS= read -r var是最值得注意的情况。

而且,感谢 Greg 的 wiki,我也明白:

# Why this
foo() { echo "$var"; }
var=value foo

# And this does work
var=value; echo "$var"

# But this doesn't
var=value echo "$var"
Run Code Online (Sandbox Code Playgroud)

我不明白的是:

$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
Run Code Online (Sandbox Code Playgroud)

据我所知(并遵循前面示例的逻辑),它应该打印bar,而不是(bar baz).

这只会发生在我身上吗?这是预期的行为吗,我错过了什么?或者这是一个错误?

bash array

22
推荐指数
3
解决办法
2712
查看次数

jq - 将文件中的对象添加到 json 数组中

我想使用 jq 将一个包含元素和值的数组添加到现有的 json 文件中。

我已经有一个文件(input.json)

{
  "id": 9,
  "version": 0,
  "lastUpdTs": 1532371267968,
  "name": "Training"
}
Run Code Online (Sandbox Code Playgroud)

我想将它添加到另一个组数组中到这个 json (orig.json)

[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]
Run Code Online (Sandbox Code Playgroud)

最终结果应该是这样的

[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [
      {
        "id": 9,
        "version": 0,
        "lastUpdTs": 1532371267968,
        "name": "Training"
      }
    ],
    "displayName": …
Run Code Online (Sandbox Code Playgroud)

array json jq

18
推荐指数
2
解决办法
3万
查看次数

"${my_array[@]/#/-}" 中的 /#/- 是什么类型的操作?

数组转换为命令参数的公认答案使用以下 Bash 命令:

command "${my_array[@]/#/-}" "$1"
Run Code Online (Sandbox Code Playgroud)

我正试图弄清楚这/#/-部分到底是做什么的。不幸的是,我不知道该怎么称呼它,所以我很难找到任何文档。我已经浏览了有关数组和一些网站的 Bash 手册页部分,但找不到任何内容。

bash array

18
推荐指数
1
解决办法
930
查看次数

$path 和 $PATH(小写与大写)与 zsh 有什么区别?

FreeBSD 12 中,使用zshshell,我在查看$path(小写)和$PATH(大写)时注意到了这种差异。

echo $path
Run Code Online (Sandbox Code Playgroud)

/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin /usr/home/freebsd/bin

echo $PATH
Run Code Online (Sandbox Code Playgroud)

/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/home/freebsd/bin

一个输出由 SPACE 字符分隔,另一个由 COLON 字符分隔。

? 为什么会有差异?

这是两个不同的独立变量吗?还是小写/大写会触发某种我不知道的技巧或含义?

这是一个zsh功能吗?还是 FreeBSD 的一个特性?

zsh array path variable

18
推荐指数
1
解决办法
2161
查看次数

bash变量赋值中的单括号

我想知道 bash 中的单括号。我知道它们用于在子 shell 中执行命令以及它们用于创建数组,但它们是否用于其他任何用途?

引起我注意的一件事是,当您使用 in 变量赋值时,例如

var=(hello)
echo $var    # hello
Run Code Online (Sandbox Code Playgroud)

bash 不会产生错误或任何东西,并且输出与 if 相同

var=hello
Run Code Online (Sandbox Code Playgroud)

这两个变量定义相同还是有区别?

bash array

17
推荐指数
1
解决办法
8882
查看次数

标签 统计

array ×10

bash ×7

json ×2

shell-script ×2

associative-array ×1

awk ×1

bash-array ×1

jq ×1

path ×1

ubuntu ×1

variable ×1

zsh ×1