![bash 脚本 - 根据另一个数组的值打印一个数组的值](https://linux22.com/image/215824/bash%20%E8%84%9A%E6%9C%AC%20-%20%E6%A0%B9%E6%8D%AE%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E5%80%BC%E6%89%93%E5%8D%B0%E4%B8%80%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E5%80%BC.png)
我有两个数组,想要根据 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。
无论如何,我不清楚你想用它做什么。
也许您想映射bb
到bb.service.sql
,在这种情况下,您宁愿使用关联数组:
#! /bin/bash -
typeset -A map=(
[bb]=bb.service.sql
[bw]=bw.service.sql
)
first_parameter=${1?}
corresponding_sql=${map[$first_parameter]?}
(?
如果未设置变量,则会出错)。