bash 脚本 - 根据另一个数组的值打印一个数组的值

bash 脚本 - 根据另一个数组的值打印一个数组的值

我有两个数组,想要根据 ARRAY1 中的适用值打印 ARRAY2 中的值。

#!/usr/bin/env bash

ARRAY1=(bb.service.sql bw.service.sql)
ARRAY2=(bb bw)

case $ARRAY1[@] in

  ${ARRAY1[1]})
    echo ${ARRAY2[1]} ;;

  *)
    echo "unknown" ;;
esac

不过我还是要到unknown这里了。我究竟做错了什么?

答案1

$ARRAY1${ARRAY1[0]}是in的缩写bash(从 ksh 复制的奇怪设计)。

$ARRAY1[@]与 相同${ARRAY[0]}[@],因此索引 0 的元素的值后跟一个文字[@]。虽然在许多语言和许多 shell 中(从 开始csh,第一个拥有数组的 shell),您可以$array[1]在 bash 中使用 , 索引数组,就像在 ksh 中一样,但您需要这样做${array[1]}。这样做是为了不破坏与没有数组的 Bourne shell 的向后兼容性。

${array[@]}将扩展到数组的所有元素,但这里由于case它仅匹配字符串,因此元素用空格连接,这就是case要匹配的内容。

另请注意,当您使用 分配数组时array=(foo bar)foo进入${array[0]},而不是 1 (与 ksh 中相同,但与大多数其他 shell 不同,包括该array=(values...)语法的来源 zsh。

无论如何,我不清楚你想用它做什么。

也许您想映射bbbb.service.sql,在这种情况下,您宁愿使用关联数组:

#! /bin/bash -
typeset -A map=(
  [bb]=bb.service.sql
  [bw]=bw.service.sql
)
first_parameter=${1?}
corresponding_sql=${map[$first_parameter]?}

?如果未设置变量,则会出错)。

相关内容