我想使用某种带有纯 bash 的简约模板引擎并且envsubst:
user@host:~$ env -i FOO=foo BAR="bar baz" envsubst \'$FOO,$BAR\' \\\n <<< \'Hello "$FOO" and "$BAR"!\'\nHello "foo" and "bar baz"!\nRun Code Online (Sandbox Code Playgroud)\n以上有效,但仅包含静态变量。
\n现在让我们假设环境变量是动态给出的,就像关联数组一样:
\ndeclare -A MY_ENV=([FOO]=foo [BAR]="bar baz")\nRun Code Online (Sandbox Code Playgroud)\n解析数组键值对仅适用于没有空格的环境值(错误):
\nenv -i \\\n $(for k in "${!MY_ENV[@]}"; do printf "%s=%s " $k "${MY_ENV[$k]}"; done) \\ \n envsubst #...\nRun Code Online (Sandbox Code Playgroud)\n尝试用引号(用 note \'%s\' 代替%s )括起环境值也会出错:
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) 我拥有的关联数组具有任意键,包括包含反引号、方括号等的键:
$ 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)
事实上, 中的任何符号?~>#都会触发相同的行为。
关于正在发生的事情以及如何获得预期行为的任何澄清?
我已经阅读了有关指定“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(4 或更高版本)中,如果我有一个关联数组dict,我可以设置它的值,dict[apple count]=1并且我可以使用${dict[apple count]}. Zsh 是否允许键名中有空格?dict[apple count]=1在 Zsh 中不起作用,所以我猜 Zsh 对此有不同的语法。dict["apple count"]=1不做我想做的事;它不是apple count用作键,而是使用"apple count"引号作为键的一部分。
我正在尝试从通过 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 中执行。
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) 我制作了一个关联数组,如下所示。为了提供一些详细信息,键是指特定文件,因为我将在较大脚本的上下文中使用此数组(其中包含文件的目录将是 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) 如何检查字典(关联数组)是否为空?我只是使用declare -A dict. 我想知道它是否刚刚声明但没有任何密钥。
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) 我有一个包含 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)