bash - 如何将 Bash 数组偏移量与默认值结合起来?

标签 bash

我所追求的是拥有最紧凑的表达式,该表达式将特殊参数 @ 的偏移量扩展为 2 或扩展为默认值 foob​​ar 如果下标扩展为空字符串或 null。我尝试了以下符号但没有运气:

"$@:2:-foobar"
"${@:2:-foobar}"
"${@:2: -foobar}"

有这么紧凑的符号吗?或者,什么是类似的解决方案;理想情况下没有临时变量?

最佳答案

您可以组合第二个参数或其默认值的扩展,然后是下一个偏移量的扩展。

假设你的数组是程序或函数的参数数组$@ 那么,

#!/bin/bash

echo A "${@:2}"             
echo B "${@:2:}"            # your attempt #1
echo C "${@:2-foobar}"      # your attempt #2
echo D "${@:2: -foobar}"    # your attempt #3
echo E "${2:-foobar}"
echo F "$1" "${2:-foobar}" ${@:3}

G=("$1" "${2:-foobar}" ${@:3})
echo G "${G[@]}"

将为 F 行和 G 行产生所需的结果(尽管 G 使用临时变量)。

例如:

$ bash expand.sh 1
A
B
C
D
E foobar
F 1 foobar
G 1 foobar

$ bash expand.sh 1 2 3 4
A 2 3 4
B
C 2 3 4
D
E 2
F 1 2 3 4
G 1 2 3 4

如果您尝试使用与“$@”不同的数组来执行此操作,例如 H=(1 2 3),为索引扩展提供默认值 ("${H [2]:-foobar}") 似乎不起作用。在这种情况下,假设您不想引入临时变量,最好的办法是使用函数或 eval。但在这一点上,你可能最好只添加一个条件,例如,

# assuming that H wasn't sparse. redefine H based on its values
H=(
   "${H[0]}"
   $([[ -n "${H[1]}" ]] && echo "${H[1]}" || echo "foobar")
   ${H[@]:2}
  )

但是,可读性会受到影响。

关于bash - 如何将 Bash 数组偏移量与默认值结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29615980/

相关文章:

bash - awk 命令获取进程名称

bash - 如何在gradle构建脚本中添加bash和shell脚本目录路径?

linux - Hadoop/Hive 命令在 Crontab 中不起作用

bash - 有没有办法测试目录内容是否只是因为挂载而存在?

bash - 当 find 在路径中间使用通配符时删除目录

bash - Bash 脚本的变量语法错误(作业)

bash - sed:用文件内容替换一系列文本

bash - 如何获得命令运行所需的总时间?

mysql - 用分号替换文件中的最后一个换行符

linux - Docker 将程序作为守护进程运行