쉘 스크립트: 아무것도 아닌 것과 비교하시겠습니까?

쉘 스크립트: 아무것도 아닌 것과 비교하시겠습니까?

인터넷 연결을 확인하는 스크립트가 있습니다. 나는 이것을 달성하기 위해 ping을 사용합니다. 사용할 때마다 ping google.com -c 4 | grep timenull이 아닌 응답이 생성됩니다. 그것은 마치 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.comIP 연결과 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 timex는 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 11바이트의 데이터만 전송됩니다. 사용하면 -c 1하나의 ICMP 패킷만 전송됩니다. 를 전달하여 -W 2ping 응답을 2초만 기다리도록 지정합니다.

관련 정보