标签: bash-array

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万
查看次数

使用分隔符时如何删除readarray添加的新行?

VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
Run Code Online (Sandbox Code Playgroud)

结果:

[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
Run Code Online (Sandbox Code Playgroud)

我怎么能告诉readarray不要添加最后的换行符\n?最新的$符号是什么意思?

bash bash-array

15
推荐指数
2
解决办法
3431
查看次数

Bash 4.4 本地只读数组变量范围:bug?

使用 bash 4.4.20(1) 运行以下脚本时失败

#!/bin/bash
bar() {
  local args=("y")
}

foo() {
  local -r args=("x")
  bar
}

foo
Run Code Online (Sandbox Code Playgroud)

有错误,但使用 bash 4.2.46(2) 运行时成功,这在阅读24.2line 3: args: readonly variable后有意义。局部变量

以下带有非数组变量的脚本运行时没有任何问题:

#!/bin/bash
bar() {
  local args="y"
}

foo() {
  local -r args="x"
  bar
}

foo
Run Code Online (Sandbox Code Playgroud)

我找不到任何可以解释 bash 4.2.46(2) 和 bash 4.4.20(1) 之间差异的更改

问:这是 bash 4.4.20(1) 中的错误吗?如果这是预期的行为那么为什么第二个脚本不会失败?

bash shell-script bash-array

7
推荐指数
1
解决办法
358
查看次数

在 zsh 脚本中查找数组长度

有没有办法*在 zsh 中查找数组(文件名)的长度,而不使用 for 循环来增加某些变量?

我天真地尝试过,echo ${#*[@]} 但没有成功。(也欢迎 bash 语法)

bash zsh shell-script bash-array

6
推荐指数
2
解决办法
7846
查看次数

如何将多个结果通过管道传输到一个命令中?

我有一段可以工作的代码,如下所示(请注意,这是用于 AWS 自动部署的 CloudFormation 模板):

EFS_SERVER_IPS_ARRAY=( $(aws efs describe-mount-targets --file-system-id ${SharedFileSystem} | jq '.MountTargets[].IpAddress' -r) )
echo "IPs in EFS_SERVER_IPS_ARRAY:"
for element in "${EFS_SERVER_IPS_ARRAY[@]}"
do
    echo "$element"
    echo "$element $MOUNT_SOURCE" >> /etc/hosts
done
Run Code Online (Sandbox Code Playgroud)

这有效,但看起来很难看。我想避免数组变量和for循环(基本上我不关心第一个 echo 命令)。

我可以以某种方式使用输出($element,它是 1 个或更多,目前是 2 行 IP)并将其汇集到两个执行中,例如:

long AWS command >> echo $element $MOUNT_SOURCE  >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)

在当前的实现中,echo 执行的次数与数组中的变量一样多?我将如何重写这个?

AWS 命令​​的输出是这样的:

10.10.10.10
10.22.22.22
Run Code Online (Sandbox Code Playgroud)

然后,添加的行/etc/hosts如下所示:

10.10.10.10  unique-id.efs.us-east-1.amazonaws.com
10.22.22.22  unique-id.efs.us-east-1.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

bash shell-script aws bash-expansion bash-array

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

如何将数组作为函数参数传递但带有其他额外参数?

以下后期解决方案按预期工作:

因此 - 从他的回答来看:

function copyFiles() {
   arr=("$@")
   for i in "${arr[@]}";
      do
          echo "$i"
      done

}

array=("one 1" "two 2" "three 3")

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

写这篇文章的原因是如果发生以下情况怎么办:

copyFiles "${array[@]}" "Something More"
copyFiles "Something More" "${array[@]}"
Run Code Online (Sandbox Code Playgroud)

问题:我确实意识到发送的参数,当收到它们时,函数中的参数如何 - 它们实际上是合并的 - 所以$1并且$2不再按预期工作,“数组”参数与其他参数集成

我已经做了一项研究:

遗憾的typeset -n不起作用

并在:

无法预期工作 - 在该答案中,有一条评论表明存在问题 - 带有演示测试/验证的链接 - 关于${#array[@]}函数内的数组大小 ( ) 不同。

那么如何实现这个目标呢?

shell bash array shell-script bash-array

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

Bash 在基于字符串的超时选项规范上读取内置错误,而不是基于数组的超时选项规范。为什么?

在阅读fff的源代码以了解有关 Bash 编程的更多信息时,我看到一个超时选项read作为数组传递给这里

read "${read_flags[@]}" -srn 1 && key "$REPLY"
Run Code Online (Sandbox Code Playgroud)

的值read_flags设置如下

read_flags=(-t 0.05)
Run Code Online (Sandbox Code Playgroud)

read因此,预期的调用是read -t 0.05 -srn 1)。

我不太明白为什么不能使用字符串,即:

read_flags="-t 0.05"
read "$read_flags" -srn 1 && key "$REPLY"
Run Code Online (Sandbox Code Playgroud)

这种基于字符串的方法会导致“无效的超时规范”。

经过调查,我想出了一个测试脚本parmtest

show() {
  for i in "$@"; do printf '[%s]' "$i"; done
  printf '\n'
}

opt_string="-t 1"
opt_array=(-t 1)

echo 'Using string-based option...'
show string "$opt_string" x y z
read "$opt_string"
echo
echo 'Using array-based …
Run Code Online (Sandbox Code Playgroud)

bash shell-script quoting shell-builtin bash-array

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

查找数组中的第二大值

我有一个这样的数组:

array=(1 2 7 6)
Run Code Online (Sandbox Code Playgroud)

并想搜索第二大值,输出为

secondGreatest=6
Run Code Online (Sandbox Code Playgroud)

有没有办法在 bash 中做到这一点?

bash bash-array

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

${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
查看次数

如何从数组数组中选择要循环的数组?

#!/usr/bin/bash\n\n\nARGENT=("Nous devons \xc3\xa9conomiser de l'argent."\n"Je dois \xc3\xa9conomiser de l'argent.")\n\nBIENETRE=("Comment vas-tu?" "Tout va bien ?")\n\naoarrs=("${ARGENT}" "${BIENETRE}")\n\nselect arr in "${aoarrs[@]}"; do\n  for el in "${arr[@]}"; do\n    echo "$el"\n  done\n  break\ndone \n\n
Run Code Online (Sandbox Code Playgroud)\n

我希望此脚本将数组名称打印给用户,ARGENT并且BIENETRE\n以便用户可以选择其中之一。用户输入后,脚本将打印所选数组的每个元素。我想从数组的数组 ( ) 中选择select一个数组来循环aoarrs。我想使用 select 的原因是因为在现实世界中,我的数组数组中可能不止两个数组。我怎样才能做到这一点?

\n

bash select bash-array

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