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=,하고 처리의 다른 부분을 단순화할 수 있습니다.

관련 정보