如何通过在命令行中提及变量值的某些部分来使用完整变量值

如何通过在命令行中提及变量值的某些部分来使用完整变量值

我想创建一个脚本,在其中我可以通过在参数中提及变量字符串的某些部分来使用变量,例如:

#!/bin/bash

ipv4_5784_4679=1.1.1.1
ipv4_7838_7782_8987=2.2.2.2

echo "Ip of the port is = value"

我想做的就像运行脚本一样,
./script.sh 5784 输出应该是

Ip of the port is = 1.1.1.1

./script.sh 7782 输出应该是

Ip of the port is = 2.2.2.2

但如果字符串按原样出现,84_46, _7838, 838_它就会抛出错误。

实际上我正在尝试创建一个脚本,我不想记住该虚拟机的IP,我的所有应用程序都在具有不同端口的不同虚拟机上运行

我尝试在谷歌上搜索,但不幸的是我是脚本编写新手,我不确定要搜索什么,所以无法获得任何具体结果

答案1

这里的关键概念是以有利于您要对其执行的操作的形式存储数据。

我的建议是关联数组:

#!/usr/bin/env bash

declare -A ips=(
  [ipv4_5784_4679]=1.1.1.1
  [ipv4_5784_4680]=1.1.1.2
  [ipv4_7838_7782_8987]=2.2.2.2
)

readarray -t idx < <(printf '%s\n' "${!ips[@]}" | grep -E "_$1($|_)")

printf '%d match(es) found\n' ${#idx[@]}
for i in "${idx[@]}"
do
        printf 'IP of %s is %s\n' "$i" "${ips[$i]}"
done

此代码将主机到 IP 的查找表存储在一个数组中ips,其中路由器字符串是数组元素的索引,IP 号是数组元素的值。对于命令行上给定的参数,脚本通过实用程序$1传递索引列表以创建一个包含所有匹配的索引的数组。脚本的输出是找到的索引数量以及每个索引及其对应值的值对。"${!ips[@]}"grep${idx[@]}$1${#idx[@]}

输出:

$ ./test.sh 7838
1 match(es) found
IP of ipv4_7838_7782_8987 is 2.2.2.2
$ ./test.sh 7782
1 match(es) found
IP of ipv4_7838_7782_8987 is 2.2.2.2
$ ./test.sh 4679
1 match(es) found
IP of ipv4_5784_4679 is 1.1.1.1
$ ./test.sh 5784
2 match(es) found
IP of ipv4_5784_4680 is 1.1.1.2
IP of ipv4_5784_4679 is 1.1.1.1
$ ./test.sh 5784_4680
1 match(es) found
IP of ipv4_5784_4680 is 1.1.1.2
$ ./test.sh 84
0 match(es) found
$ ./test.sh 987
0 match(es) found
$ ./test.sh ipv4
0 match(es) found
$ ./test.sh ipv4_7838
0 match(es) found

相关内容