标签: associative-array

如何为命令动态设置环境变量?

我想使用某种带有纯 bash 的简约模板引擎并且envsubst

\n
user@host:~$ env -i FOO=foo BAR="bar baz" envsubst \'$FOO,$BAR\' \\\n  <<< \'Hello "$FOO" and "$BAR"!\'\nHello "foo" and "bar baz"!\n
Run Code Online (Sandbox Code Playgroud)\n

以上有效,但仅包含静态变量。

\n

现在让我们假设环境变量是动态给出的,就像关联数组一样:

\n
declare -A MY_ENV=([FOO]=foo [BAR]="bar baz")\n
Run Code Online (Sandbox Code Playgroud)\n

解析数组键值对仅适用于没有空格的环境值(错误):

\n
env -i \\\n  $(for k in "${!MY_ENV[@]}"; do printf "%s=%s " $k "${MY_ENV[$k]}"; done) \\ \n  envsubst #...\n
Run Code Online (Sandbox Code Playgroud)\n

尝试用引号(用 note \'%s\' 代替%s )括起环境值也会出错:

\n
env -i \\\n  $(for k in "${!MY_ENV[@]}"; do printf "%s=\'%s\' " $k "${MY_ENV[$k]}"; done) \\ \n  envsubst …
Run Code Online (Sandbox Code Playgroud)

bash environment-variables associative-array template

6
推荐指数
1
解决办法
2427
查看次数

在 ZSH 中,如何取消设置任意关联数组元素?

我拥有的关联数组具有任意键,包括包含反引号、方括号等的键:

$ typeset -A arr
$ key='`'
$ arr[$key]=backquote
$ echo $arr[$key]
backquote
Run Code Online (Sandbox Code Playgroud)

我现在需要取消设置arr[$key]。通过网络查看,我尝试了:

$ unset "arr[$key]"
unset: arr[`]: invalid parameter name
$ unset "arr[${(b)key}]"
unset: arr[`]: invalid parameter name
Run Code Online (Sandbox Code Playgroud)

……没有运气。现在,我有点幸运,因为这提供了一条错误消息;在以下情况下,除了结果之外似乎没有任何失败:

$ typeset -A arr
$ key='?~>#'
$ arr[$key]=symbols
$ echo "$arr[$key]"
symbols
$ unset "arr[${(b)key}]"
$ echo "$arr[$key]"
symbols
Run Code Online (Sandbox Code Playgroud)

事实上, 中的任何符号?~>#都会触发相同的行为。

关于正在发生的事情以及如何获得预期行为的任何澄清?

注意:这个问题与 ZSH 邮件列表上的几个主题相关,标题与这个问题相似(这里那里)。

zsh associative-array

5
推荐指数
1
解决办法
237
查看次数

Bash:当使用日期作为数组键时,值对于 base 来说太大了

我已经阅读了有关指定“10#”的内容,但我认为这不是我的情况,因为我没有进行数字比较。我正在尝试在 Bash 中创建一个关联数组,直到今天(2021-02-08)代码都运行良好:

dailyData["$today"]="$todayData"
Run Code Online (Sandbox Code Playgroud)

$today 是 ISO 格式的一天, $todayData 不相关。
我收到错误2021-02-08: value too great for base (error token is "08")

为什么 Bash 将此日期格式解释为数字,其中任意字符串即可完成工作(关联数组键)?
如果我只想使用“08”作为字典键怎么办?

bash string associative-array

5
推荐指数
2
解决办法
1064
查看次数

在 Zsh 中的关联数组中设置带空格的键

在 Bash(4 或更高版本)中,如果我有一个关联数组dict,我可以设置它的值,dict[apple count]=1并且我可以使用${dict[apple count]}. Zsh 是否允许键名中有空格?dict[apple count]=1在 Zsh 中不起作用,所以我猜 Zsh 对此有不同的语法。dict["apple count"]=1不做我想做的事;它不是apple count用作键,而是使用"apple count"引号作为键的一部分。

zsh associative-array

5
推荐指数
2
解决办法
256
查看次数

Bash 从一个函数返回一个关联数组,然后将该关联数组传递给其他函数

我正在尝试从通过 arg 传入的列表中的函数中构建关联数组,但它不起作用:

#!/usr/bin/env bash



function cwd {
  echo "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
}


function list_commands {
  local root="$1"
  local command_list="${*:2}"
  declare -A cmds
  for cmd in $command_list; do
    cmds["#{$cmd}"]+="$root/scripts/displays/$cmd.sh #{pane_current_path} #{pane_id}"
  done
  echo "$cmds"
}

PLUGIN_ROOT_DIR="$(cwd)"

declare -A cmds=$(list_commands "$PLUGIN_ROOT_DIR" "rbenv_ruby_ver githud")

main "$cmds"
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做,bash 脚本不是我的强项(虽然我在这方面做得越来越好)

我该怎么做才能完成这项工作?

请记住,这将作为 tpm tmux 插件的一部分在 tmux 中执行。

shell associative-array bash-functions

4
推荐指数
1
解决办法
5961
查看次数

按 bash 中的插入映射排序

bash 中是否有有序(通过插入)映射?

我知道bash 中有一个关联数组数据结构,但是在对其进行迭代时,元素的顺序不是插入顺序。下面举例。

我想按插入顺序排列地图。

关联数组不保留插入顺序:

declare -A REPLACE_MAP
REPLACE_MAP['b']='2'
REPLACE_MAP['a']='1'
for key in "${!REPLACE_MAP[@]}"; do
    echo "$key - ${REPLACE_MAP["$key"]}"
    value=${REPLACE_MAP["$key"]}
done
Run Code Online (Sandbox Code Playgroud)

结果:

a - 1
b - 2
Run Code Online (Sandbox Code Playgroud)

我想要一个将产生以下结果的数据结构:

b - 2
a - 1
Run Code Online (Sandbox Code Playgroud)

bash array shell-script associative-array

3
推荐指数
1
解决办法
5750
查看次数

基于另一个关联数组制作关联数组

我制作了一个关联数组,如下所示。为了提供一些详细信息,键是指特定文件,因为我将在较大脚本的上下文中使用此数组(其中包含文件的目录将是 getopts 参数)。

declare -A BAMREADS
echo "BAMREADS array is initialized"

BAMREADS[../data/file1.bam]=33285268
BAMREADS[../data/file2.bam]=28777698
BAMREADS[../data/file3.bam]=22388955

echo ${BAMREADS[@]}  # Output: 22388955 33285268 28777698
echo ${!BAMREADS[@]} # Output: ../data/file1.bam ../data/file2.bam ../data/file3.bam
Run Code Online (Sandbox Code Playgroud)

到目前为止,这个数组的行为似乎符合我的预期。现在,我想基于这个数组构建另一个关联数组。具体来说:我的第二个数组将具有与第一个相同的键,但我想将这些值除以名为 $MIN 的变量。

我不确定以下哪种策略是最好的,而且我似乎无法使任何一种工作。

策略1:复制数组并修改数组?

MIN=33285268

declare -A BRAMFRACS
echo "BAMFRACS array is initialized"
BAMFRACS=("${BAMREADS[@]}")

echo ${BAMFRACS[@]}  # Output: 22388955 33285268 28777698
echo ${!BAMFRACS[@]} # Output: 0 1 2
Run Code Online (Sandbox Code Playgroud)

这不是我想要的钥匙。即使它有效,我也需要对所有值执行我提到的操作。

策略 2:在循环第一个数组时构建第二个数组。

MIN=33285268

declare -A BRAMFRACS
echo "BAMFRACS array is initialized"

for i in $(ls $BAMFILES/*bam)
do
    echo $i
    echo …
Run Code Online (Sandbox Code Playgroud)

bash associative-array

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

linux bash字典检查是否为空

如何检查字典(关联数组)是否为空?我只是使用declare -A dict. 我想知道它是否刚刚声明但没有任何密钥。

bash shell-script associative-array

3
推荐指数
1
解决办法
7478
查看次数

How can i use a parameter as an inner array-name to my script?

When i write a script named array_call_self.sh as follows

#!/bin/bash
declare -A num word
word=(
 [a]='index_a'
 [b]='index_b'
 [c]='index_c'
)
num=(
 [a]=1
 [b]=2
 [c]=3
)
array=${$1[@]}
for i in ${$array[@]};do
  echo $i
done
Run Code Online (Sandbox Code Playgroud)

when i run bash array_call_self.sh word it return me

test.sh: line 13: ${$1[@]}: bad substitution
test.sh: line 14: ${$array[@]}: bad substitution
Run Code Online (Sandbox Code Playgroud)

bash variable associative-array

3
推荐指数
1
解决办法
120
查看次数

awk 中数组的重复条目

我有一个包含 4 列的文件。当我将这 4 列放入一个数组中并用作NR索引时,这些条目会以某种方式重复。有关该问题的详细说明,请参阅下文。

文件的前 5 行如下所示

-bash-4.2$ cat -ve file | head -n 5
chr start end p$
13 59341171 59343427 1.86642E-18$
10 72886545 72888679 1.13636E-09$
16 81900987 81902805 6.79697E-09$
1 46797890 46800143 2.24436E-08$
Run Code Online (Sandbox Code Playgroud)

我将每一行指定为由 索引的数组的条目NR,然后数组的打印输出如下所示(以前 5 行为例):

-bash-4.2$ awk 'NR<6 {a[NR]=$0; 
>                     for(x in a)
>                     print x, a[x]}' file
1 chr start end p
1 chr start end p
2 13 59341171 59343427 1.86642E-18
1 chr start end p
2 13 59341171 …
Run Code Online (Sandbox Code Playgroud)

awk associative-array

3
推荐指数
1
解决办法
194
查看次数