![배열 요소에 액세스](https://linux55.com/image/194745/%EB%B0%B0%EC%97%B4%20%EC%9A%94%EC%86%8C%EC%97%90%20%EC%95%A1%EC%84%B8%EC%8A%A4.png)
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
명령 호출의 출력을 처리합니다.mysql
awk
NR==2
네번째, 가장 좋은 방법은 여전히 데이터베이스 도구 자체를 사용하여 데이터를 선택하는 것입니다.저는 SQL 전문가가 아닙니다., 하지만 내 생각에 다음과 같은 쿼리는
mysql -u root -h localhost -e "USE mydb; SELECT ip FROM users WHERE id='5'"
작동해야 합니다(그러나 프로덕션에 사용하기 전에 중요하지 않은 예제를 통해 확인하십시오).