Bash 스 크 립 트 의 if, case, read 와 위치 매개 변수

기본 적 인 명령 을 배 운 후에 우 리 는 이 명령 들 을 사용 하여 프로 그래 밍 을 할 수 있다.리 눅 스에 서 의 프로 그래 밍 을 셸 스 크 립 트 라 고 하 는데 명령 을 결합 시 켜 윈도 에서 일괄 처리 하 는 것 과 유사 하 다.이 스 크 립 트 에는 변수 와 구조 체 가 있 을 수 있 습 니 다.모든 프로그램 이 가지 고 있 는 프로그램 실행 과정, 예 를 들 어 순서 실행, 선택 실행 과 순환 실행 은 스 크 립 트 에 나타 날 수 있 습 니 다.다음은 셸 스 크 립 트 를 소개 합 니 다.
우선, 셸 스 크 립 트 프로 그래 밍 은 프로 세 스 프로 그래 밍 언어 입 니 다. 즉, 셸 스 크 립 트 는 다음 에 실행 할 절 차 를 강조 합 니 다. 마치 사람 이 셸 에 게 다음 에 무엇 을 해 야 하 는 지, 모든 방법 을 명확 하 게 지적 해 야 합 니 다.그리고 셸 은 스 크 립 트 류 언어 입 니 다. 컴 파일 이 필요 없고 직접 실행 할 수 있 으 며 해석 기 에서 설명 할 수 있 기 때문에 해석 형 언어 입 니 다.따라서 셸 스 크 립 트 는 프로 세 스 프로 그래 밍 언어 로 왼쪽 에서 오른쪽으로, 위 에서 아래로 모든 문 구 를 순서대로 실행 합 니 다. 즉 명령 입 니 다.
셸 스 크 립 트 는 기본적으로 순서대로 실행 되 지만 필요 할 때 점프 를 해서 선택 과 순환 이라는 두 가지 실행 구 조 를 실현 할 수 있 습 니 다.실행 구 조 를 선택 하려 면 "if"또는 "case"명령 을 사용 하 십시오.그 중에서 'if' 는 논리 적 으로 판단 한 결과 에 따라 선택 하고 'case' 는 선택 할 수 있 는 수치 에 따라 선택 합 니 다.먼저 "if"문 구 를 말 합 니 다.
형식 은 한 줄 에 쓸 수 있 습 니 다:
if      ; then    ; [ elif      ; then    ; ]... [ else    ; ] fi

조건 이 사실 이 라면 then 후의 명령 을 실행 합 니 다. 그렇지 않 으 면 어떠한 조작 도 하지 않 습 니 다.
if 문 구 는 여러 줄 형식 으로 쓸 수 있 고 더욱 직관 적 으로 보인다 (분 호 는 생략 할 수 있다).
if CONDITION        #CONDITION     ,         
then STATEMENT       #STATEMENT       (  ),         
fi
if CONDITION ; then #       
             #   “then”   “if”                  “;”。
STATEMENT1
STATEMENT2
...
fi

위의 구 조 는 단일 분기 구조 로 조건 이 만족 할 때 만 실행 한 다 는 뜻 이다. 그 다음 에 두 가지 분기 구 조 를 말한다. 이 구조 에서 조건 이 진실 이 라면 then 뒤의 명령 을 집행 한다. 그렇지 않 으 면 else 뒤의 명령 을 집행 한다. 즉, 조건 이 어떻든 지 간 에 하나의 명령 이 실 행 될 것 이다. 조건 이 만족 하지 않 을 때 'if' 문 구 를 건 너 뛰 는 것 이 아니다.형식 은 다음 과 같 습 니 다.
if CONDITION ; then
STATEMENT
...
else
STATEMENT
...
fi

두 갈래 구조 보다 더 상세 한 것 은 여러 갈래 구조 로 이 구 조 는 조건 에 대한 설명 이 더욱 상세 하고 여러 가지 상황 에 대응 할 수 있다.먼저 CONDITION 1 이 진짜 인지 아 닌 지 를 판단 하고 진짜 라면 첫 번 째 then 뒤의 문 구 를 실행 합 니 다.그렇지 않 으 면 CONDITION 2 가 진짜 인지 아 닌 지 를 판단 하고 진짜 라면 두 번 째 then 뒤의 문 구 를 실행 합 니 다.그렇지 않 으 면 CONDITION 3 이 진짜 인지 아 닌 지 를 판단 하고 진짜 라면 세 번 째 then 뒤의 문 구 를 실행 합 니 다.모든 CONDITION 이 가짜 라면 else 뒤의 문 구 를 실행 합 니 다.형식:
if CONDITION1 ; then
STATEMENT
...
elif CONDITION2 ; then
STATEMENT
...
elif CONDITION3 ; then
  STATEMENT
  ...
...
else
STATEMENT
...
fi

다음은 여러 갈래 로 스 크 립 트 를 작성 하고 그 안 은 다음 과 같 습 니 다 (스 크 립 트 실행 과정 은 원래 쓴 블 로그: Bash 스 크 립 트 참조).
#!/bin/bash
read -p "      " Get#            
if [ $Get -gt 5 ] ; then#                  (              :shell         ——test)
echo "     5"
elif [ $Get -lt 5 ] ; then
echo "     5"
else echo "     5"
fi

if 문 구 는 fi 로 끝나 야 합 니 다.
[root@localhost blog]# bash iftest
      3
     5
[root@localhost blog]# bash iftest
      6
     5
[root@localhost blog]# bash iftest
      5
     5

if 후 에는 test 문 구 를 따라 갈 수도 있 고 명령 을 따라 갈 수도 있 습 니 다. 명령 이 라면 이 명령 이 성공 적 으로 실행 되 었 는 지 판단 하 는 것 입 니 다. 성공 하면 다음 명령 을 실행 합 니 다. 그렇지 않 으 면 'else' 를 실행 합 니 다. 예 를 들 어:
스 크 립 트 를 작성 합 니 다. 아래 내용 이 포함 되 어 있 습 니 다.
#!/bin/bash
if ls test ; then
echo "test    "
else echo "test     "
fi

그리고 이 스 크 립 트 를 실행 합 니 다:
[root@localhost blog]# bash ifcom 
ls:     test:          
test                               #          test        ,
                                         #  “ls test”         
                                         #  if      else    
[root@localhost blog]# touch test
[root@localhost blog]# bash ifcom 
test
test    

이 스 크 립 트 를 실행 하 는 과정 에서 우 리 는 우리 가 필요 로 하지 않 는 많은 내용 을 출력 한 것 을 발견 할 수 있 습 니 다. 그래서 우 리 는 스 크 립 트 를 다음 과 같이 수정 하여 이 쓸모없는 정 보 를 삭제 할 수 있 습 니 다.
#!/bin/bash
if ls test&>/dev/null ; then  
# if          “/dev/null” ,         
#            if              
echo "test    "
else echo "test     "
fi

if 는 아마 이러한 사용 방법 일 것 입 니 다. 다음은 "case"명령 을 말 하 겠 습 니 다."case"명령 은 다 중 분기 선택 구조 입 니 다. 형식 은 다음 과 같 습 니 다.
case   in [   [|   ]...)    ;;]... esac

또는 구조 적 인 형식 으로 쓴다.
case    in 
[   [|   ]...)    ;;]
... 
esac

모드 (PATTERN) 는 다음 과 같 을 수 있 습 니 다.
1. 일반 텍스트 문자
2. globbing 스타일 의 마스크:
*: 임의의 길이 임 의 문자
?:임의의 단일 문자
[]: 범위 내의 임의의 단일 문자
[^]: 범위 밖의 임의의 단일 문자
3. |: 또는
이 모드 와 일치 하면 이 ")"다음 명령 을 실행 합 니 다. 두 개의 연속 적 인 분점 을 만 날 때 까지 ";".예 를 들 면:
스 크 립 트 를 만 든 다음 스 크 립 트 에 다음 내용 을 기록 합 니 다.
#!/bin/bash
read -p "  a、b、c    :" Get
case $Get in
a)
echo "    a"
;;
b)
echo "    b"
;;
c)
echo "    c"
;;
esac
[root@localhost blog]# bash case 
  a、b、c    :b
    b

이 스 크 립 트 에 서 는 같은 문자 만 일치 합 니 다. 예 를 들 어:
스 크 립 트 를 만 든 다음 스 크 립 트 에 다음 내용 을 기록 합 니 다.
#!/bin/bash
read -p "         :" Get
case $Get in
[[:digit:]])
echo "        "
;;
[[:alpha:]])
echo "        "
;;
*)
echo "        ,     "
;;
esac
[root@localhost blog]# bash caseMode 
         :s
        
[root@localhost blog]# bash caseMode 
         :1
        
[root@localhost blog]# bash caseMode 
         :%
        ,     

이 스 크 립 트 에서 패턴 을 사용 하여 일치 합 니 다. 이 모드 는 이전 예 와 조합 하여 사용 할 수 있 습 니 다.그 중에서 마지막 옵션 에 '*' 라 는 문 자 를 사 용 했 습 니 다. 임 의 를 대표 합 니 다. 즉, 위의 어떠한 조건 도 만족 하지 않 을 때 이 옵션 을 실행 하 는 것 입 니 다.이 를 통 해 알 수 있 듯 이 케이스 는 if 보다 더 편리 하 게 사용 할 수 있 으 며, 적어도 if 보다 형식 이 뚜렷 해 보인다.
위 에 제 시 된 모든 bash 스 크 립 트 는 read 명령 을 사용 하여 변수 데 이 터 를 읽 습 니 다. 다음은 "read"라 는 명령 을 말 합 니 다.
사용 형식:
read [-a   ] [-p    ] [-t   ] [   ...]

이름 은 보통 변수 이름 이나 그룹 이름 입 니 다.이름 을 쓰 지 않 으 면 시스템 은 읽 은 정 보 를 REPLY 변수 에 저장 합 니 다.예 를 들 면:
[root@localhost blog]# read a
123
[root@localhost blog]# echo $a
123
[root@localhost blog]# read 
456
[root@localhost blog]# echo $REPLY
456

"- a"옵션 은 입력 배열 입 니 다.
"- p"옵션 은 데 이 터 를 읽 을 때 힌트 를 주기 위해 서 입 니 다. read 명령 을 사용 하기 전에 echo 명령 으로 줄 을 바 꾸 지 않 는 문 자 를 출력 하 는 것 과 같 습 니 다. 예 를 들 어:
[root@localhost blog]# read -p "  :"
  :123
[root@localhost blog]# echo -n "  :" ; read #  “;”         (          ——     )
  :123

'- t' 옵션 은 일정 시간 을 기다 리 는 것 입 니 다. 그 동안 입력 하지 않 으 면 read 명령 을 건 너 뛰 고 다음 명령 을 수행 합 니 다.이 명령 은 리 눅 스 의 철학 사상 을 실현 했다. 즉, 사용자 와 상호작용 을 하지 않 고 자동화 처 리 를 실현 하 는 것 이다.그러나 이 옵션 을 사용 할 때 주의해 야 합 니 다. - t 옵션 을 사용 하여 시간 초과 시간 을 정의 하면 주어진 변수 가 비어 있 는 지 뒤에서 판단 해 야 합 니 다. 비어 있 으 면 변수 에 기본 값 을 제공 해 야 합 니 다.
"- s"옵션 은 디 스 플레이 를 닫 는 것 입 니 다. 이 옵션 은 입력 할 때 입력 한 내용 을 표시 하지 않 습 니 다.
이상 은 read 에서 흔히 볼 수 있 는 용법 과 옵션 입 니 다. 그러나 이것 은 스 크 립 트 가 실 행 된 후에 이 루어 진 할당 입 니 다. 우 리 는 스 크 립 트 가 실 행 될 때 까지 할당 할 수 있 습 니 다.스 크 립 트 가 실 행 될 때 스 크 립 트 에 사용 할 수 있 는 변 수 를 전달 하 는 것 입 니 다.스 크 립 트 에 위치 매개 변수 가 존재 합 니 다: $1, $2, $3... 이 변 수 는 셸 스 크 립 트 에서 직접 참조 할 수 있 습 니 다. 서로 다른 숫자 는 스 크 립 트 가 실 행 될 때 스 크 립 트 이름 뒤에 따 르 는 몇 번 째 매개 변수 에 대응 합 니 다. 이 매개 변 수 는 빈 칸 으로 구분 합 니 다.셸 스 크 립 트 를 작성 할 때 $1 을 사용 하여 호출 합 니 다. 예 를 들 어:
스 크 립 트 를 만 든 다음 스 크 립 트 에 다음 내용 을 기록 합 니 다.
#!/bin/bash
echo "      $1"
echo "      $2"
echo "      $3"
[root@localhost blog]# bash bianliang a b c
      a
      b
      c

위치 파 라 메 터 를 사용 할 때 shift [n] 명령 에 맞 출 수 있 습 니 다. 이 명령 의 기능 은 위치 파 라 메 터 를 왼쪽으로 이동 시 키 고 명령 뒤에 숫자 를 매개 변수 로 하 는 것 입 니 다. 없 으 면 기본 값 은 1 입 니 다. 명령 을 실행 한 후에 위치 파 라 메 터 를 왼쪽으로 이동 시 켜 주 는 숫자 가 그렇게 많 습 니 다. 이렇게 말 하면 이해 하지 못 할 수도 있 습 니 다. 예 를 들 어:
스 크 립 트 에 다음 내용 을 기록 합 니 다:
#!/bin/bash
echo \$1:$1
shift
echo \$1:$1
[root@localhost blog]# bash shift a b
$1:a
$1:b

이 스 크 립 트 에서 우 리 는 첫 번 째 위치 매개 변수 인 $1 에 대한 값 을 'a' 입 니 다. 첫 번 째 줄 에서 출력 한 것 은 a 입 니 다. 두 번 째 줄 의 명령 인 'shift' 를 통 해 위치 매개 변수 중의 내용 을 기본 한 자리 로 왼쪽으로 이동 한 다음 에 $1 을 출력 하면 원래 의 두 번 째 매개 변수 인 'b' 가 됩 니 다.
숫자 로 인 용 된 위치 매개 변 수 를 제외 하고 특수 기 호 를 사용 하여 인 용 된 특수 기능 을 가 진 변수 도 있 습 니 다.
  $#:모든 위치 매개 변수의 총수;
  $*:제 시 된 모든 위치 매개 변수의 목록;인용 부 호 를 사용 할 때 전체 매개 변수 목록 은 문자열 로 사 용 됩 니 다.
  $@:제 시 된 모든 위치 매개 변수의 목록;두 따옴표 참조 가 있 을 때 매개 변 수 는 단독 문자열 로 존재 합 니 다.
  $0: 실 행 된 스 크 립 트 파일 의 경로 (현재 실 행 된 스 크 립 트 의 이름);
예 를 들 면:
이전 스 크 립 트 를 다음 내용 으로 변경 합 니 다.
#!/bin/bash
echo "\$#:$#"
echo "\$*:$*"++
echo "\$@:$@"
echo "\$0:$0"
[root@localhost blog]# bash bianliang a b c
$#:3
$*:a b c
$@:a b c
$0:bianliang

좋은 웹페이지 즐겨찾기