标签: array

将条目添加到关联数组时出现“错误的数组下标”错误

我想我最好为此开始一个新的查询,因为我原来的查询已得到完全解答(谢谢!)。

我有两个文件,它们都是 postgresql 命令的输出。第一个 (/tmp/inventory.list) 是我原始查询使用 bash arrays 将表转换为 ini 文件的主题,为此我使用 @choroba 善意建议的 array 命令。鉴于我的第二个文件(/tmp/inventory2.list)的格式与第一个文件非常相似,我认为我可以调整数组脚本来类似地处理这个文件,但我显然把一些事情搞砸了。

我的输入文件 /tmp/inventory2.list 的格式为:

environment1 | hostname1.environment1.domain
environment1 | hostname2.environment1.domain
environment1 | hostname3.environment1.domain
environment2 | hostname4.environment2.domain
environment2 | hostname5.environment2.domain
environment3 | hostname6.environment3.domain
Run Code Online (Sandbox Code Playgroud)

必须以分组格式读入并写入另一个文件:

[environment1]
hostname1.environment1.domain
hostname2.environment1.domain
hostname3.environment1.domain

[environment2]
hostname4.environment2.domain
hostname5.environment2.domain

[environment3]
hostname6.environment3.domain
Run Code Online (Sandbox Code Playgroud)

环境分组之间必须有行空间,组名称必须按字母顺序显示,主机名必须在组内按字母顺序排序。每个环境组可能有多个主机名,但每个组只能显示一次。

让事情变得复杂的是,输入文件末尾有一个空行,我无法让我的 postgresql 查询省略它(-t 或 --tuples-only 删除通常写在末尾的行计数行,但不会' t 删除最后一个空行),因此需要将其删除并且不写入新的输出文件。

我尝试调整 @choroba 的数组命令来读取此文件并正确输出它,但是尽管它对于我的第一个文件完美地工作,但我的调整不起作用。我有:

  1 #! /bin/bash
  2
  3 unset -v envs
  4 unset -v hosts
  5 declare -A envs
  6 declare -A hosts …
Run Code Online (Sandbox Code Playgroud)

bash array

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

使用现有数组中的唯一值创建新数组

我正在尝试根据另一个数组中的唯一值创建一个新的变量数组,但没有得到所需的结果。

原始数组

# echo ${owner[*]}
390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 0a452389-5ed2-e46f-ad15-cc538c82650d 4232f23d-ed48-4b14-c0ea-aa911fd24920 8ee1b05f-2473-4c37-bfc5-ae393921b939
Run Code Online (Sandbox Code Playgroud)

我正在使用的命令

uniq=($(printf "%s\n" "${owner[@]}" | sort -u))
Run Code Online (Sandbox Code Playgroud)

问题(它将所有唯一值存储为索引 0 下的单个值)

# echo ${uniq[0]}
0a452389-5ed2-e46f-ad15-cc538c82650d
390920ad-2858-e651-a4af-a9eaa6acaebb
4232f23d-ed48-4b14-c0ea-aa911fd24920
8ee1b05f-2473-4c37-bfc5-ae393921b939
e14c2413-7179-44f8-dfc3-b8624dcb10bb
# echo ${uniq[1]}

#
Run Code Online (Sandbox Code Playgroud)

有人知道从该数组中获取唯一值的更好方法吗?

在 SmartOS 上使用 bash(类似于 Solaris)

编辑

我也尝试了以下方法,它将每个值存储在它自己的索引号下,但它不会删除重复的值:

uniq=($(printf "%s " "${owner[@]}" | sort -u))
Run Code Online (Sandbox Code Playgroud)

bash array

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

Zsh,不使用 eval 的间接数组变量赋值

我有一个变量VARNAME,其中包含另一个变量的名称。我想在不使用 的情况下分配给另一个变量eval。我怎样才能做到这一点?

我不想使用的原因eval如下。首先假设一个用于前置变量的函数foo

% prepend_foo() { foo=("$@" $foo) }
% foo=(1 2)
% print -l $foo
1
2
% prepend_foo x 'a b c' y
% print -l $foo
x
a b c
y
1
2
%
Run Code Online (Sandbox Code Playgroud)

现在考虑一个附加到任何变量的通用函数:

% prepend() { var=$1; shift; eval "$var=($@ ${(P)var})" }
% foo=(1 2)
% print -l $foo
1
2
% prepend foo x 'a b c' y
% print -l $foo
x
a
b
c …
Run Code Online (Sandbox Code Playgroud)

zsh array function variable

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

循环输入并在 bash 中执行命令的通用函数?

我试图创建一个循环输入并执行命令的函数 - 无论它们如何分隔。

function loop {
    # Args
    #     1: Command
    #     2: Inputs
    for input in "$2" ; do                     
        $1 $input
    done
}
Run Code Online (Sandbox Code Playgroud)
declare -a arr=("1" "2" "3")

$ loop echo "$arr[@]"
1

$ loop echo 1 2 3
1

$ loop echo $arr
1
Run Code Online (Sandbox Code Playgroud)

然而,根据这个答案,for .. in ..适用于数组:

for item in "${arr[@]}" ; do
   echo "$item"
done
Run Code Online (Sandbox Code Playgroud)

它也适用于空格分隔的值:

for item in 1 2 3 ; do
   echo "$item"
done
Run Code Online (Sandbox Code Playgroud)

简而言之,我如何在传递参数时获得"${arr[@]}"和的效果。1 2 …

bash array function

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

如何按修改日期对 zsh 数组进行排序?

如何按修改日期对 zsh 数组进行排序?

files=( ~/a ~/b ~/c )
# how to sort files by date?
Run Code Online (Sandbox Code Playgroud)

PS:这是我的确切用例,(fz几乎fzf

v () {
 local files
 files=() 
 command rg '^>' ~/.viminfo | cut -c3- | while read line
 do
  [ -f "${line/\~/$HOME}" ] && files+="$line" 
 done
 test -f ~/.emacs.d/.cache/recentf && {
  command rg --only-matching --replace '$1' '^\s*"(.*)"$' ~/.emacs.d/.cache/recentf | while read line
  do
   [ -f "$line" ] && files+="$line" 
  done
 }
 files="$(<<<"${(F)files}" fz --print0 --query "$*")"  || return 1
 files="${files//\~/$HOME}" 
 local …
Run Code Online (Sandbox Code Playgroud)

zsh array date sort files

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

通过将其名称作为变量引用来检索 bash 数组

我需要有关 bash 扩展的帮助。
我想检索数组值,GNU bash 5.1.0。数组名称应该是一个变量。“只是”引用 bash 中的变量。

我有一个名为“armin”的数组,其名称位于变量 $gral 中(工作正常):

gral="armin"
Run Code Online (Sandbox Code Playgroud)

赋值:

declare -a ${gral}[1]="milk"
declare -a ${gral}[2]="cow"
declare  ${gral}[7]="budgie"
declare  ${gral}[9]="pla9ne"
Run Code Online (Sandbox Code Playgroud)

美好的。

数组存在:

$ echo ${armin[@]}
milk cow budgie pla9ne
Run Code Online (Sandbox Code Playgroud)

数组索引存在:

$echo ${!armin[@]}
1 2 7 9
Run Code Online (Sandbox Code Playgroud)

数组和索引都很好。

我想通过引用数组的名称作为变量来检索数组,而不是手动。有很多...
变量之前已设置和使用:

$ echo $gral
armin  ## name of our bash array
Run Code Online (Sandbox Code Playgroud)

很好——到目前为止。

只是为了显示差异而不使用变量:

echo ${armin[@]}
milk cow budgie pla9ne
Run Code Online (Sandbox Code Playgroud)

现在尝试引用变量(gral)来调用名称(armin):

$ echo ${$gral[@]}
-bash: ${$gral[@]}: wrong substitution.

$echo ${"$gral"[@]}
-bash: ${"$gral"[@]}: wrong substitution.
echo ${"gral"[@]}
-bash: ${"gral"[@]}: …
Run Code Online (Sandbox Code Playgroud)

bash array reference

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

${array[*]} 和 ${array[@]} 有什么区别?什么时候使用其中一种而不是另一种?

使用以下代码:

#! /bin/bash                         
                                     
declare -a arr=("element1"           
                "element2" "element3"
                "element4" )         
echo "1"                             
echo "${arr[@]}"                     
                                     
echo "2"                             
echo ${arr[*]}                       
Run Code Online (Sandbox Code Playgroud)

输出是:

1
element1 element2 element3 element4
2
element1 element2 element3 element4
Run Code Online (Sandbox Code Playgroud)

所以输出是一样的。

那么什么时候强制使用一种方法而不是另一种方法呢?

bash array shell-script bash-array

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

将制表符分隔的条目传递给 readarray

显然我做得不对,但我认为预期的结果很明确(${#arr[@]}=3)

$ readarray -d "\t" arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}"
> 1
Run Code Online (Sandbox Code Playgroud)

shell array

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

Cut 或 Awk 在 bash 中保存数组中的行

我有一个场景,我必须将文件 .txt 的行放入数组中,文件内容的示例;

 type of host
 |
 |   first host
 |   |
 |   | second host
 |   | |     
 |   | |     same ip address 
 |   | |     |
HOST_A_B=192.168.0.1
Run Code Online (Sandbox Code Playgroud)

我必须把它放在 bash 的数组中

    #echo $Array[0]
    HOST_A=192.168.0.1
    #echo $Array[1]
    HOST_B=192.168.0.1
Run Code Online (Sandbox Code Playgroud)

有时这些线路没有第二个主机,例如

HOST_A_B=192.168.0.1
HOST_C=192.168.0.2
HOST_DEF_G=192.168.0.3
Run Code Online (Sandbox Code Playgroud)

echo 命令输出应该如下所示:

    #echo $Array[1]
    HOST_A=192.168.0.1
    #echo $Array[2]
    HOST_B=192.168.0.1
    #echo $Array[3]
    HOST_C=192.168.0.2
    #echo $Array[4]
    HOST_DEF=192.168.0.3
    #echo $Array[5]
    HOST_G=192.168.0.3
Run Code Online (Sandbox Code Playgroud)

任何想法?

bash array awk cut

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

是否可以将 bash 数组作为参数传递给函数?

我想将数组传递给 bash 函数,但出现bad substitution错误

例子


mapfile -t ray < <(parallel -j 0 echo ::: {1..10})

declare -p ray

declare -a ray=([0]="2" [1]="1" [2]="3" [3]="4" [4]="5" [5]="6" [6]="7" [7]="8" [8]="9" [9]="10")

arrLen() {
  echo "${#$1[@]}"
 }

arrLen ray

-bash: ${#$1[@]}: bad substitution

Run Code Online (Sandbox Code Playgroud)

那么是否不可能将参数传递给 bash 数组呢?

bash array

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

标签 统计

array ×10

bash ×7

function ×2

zsh ×2

awk ×1

bash-array ×1

cut ×1

date ×1

files ×1

reference ×1

shell ×1

shell-script ×1

sort ×1

variable ×1