인터넷 연결을 확인하는 스크립트가 있습니다. 나는 이것을 달성하기 위해 ping을 사용합니다. 사용할 때마다 ping google.com -c 4 | grep time
null이 아닌 응답이 생성됩니다. 그것은 마치
64 bytes from hkg03s11-in-f4.1e100.net (173.194.127.68): icmp_req=2 ttl=52 time=90.6 ms
. 그런데 연결이 끊어지면 해당 time
섹션이 표시되지 않아서 동일한 명령을 실행하면 비어 있는 것으로 표시됩니다. 어떻게 사용하나요 if
? 을 사용해야 " "
할지 헷갈립니다 ""
.
어느 것을 사용해야 합니까?
if [ 'ping google.com -c 4 | grep time' != " " ]; then
또는
if [ 'ping google.com -c 4 | grep time' != "" ]; then
사이의 공간을 주목하세요""
답변1
[ … != " " ]
왼쪽을 단일 공백이 포함된 문자열과 비교합니다. [ … != "" ]
왼쪽을 빈 문자열과 비교합니다. 쉘 프로그래밍에는 몇 가지 단점과 문제가 있지만 이 특별한 경우는 매우 간단합니다.
'ping google.com -c 4 | grep time'
32자 문자열입니다. 아마도 명령의 출력을 사용하려고 할 것입니다.명령 대체. (사용한 앞쪽 따옴표 대신) 백틱을 사용하거나 달러 대괄호를 사용할 수 있습니다. 이는 일부 복잡한 상황에서 더 읽기 쉽고 오류 발생 가능성이 적습니다. 어느 쪽이든 전체 내용을 큰따옴표로 묶어야 합니다. 그렇지 않으면 명령 대체 결과는 다음과 같습니다.말로 쪼개져 더욱 더러움.
if [ "$(ping google.com -c 4 | grep time)" != "" ]; then …
이 모든 것은 연결성을 테스트하는 다소 우회적이고 취약한 방법입니다. 대신 반품 상태를 사용하세요 ping
. 단일 패킷이면 충분할 수 있으므로 네트워크에 장애가 발생할 경우를 대비해 매우 작은 시간 제한을 지정해야 합니다. Ping은 google.com
IP 연결과 DNS가 제대로 작동하는지 테스트합니다. 핑을 통해 IPv4 연결이 작동하는지 테스트할 수 8.8.8.8
있습니다(8.8.8.8은 Google이 실행하는 서버입니다).
if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
echo "The network is up"
else
echo "The network is down"
fi
당신은 또한 볼 수 있습니다쉘 스크립트:인터넷 연결을 확인하는 올바른 방법은 무엇입니까?
답변2
어때요?
if ping google.com -c 4
then
... OK
else
... not OK
fi
대부분의 UNIX 명령과 마찬가지로 ping은 테스트할 수 있는 반환 코드를 제공합니다.
원래 질문에 대답하려면 빈 문자열을 직접 쓸 수 없습니다.
if [ x'ping google.com -c 4 | grep time' != x ]; then
- 빈 문자열이 주어 지면
ping google.com -c 4 | grep time
x는 x와 같습니다.
답변3
귀하가 제공한 두 가지 옵션 중에서 후자가 정확합니다.
if [ 'ping google.com -c 4 | grep time' != "" ]; then
something
예를 들어 변수에 저장하고 var
를 사용하여 변수가 비어 있는지 확인할 수 있습니다 [ -z "$var ]"
. 비어 있으면 종료 상태 $?
는 0입니다.
확인하다:
$ var="something"
$ [ -z "$var" ]
$ echo $?
1
$ var=""
$ [ -z "$var" ]
$ echo $?
0
다음 방법 중 하나를 사용하여 인터넷 연결을 테스트할 수 있습니다.
ping -s 1 -c 1 -W 2 -q www.google.com && echo "SUCCESS" || echo "FAILURE"
사용하면 -s 1
1바이트의 데이터만 전송됩니다. 사용하면 -c 1
하나의 ICMP 패킷만 전송됩니다. 를 전달하여 -W 2
ping 응답을 2초만 기다리도록 지정합니다.