배열 요소에 액세스

배열 요소에 액세스

mysql에서 정보를 검색하는 다음 스크립트가 있습니다.

#!/bin/bash
set -f       
IFS=$'\n'

arr=($(sudo mysql -u root -h localhost -e "USE mydb;SELECT * FROM users"))


for i in "${arr[@]}"
do
   echo "$i}"
done

이전 스크립트를 실행하면 다음과 같은 결과가 나타납니다.

id      firstname       lastname        phonenumber     password        email   ip}
5       User    User    111111111111    Passtest1       [email protected]      147.236.147.91}

이게 문제 야:런타임에 키 값을 인쇄하고 싶습니다.

#!/bin/bash

set -f       
IFS=$'\n'    

arr=($(sudo mysql -u root -h localhost -e "USE mydb;SELECT * FROM users"))


echo ${arr[ip]}

그러면 나는 다음을 얻습니다:

id      firstname       lastname        phonenumber     password        email   ip

(이 경우) ID 값을 인쇄하는 방법은 무엇입니까 5?

답변1

첫 번째, 다음을 통해 모든 쉘 스크립트를 실행하도록 제안해도 될까요?주택 검사- 많은 Linux 배포판에서 독립 실행형 프로그램으로도 사용 가능 - 구문 오류를 감지합니다. 예를 들어 echo $i}오타처럼 보이지만 " $i만"은 "작동"합니다. 왜냐하면 ${i}"만"이 추가되면 }의도한 출력에 가짜 추가가 발생하기 때문입니다.}

두번째, 배열과 변수의 사용에 대해 오해가 있는 것 같습니다. 인쇄하려는 ip"실제 데이터 행" 표시의 마지막 열입니다 . 당신의 용도

echo ${arr[ip]}

그러나 다음과 같이 선언(like declare -A arr)하거나 "fill"하지 않기 때문에 작동하지 않습니다.arr연관즉, 이와 같이 배열을 역참조하면 작동하지 않습니다. 쉘은 여기서 숫자 배열 인덱스를 예상합니다. 텍스트 문자열(예: ip)을 제공하는 경우 동작은 셸에 따라 달라집니다. 비록 셸에서 이를 변수 이름으로 해석할 수 있지만 변수가 정의되지 않은 것을 찾은 다음(즉, 빈 문자열로 평가) 첫 번째 항목만 인쇄합니다. 배열의 요소 하나의 항목(귀하의 경우 첫 번째 줄).

또한 배열이 연관 배열로 선언되더라도 "열 헤더"와 "배열 인덱스"의 일치는 자동으로 수행되지 않습니다. 설명하는 방식으로 대상 액세스를 원하는 경우 수동으로 수행해야 합니다.

제삼, 대부분의 경우 텍스트 처리는텍스트 처리 도구를 사용하면 더 나은 성능을 얻을 수 있습니다.awk쉘에서 수행하는 대신. 헤더 행을 무시하고 두 번째 행의 마지막 열을 인쇄하고 싶기 때문에 제안합니다.

sudo mysql -u root -h localhost -e "USE mydb;SELECT * FROM users" | awk 'NR==2{print $7}'

두 번째 줄(조건)만 처리하고 조건이 발견되면 일곱 번째 열을 인쇄하는 프로그램을 통해 sudo명령 호출의 출력을 처리합니다.mysqlawkNR==2

네번째, 가장 좋은 방법은 여전히 ​​데이터베이스 도구 자체를 사용하여 데이터를 선택하는 것입니다.저는 SQL 전문가가 아닙니다., 하지만 내 생각에 다음과 같은 쿼리는

mysql -u root -h localhost -e "USE mydb; SELECT ip FROM users WHERE id='5'"

작동해야 합니다(그러나 프로덕션에 사용하기 전에 중요하지 않은 예제를 통해 확인하십시오).

관련 정보