질문: 파일의 호스트 주소를 사용하여 쉘스크립트 메뉴를 생성하고 각 옵션 아래에 "ping 상태"가 있는 옵션을 표시하시겠습니까? 어떻게 도와줄 아이디어가 있나요?
파일 이름:bssh.sh
#!/bin/bash
# Display Servers
echo "Servers List"
echo ""
SERVERS="servers_list.txt"
while IFS= read -r SERVERS_LINE || [[ -n "$SERVERS_LINE" ]]; do
serveraddress=$(echo $SERVERS_LINE | cut -d"@" -f 2)
servername=$(echo $SERVERS_LINE | cut -d"@" -f 1)
if ping -c 1 -W 1 $serveraddress >/dev/null 2>&1; then
echo -e "$servername [\033[0;32mOnline\033[0m]"
echo ""
else
echo -e "$servername [\033[0;31mOffline\033[0m]"
echo ""
fi
done <"$SERVERS"
readarray -t Servers < servers_list.txt
PS3=$'\n'"Enter your choice or 0 to exit: "
select selection in "${Servers[@]}"; do
if [[ $REPLY == "0" ]]; then
echo -e "\033[0;90mPeace Out!\033[0m" >&2
exit
else
# Modify the way the program is called
if [[ -e /usr/bin/ssh ]]; then
echo ""
ssh "$selection"
#echo ""
else
echo ""
ssh "$selection"
#echo ""
fi
break
fi
done
파일 이름:servers_list.txt
[email protected]
[email protected]
[email protected]
답변1
먼저 readarray
파일을 한 번 읽어 배열을 채웁니다. 어느 쪽이든 배열이 채워지면 배열을 재사용하고 구문 분석하여 각 항목에서 필요한 비트를 추출할 수 있습니다.
$ cat se.sh
#!/bin/bash
readarray ssh_users < input
printf "SSH connections list:\n"
for connection in ${ssh_users[@]}; do
printf "%s\n" "${connection}"
done
printf "Users list:\n"
for user in ${ssh_users[@]}; do
printf "%s\n" "${user%%@*}"
done
printf "Servers list:\n"
for server in ${ssh_users[@]}; do
printf "%s\n" "${server##*@}"
done
$ ./se.sh
SSH connections list:
[email protected]
[email protected]
[email protected]
Users list:
root
validusername
ufo
Servers list:
127.0.0.1
127.0.0.1