매개 변수에서 변수 문자열의 특정 부분을 언급하여 변수를 사용할 수 있는 스크립트를 만들고 싶습니다. 예를 들면 다음과 같습니다.
#!/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