パラメータ内の変数文字列の特定の部分を参照して、変数を使用できるスクリプトを作成したいと思います。たとえば、次のようになります。
#!/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_
エラーが発生します。
実際にスクリプトを作成しようとしていますが、そのVMのIPを覚えたくありません。すべてのアプリケーションが異なるポートを使用する別のVMで実行されています。
Google で検索しようとしましたが、残念ながらスクリプトが初めてだったので、何を検索するのか分からなかったため、具体的な結果は得られませんでした。
ベストアンサー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