쉘 프로그램의 제어문 : expr


# 제어문 사용 예

- expr 연산자의 전후 공백 지정
- 변수 대입부분 공백 없어야 함 : 잘못된 예) a = 1

[root@master ~]# a=1
[root@master ~]# a=`expr $a + 1`
[root@master ~]# echo $a
2
[root@master ~]# echo "a=$a"
a=2
[root@master ~]#
[root@master ~]# b=10
[root@master ~]# let b=b+10
[root@master ~]# echo "b=$b"
b=20
[root@master ~]#
[root@master ~]# c=100
[root@master ~]# x=$(($c+5))
[root@master ~]# echo "c=$c"
c=100

1. expr 제어문


Bourne Shell에서 모든 변수들은 문자열 type으로 처리된다.
따라서 문자열들의 연산은 불가능하기 때문에 변수들의 연산은 불가능하다.
그러나 Buorne Shell은 수학적 등식을 사용하여 문자열의 수학적 연산을
수행할 수 있는 방법은 제공한다.
이런 연산은 Bourne Shell의 expr 명령어를 이용하여 수행할 수 있다.

expr 명령어는 수학식과 같이 그들의 인자들을 계산하고, 표준출력 장치에
결과를 출력한다. 이 expr 명령어는 쉘 변수들의 연산을 수행하기 위해 아주
빈번히 사용된다. expr 명령어에서 이용 가능한 연산자는 다음과 같다.

+    더하기
*    곱하기
%    나머지 나누기
-빼기
/    나누기

expr 명령어상에 위의 연산자들을 사용할 경우에는 연산자의 전후에 반드시 공백을 지정해야 한다.

expr 명령어상에서 첫번째 인자와 두번째 인자를 비교할수 있는 일치(match)
연산자인 :도 사용할 수 있다. 그러나 이 연산자를 사용할 경우에,
두번째 인자로는 반드시 정규 표현식을 지정해야만 한다.
: 연산자의 연산 결과로 정규 표현식으로 지정된 문자와 일치된 문자수가
돌려지거나 또는 일치하는 것이 없을 경우에는 0 값이 되돌려진다.
모든 문자를의미하는 .*라는 정규 표현식을 이용하면은, 일치 연산자를
사용하여 지정된 첫번째 인자의 인자의 길이 즉, 문자수를 확인할 수 있다.

(주목) 역따옴표(`)로 둘러쌓인 연산식이 실행되면, 명령어의 결과가
명령어 자체를 대치한다. 그리고 연산식내에 사용된 $ 또는 * 같은
연산자는 expr 명령어에 처리되기 앞서 쉘에의해서 먼저 분석되기
때문에 엉뚱한 결과를 초래할 수 있다. 이와같은 경우 사용된
연산자를 쉘이 번역하지 못하도록 보호문자인 \를 연산자 앞에
지정해야 한다.

다음은 expr 명령어를 사용한 예이다.

┌─────────────────────────────────┐
│ myprog                                                           │
├─────────────────────────────────┤
│ a=`expr 1 + 2`        # expr 명령어의 실행 결과가 변수에 설정.   │
│ b=`expr $a \* 4`      # *는 쉘 특수문자임으로 이를 expr 명령어의 │
│ echo $a $b  # 인자 즉, 연산자로 전달하기 위해 \를 지정.          │
└─────────────────────────────────┘

$myprog
3 12
$VAR="Now is the time"
$expr "$VAR" : '.*'        <----(1)
15

(1)번에 지정되어 있는 expr 명령어를 유심히 관찰해야 한다.
이 예는 VAR 변수에 설장된 문자열의 문자수를 계산하기 위해
expr 명령어를 : 연산자를 사용하여 지정하고 있다.
그런데 변수의 참조인 첫번째 인자에 대해 쌍따옴표가 (") 지정되어 있다.
그것은 변수 VAR에 설정되어 있는 공백을 쉘이 제거하지 못하도록 하기
위함이다. 두번째 인자로 '.*' 라는 정규 표현식을 지정함으로써 첫번째
인자로 지정된 변수의 문자수(공백 포함)를 계산하도록 하고 있다.


2. Korn Shell에서의 연산


expr 명령어는 Bourne Shell에서 수행됐던 것처럼 Korn Shell에서도
동일한 기능을 수행한다. 이전 강의에서 Korn Shell에는 문자열 type의
변수 이외의 변수 type을 선언할수 있는 typeset 명령어에 대해 소개했다.

이 기능말고도 Korn Shell에서는 연산을 수행할수 있는 let과 ((...))라는
두가지의 추가 명령어를 제공한다. 이들 명령어의 형식은 다음과 같다.

let expression
((expression))

이들 두가지 명령어의 차이점을 설명하면 다음과 같다.

┌───┬────────────────────────────┐
│      │ expression상에 특정한 쉘 특수문자를 사용할 경우에는    │
│      │ 보호문자로 묶어주어야 한다.                            │
│let   ├────────────────────────────┤
│      │ expression상에 변수를 지정시 변수명 앞에 $를 기술할    │
│      │ 필요가 없다.                                           │
├───┼────────────────────────────┤
│      │ expression상에 사용된 쉘특수문자를 보호할 필요가 없다. │
│      │                                                        │
│((..))├────────────────────────────┤
│      │ expression상에 사용된 변수에 $ 문자를 지정할 필요가    │
│      │ 없다.                                                  │
└───┴────────────────────────────┘

명령어의 형식에서 expression은 변수, 상수 또는 변수 제어문을 지정할 수
있으며, 또한 expression은 수학식, Boolean 연산식, 비트 연산식등을
이용하여 기술할 수 있다.
연산식에 지정 가능한 연산자들은 다음과 같다.

┌─────────────┬─────────────────────┐
│ 연산자                   │  수행내용                                │
├─────────────┼─────────────────────┤
│ (expression)             │ Override precedence.                     │
├─────────────┼─────────────────────┤
│ -expression              │ 음수                                     │
├─────────────┼─────────────────────┤
│ lexpression              │ 논리적 부정                              │
├─────────────┼─────────────────────┤
│ expression * expression  │ 수학적 연산                              │
│ expression / expression  │                                          │
│ expression % expression  │                                          │
│ expression + expression  │                                          │
│ expression - expression  │                                          │
├─────────────┼─────────────────────┤
│ expression << expression │ 두번째 expression에 지정된 비트수만큼    │
│ expression >> expression │ 좌/우측으로 첫번째 expression에 지정된   │
│                          │ 값을 shift한다.                          │
├─────────────┼─────────────────────┤
│ expression <= expression │ Boolean expressions (왼쪽에서 오른쪽으로)│
│ expression >= expression │ expression의 값이 0이 아니면 1           │
│ expression < expression  │      그렇지 않으면 0이다.                │
│ expression > expression  │                                          │
│ expression == expression │                                          │
│ expression != expression │                                          │
├─────────────┼─────────────────────┤
│ expression && expression │ 논리적 AND                               │
│ expression || expression │ 논리적 OR                                │
├─────────────┴──────┬──────────────┤
│ identifier = expression                │ 할당 연산자                │
│ identifier = identifier op expression  │                            │
└────────────────────┴──────────────┘

다음은 let과 ((..)) 명령어의 예제는 다음과 같다.


KORN> let x=10*3    # 10 * 3 즉, 30이 변수 x에 설정된다.
KORN> echo $x
30
KORN> ((z=x/2))     # 30 / 2 즉, 15가 z에 설정된다.
KORN> echo $z
15
KORN> let z=x/2     # 30 / 2 즉, 15가 변수 z에 설정된다.
KORN> echo $z
15
KORN> let y=x\ echo $y
1
KORN> if (($x < z)) # x가 z보다 적으면 then 문을 그렇지 않으면 else문을
>then               # 실행한다.
>   echo x \> z
>   echo $x \< $z
>else
>   echo x is not \< z
>   echo $x \> $z
>fi
x is not < z
30 > 15


출처 : http://donzbox.tistory.com/137


※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
08 9, 2013 13:47 08 9, 2013 13:47


Trackback URL : http://develop.sunshiny.co.kr/trackback/945

Leave a comment

« Previous : 1 : ... 87 : 88 : 89 : 90 : 91 : 92 : 93 : 94 : 95 : ... 648 : Next »

Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. 안녕하세요^^ 배그핵
  2. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  3. 정말 큰 도움이 되었습니다.. 감사합... 사랑은
  4. 네, 안녕하세요. 댓글 남겨 주셔서... sunshiny
  5. 감사합니다 많은 도움 되었습니다!ㅎㅎ 프리시퀸스

Recent Trackbacks

  1. how to broadcast your own tv station how to broadcast your own tv station %M
  2. elapsed time clock for operating r... elapsed time clock for operating r... %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   12 2019   »
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        

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 2780494 HIT
TODAY 77 HIT
YESTERDAY 1360 HIT