bash 스크립트 변수를 얻기 위해 파일을 반복합니다.

bash 스크립트 변수를 얻기 위해 파일을 반복합니다.

나는 모든 서버에 로그인하고 로그인 성공 여부를 기록하여 여러 원격 MYSQL 호스트의 상태를 확인하는 스크립트를 작성 중입니다. 아이디어는 MYSQL 호스트에 대한 로그인 세부 정보를 CSV 파일에 저장하고 이 파일을 반복하여 로그인하고 로그인이 성공했는지 기록하는 스크립트를 얻는 것입니다.

CSV 파일에 저장된 MYSQL 로그인 데이터는 다음과 같습니다.

$host,$user,$password

Bash 스크립팅의 초보자이기 때문에 MYSQL 세부 정보를 얻기 위해 스크립트가 CSV를 통해 반복되는 부분에 접근하는 것이 가장 좋은 방법을 이해하는 데 어려움을 겪고 있습니다. 누구든지 도와줄 수 있나요?

현재 개별 MYSQL 호스트에 대해 아래를 테스트했습니다.

mysql -h$host -=$user -p$pass -d$db -e exit
if [ "$?" -eq "0" ]
then
        echo "Connection established"
else
        echo "Connection not established"
fi

미리 감사드립니다.

답변1

내장 기능 을 사용 하고 (입력 필드 구분 기호) 쉘 변수를 read사용하여 줄을 쉼표로 분할해야 한다고 지시할 수 있습니다.IFS

$ cat file 
user1,host1,pass1
user2,host2,pass2

$ while IFS="," read -r user host pass; do echo "$user:$host:$pass"; done < file 
user1:host1:pass1
user2:host2:pass2

따라서 스크립트에서 다음과 같은 것을 원할 것입니다.

while IFS="," read -r user host pass; do 
    if mysql -h "$host" -u "$user" -p"$pass" -e exit; then 
        echo "Connection established"
    else 
        echo "Connection failed" fi; 
done < file

그러나 위의 내용은 암호(또는 다른 변수, 그러나 암호에만 이 문제가 있을 수 있다고 가정)에 쉼표가 포함되어 있으면 깨집니다. 그것이 문제가 될 수 있다면 구분 기호를 쉼표 대신 다른 것으로 변경해야 합니다. 비밀번호에는 절대 나타나지 않는 것입니다. 예를 들어 탭을 사용하면 다음을 수행할 수 있습니다.

while IFS=$'\t' read -r user host pass; do 
    if mysql -h "$host" -u "$user" -p"$pass" -e exit; then 
        echo "Connection established"
    else 
        echo "Connection failed" fi; 
done < file

답변2

CSV는 특별히 편리하지는 않지만 여기에 있습니다.

while IFS=, read host user pass; do
    if mysql -h"$host" -u"$user" -p"$pass" -d"$db" -e exit
    then
        echo "$host: Connection established"
    else
        echo "$host: Connection not established"
    fi
done <file.csv

if(그리고 일반적으로 모든 셸의 흐름 제어 문이) 이미 뒤에서 검사하는 방법에 주목하세요 $?. 따라서 스크립트에서 명시적으로 검사할 필요는 거의 없습니다.

또한 더 많은 정보를 제공하기 위해 출력 메시지에 호스트 이름을 추가했습니다.

공백으로 구분된 입력 파일을 삽입할 수 있는 경우 해당 파일을 제거할 수 IFS=,있으며 아마도 처리의 다른 부분도 단순화할 수 있습니다.

관련 정보