有没有办法在不遍历所有元素的情况下打印整个数组([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)
有没有更干净的方法来获取/打印输出的键=值部分?
如果索引号是
@或*,则引用数组的所有成员。
当我这样做时:
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,@和*实际做给了相同的结果。
我有一个 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 脚本。
我找到了很多方法来将整个结果放入一个数组中,而不仅仅是我需要的项目
有没有一种简单的方法来反转数组?
#!/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
在awk中,我可以用循环清空一个数组,使其成为空数组,相当于删除它。
for (key in array) delete array[key];
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法?我可以完全删除一个数组,以便变量名可以重新用于标量吗?
操作系统: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).
这只会发生在我身上吗?这是预期的行为吗,我错过了什么?或者这是一个错误?
我想使用 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) Run Code Online (Sandbox Code Playgroud)command "${my_array[@]/#/-}" "$1"
我正试图弄清楚这/#/-部分到底是做什么的。不幸的是,我不知道该怎么称呼它,所以我很难找到任何文档。我已经浏览了有关数组和一些网站的 Bash 手册页部分,但找不到任何内容。
在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 的一个特性?
我想知道 bash 中的单括号。我知道它们用于在子 shell 中执行命令以及它们用于创建数组,但它们是否用于其他任何用途?
引起我注意的一件事是,当您使用 in 变量赋值时,例如
var=(hello)
echo $var # hello
Run Code Online (Sandbox Code Playgroud)
bash 不会产生错误或任何东西,并且输出与 if 相同
var=hello
Run Code Online (Sandbox Code Playgroud)
这两个变量定义相同还是有区别?