コマンドラインで変数値の一部を参照して変数全体値を使用する方法

コマンドラインで変数値の一部を参照して変数全体値を使用する方法

パラメータ内の変数文字列の特定の部分を参照して、変数を使用できるスクリプトを作成したいと思います。たとえば、次のようになります。

#!/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

おすすめ記事