기술나눔

[Linux][Shell][Shell Logic Control] 상세 설명

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


1.판결이 난다면

1.만약-그렇다면

  • 문법
    if command
    then
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
  • 세게 때리다if명령문은 다른 프로그래밍 언어인 bash와 다릅니다.if성명서는직접 실행if다음 명령
    • 명령이올바르게 실행됨(상태 코드는 0), 그 다음의 명령이 실행됩니다
    • 그렇지 않으면 실행되지 않거나 다른 논리문이 실행되고 최종적으로는 실행되지 않습니다.fi로직 제어 종료

2. if-then-else (만약-그렇지 않으면)

  • 문법
    if command
    then
    	command
    else
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

3.엘리프

  • 문법
if command
then
	command
elif command
then
	command
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4. 케이스

  • 다수를 대체할 수 있습니다if-else나뭇가지
    case "变量" in
    值1)
     命令
     ;;
    值2)
     命令2
     ;;
    *)
     命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

5. 실제로 손을 더럽히세요

  • 메모리 모니터링
    #!/bin/bash
    
    FreeMem=`free -m | awk 'NR==2 {print $NF}'`
    CHARS="Current memory is $FreeMem"
    
    if [ "$FreeMem" -lt 16000 ]
    then
        echo $CHARS
        echo "内存不足,抓紧维护服务器!"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 비교 크기 읽기
    • 단일 지점 버전
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      fi
      
      if [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      fi
      
      if [ $a -gt $b ]
      then
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    • 다중 지점 버전
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      elif [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      else [ $a -gt $b ]
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
  • MySQL 모니터링 스크립트
    #!/bin/bash
    
    if [ `netstat -tunlp | grep mysql | wc -l` -ge "1" ]
    then
        echo "MySQL is running"
    else
        echo "MySQL is stopped"
        # systemctl start mysql.service
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 재동기화 시작 스크립트
    #!/bin/bash
    
    if [ "$#" -ne 1 ]
    then
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    if [ "$1" = "start" ]
    then
        /usr/bin/rsync --daemon
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -ge 1 ]
        then
            echo "Rsync is started"
            exit 0
        fi
    elif [ "$1" = "stop" ]
    then
        killall rsync &>/dev/null
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -eq 0 ]
        then
            echo "Rsync is stopped"
            exit 0
        fi
    elif [ "$1" = "restart" ]
    then
        kill rsync
        sleep 1
    
        killpro=`netstat -tunlp | grep rsync | wc -l`
        /usr/bin/rsync --daemon
        sleep 1
    
        startpro=`netstat -tunlp | grep rsync | wc -l`
    
        if [ "$killpro" -eq 0 -a "$startpro" -ge 1 ]
        then
            echo "Rsync is restarted"
            exit 0
        fi
    else
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

2.조건부 테스트

0.사전 설명

  • 조건부 테스트에 일반적으로 사용되는 구문
    이미지 설명을 추가해주세요

  • 일반적으로 사용되는 문자열 테스트 연산자
    이미지 설명을 추가해주세요

  • 수치 비교
    이미지 설명을 추가해주세요

  • 논리 연산자
    이미지 설명을 추가해주세요

  • 각 명령어 비교표
    이미지 설명을 추가해주세요


1. 테스트 명령

  • test명령의 가장 짧은 정의는 다음과 같습니다.표현식 평가
    • 조건이 true이면 0 값이 반환됩니다.
    • 표현식이 true가 아닌 경우 0보다 큰 값이 반환됩니다. 이는 false 값이라고도 할 수 있습니다.
    • 마지막으로 실행된 명령의 상태를 확인하는 가장 쉬운 방법은 다음을 사용하는 것입니다.$?
  • 매개변수
    • 파일명에 대해유형 감지(존재 여부), 예:test -e filename

      매개변수중요성
      -e파일 이름이 존재합니까?
      -f파일명이 파일(file)
      -d파일 이름이 디렉터리인지 여부(directory)
      -b파일명이요block device장치
      -c파일명이 a인가요?character device장치
      -S파일명이 a인가요?Socket문서
      -p파일명이 FIFO(파일) 파일인지 여부
      -L파일명이 연결파일인지 여부
    • 파일 정보권한 감지,좋다:test -r filename

      매개변수중요성
      -r파일 이름에읽을 수 있는속성
      -w파일 이름에쓰기 가능속성
      -x파일 이름에실행 가능속성
      -u파일 이름에수이드속성
      -g파일 이름에SGID속성
      -k파일 이름에끈적끈적한 비트속성
      -s파일명이요비어 있지 않은 파일
    • ~에 대한두 파일 간의 비교,좋다:test file1 -nt file2

      매개변수중요성
      -nt(보다 최신), 판사file1그것보다 나은가?file2새로운
      -ot(보다 나이가 많은), 판사file1그것보다 나은가?file2오래된
      -ef판사file1그리고file2동일한 파일이더라도 다음에서 사용할 수 있습니다.하드 링크의 판단에
      가장 중요한 것은 두 파일이 동일한 파일을 가리키는지 확인하는 것입니다.inode
    • ~에 대한두 정수 중에서 결정하기,좋다:test num1 -eq num2

      매개변수중요성
      -eq두 숫자는 같습니다
      -ne두 숫자가 같지 않습니다.
      -gtnum1그 이상num2
      -ltnum1미만num2
      -genum1크거나 같음num2
      -lenum1보다 작거나 같음num2
    • 결정문자열 데이터

      매개변수중요성
      -z빈 문자열이면 반환true
      -n빈 문자열이 아닌 경우true
      =str1 == str2, 그런 다음 반환true
      !=str1 != str2, 그런 다음 반환true
    • 다중 조건부 판단,좋다:test -r filename -a -x filename

      매개변수중요성
      -a(및) 두 가지 상황이 동시에 설정됩니다.
      -o(또는) 두 가지 상황 중 하나가 참입니다.
      !논리적 부정

2.[]

  • 조건부 테스트는 종종 스크립트에서 수행되며 가장 일반적으로 사용되는 테스트는 대괄호입니다.[]
  • test그리고[]효과는 동일합니다
  • 기본 요소
    • []두 기호는 왼쪽과 오른쪽에 공백으로 구분되어야 합니다.
    • 다음과 같이 내부 연산자와 작동 변수 사이에는 공백이 있어야 합니다.[ "a" = "b" ]
    • 문자열 비교 중에> <다음과 같이 작성해야 합니다.> /<탈출하다
    • []중간 문자열 또는${}변수를 최대한 활용하라""값에 대한 정의되지 않은 참조를 방지하기 위해 큰따옴표로 묶습니다.
      [ -n "$filename" ]
      
      • 1
    • []다음에서 사용할 수 있습니다.-a -o논리 연산 수행, 지원되지 않음&& ||
    • []bash 내장 명령입니다

3.이중 괄호

1.(())

2.[[]]

  • 이중 브래킷 제공문자열, 패턴 일치, 정규식 일치를 위한 고급 기능
  • 기본 요소
    • [[]]두 기호는 왼쪽과 오른쪽에 공백으로 구분되어야 합니다.
    • 다음과 같이 내부 연산자와 작동 변수 사이에는 공백이 있어야 합니다.[[ "a" = "b" ]]
    • 문자열 비교에서는 직접 사용할 수 있습니다> <, 탈출 할 필요가 없습니다
    • [[]]중간 문자열 또는${}변수를 최대한 활용하라""큰따옴표로 묶음
      • 사용하지 않는 경우""큰따옴표로 묶인 경우 패턴 및 메타문자 일치가 수행됩니다.
    • [[]]내부적으로 사용할 수 있습니다.&& ||논리 연산 수행
    • [[]]bash의 키워드입니다
    • [[]]그 외 사용법은 동일[]같은

4. 실제로 손을 더럽히세요

  • 논리적 판단력 테스트
    #!/bin/bash
    
    read -p "Pls input a char:> " var1
    
    [ "${var1}" -eq 1 ] && {
        echo ${var1}
        exit 0
    }
    
    [ "$var1" -eq 2 ] && {
        echo $var1
        exit 0
    }
    
    [ "$var1" -ne "1" -a "$var1" -ne "2" ] && {
        echo "Script Error"
        exit 1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 시뮬레이션된 설치 스크립트
    #!/bin/bash
    
    path=/scripts
    
    [ ! -d "$path" ] && mkdir -p scripts
    
    cat << END
    	1.[install lamp]
    	2.[install inmp]
    	3.[exit]
    END
    
    read -p "Pls input your choice:> " num
    
    # 判断输入是否合法
    [[ ! $num =~ [1-3] ]] && {
    	echo "The num you input must be in {1|2|3}"
    	echo "Input Error"
    	exit 1
    }
    
    [ $num -eq 1 ] && {
    	echo "start installing lamp...waiting..."
    	sleep 2
    
    	# 如果该脚本没权限
    	[ ! -x "$path/lamp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 2
    	}
    
    	# 安装脚本
    	source ${path}/lamp.sh
    	exit $?
    }
    
    [ $num -eq 2 ] && {
    	echo "start installing lnmp...waiting..."
    	sleep 2
    	[ ! -x "$path/lnmp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 3
    	}
    	source ${path}/lnmp.sh
    	exit $?
    }
    
    [ $num -eq 3 ] && {
    	echo "Bye~"
    	exit 4
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

3. 루프

1.에 대하여

  • 문법
    for var in list
    do
    	commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • C 언어 스타일 지원
    for (( i=1;i<=10;i++ ))
    do
    	echo "The next number is $i"
    done
    
    • 1
    • 2
    • 3
    • 4

2. 동안

  • 문법: 여기test command그리고if-else명령문 형식은 동일하며 모든 bash 명령을 사용할 수 있습니다.

    • 알아채다while~의test command종료 상태 코드는 루프의 명령으로 변경되어야 합니다. 그렇지 않으면 상태 코드가 변경되지 않으면 루프가 계속됩니다.
      while test command
      do
      	commands
      done
      
      • 1
      • 2
      • 3
      • 4
  • while주문하다여러 테스트 명령을 작성할 수 있습니다.

    • 오직마지막 테스트 명령의 종료 상태 코드는 루프를 종료할지 여부를 결정하는 데 사용됩니다.
    • 줄바꿈에 주의하세요, 여러 테스트 명령이 각 줄에 개별적으로 표시되어야 합니다.
      var1=10
      while echo $var1
      	[ $var1 -ge 0 ]
      do
      	echo "This is inside the loop"
      	var1=$[ $var1 -1 ]
      done
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

3.명령까지

  • until그리고while반대 의미until이 명령을 사용하려면 다음을 지정해야 합니다.0이 아닌 종료 코드를 반환하는 테스트 명령
    • 종료 상태 코드가 0이 아닌 경우에만 bash는 루프 명령을 실행합니다.
  • 문법
    until test commands
    do
    	other commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • until또한여러 테스트 명령 지원, 마지막 명령만이 bash가 다른 명령을 실행하는지 여부를 결정합니다.
    until echo $var1
    	[ $var1 -eq 0 ]
    do
    	echo "Inside the loop:$var1"
    	var1=$[ $var1 - 25 ]
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

4. 제어 루프

1. 휴식

  • 효과:모든 유형의 루프를 강제로 종료합니다.
    • 여러 루프에서 점프할 때,break가장 많은 메모리 루프가 자동으로 종료됩니다.
  • 외부 루프 종료n점프할 루프 레벨을 나타냅니다. 기본값은 1이고 다음 레벨은 2입니다.
    break n
    
    • 1

2. 계속하다

  • 효과: 특정 루프를 건너뛰고 이 루프의 판단 부분으로 바로 이동합니다.

5. 루프의 출력을 처리합니다.

  • 쉘 스크립트에서 루프 출력 후의 결과는 다음과 같습니다.출력 리디렉션
    for (( a = 1;a<10;a++ ))
    do
    	echo "The number is $a"
    done > test.txt
    echo "Finished"
    
    • 1
    • 2
    • 3
    • 4
    • 5