我想创建一个脚本,在其中我可以通过在参数中提及变量字符串的某些部分来使用变量,例如:
#!/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