컴!

배치파일: 변수 / 상수 정리

WWIII 2020. 7. 22. 15:44
728x90
반응형

1. 작명센스

 

변수 만드는 것 부터...

 

우리는 그냥 set 를 만드는데.. 나중에 형변화를 시켜야 하거나 변수명을 읽어 와야 하는 문제에 닥치게? (__) 입닥처? 문제에

봉착하게 된다.

 

재수가 좋아서.. 변수명을 올바로 만들었으면 그냥 읽어 들이게 되는데.. 이놈이 변수명을 잘못 만들어서

 

좌절을 격게 되는 경우가 있게 된다. 여기까지 경험해 보지 못한 초보 입문자는 그냥 이런 경우가 있다고 생각 해라..

 

우선 1mon 과 mon1 이다.

 

 

 

@echo off
set 1mon=1월
set mon1=월1
echo %1mon% ----------- %mon1%
pause

 

 

결과값 (__)a

 

 

뭐가 잘못 되었을까?

 

@echo off
set 1mon=1월
set mon1=월1
echo %1mon%
echo  %mon1%
pause

 

이렇게 처보면 안다.

 

 

%1 은 아시다 시피.. 쉬프트 파라미터다. ㄱ-

 

젠장알..~!! 이런 개버그... 우리는 이런 버그로 인하여, 죽음의 변수라고 한다.

숫자문자 이런식의 변수는 우리가 피해 가야한다.

그래서 문제가 심각 한곳이 배열 선언시.. 문제가 많이 생겨난다.

물론..

 

%[1]mon% 이런식으로 하면 되지 않나라고... 할수 있지만..

뭐 =_=' 상관 없지만.. 일단.. 그렇다는 이야기다.

 

그다음..

 

변수명 선언시..

path 만 조심 하면 되나구? 아니다.. set 처보면 변수 금지어가 나온다.

 

여기 보여주는 것 전부 변수 선언 금지어다. 기본이다..!!

 

 

그다음은 변수명을 잘못 쓰면 값이 이상하게 나오는 경우인데.. 자주 마주치게 되는데 샘플 수집이 없는 관계로..

이건 나중에..ㅋㅋㅋㅋ

 

글 쓰다가 나오면 goto 하겠다..

 

2. 변수와 상수

 

변수와 상수가 뭐냐?

변수 = 변하는 수의 그릇

상수 = 고정된 값이지만 언제든 변화 무쌍으로 변하지만 변하지 않는? 고정관념을 가지게 하는 수다.

 

set /a a=%a%+1

 

자 여기서... 이야기 하자면..

변수란?

 

a 다..

 

상수는?

1 이다.

 

라고 하지만.. 상수는 음수 os가 표시할수 있는 수부터 ~ os가 표시 할 수 있는 모든 양수, 숫자적 숫자가 상수다. ㄱ-

32비트에서는 32자리까지고.. 64비트는 64자리라고 하나? 여튼.. 엄청난 수를 계산 하다 보면.. 결과값이 자리수 넘어가면 안나온다.

= _=' 닝기리..

왜? 32비트 os를 갔다 버러야 하는 상황이 온다.. 물론 32비트에서 이걸 처리 한 경우도 있긴 하지만..

나도 이해 못하는 소스이기 때문에..;; 구지.. 할말을 잃은 상태다..

 

기본적으로 일반인이 쉽게 봉착하기 쉬운 문제.. 말하자면..

하드 용량 계산 문제가 나올때..

이것 어떻게 계산 할거나?

바이트 단위부터 올라가서 기가 단위로 환산되며, 현재는 테라까지 연산해야한다.

우리가 배치파일에서 이런 테라에서 pb 계산까지 갈러면???????

=_= 128비트까지 올라가야.. 연산에 자유가 보장 받을수 있을러나? 여튼간에... 용량계산에서 아마..

허우적 거릴..ㅎㅎㅎㅎ (__)a 삽질을 해보고 알고리즘을 만들어야..하는..

 

 

 

3. 숫자와 문자의 자웅 대결

 

여튼간...

 

간단하다 우리는 이 변수에 상수를 주고 누적을 하는 거다..

 

숫자 상수와 문자 상수의 차이..

 

숫자는 1 이다. 문자도 1이다. 뭐가 숫자고 뭐가 문자인가?

 

헷갈린다.  1이면 1이지 왠? 숫자 문자?

 

숫자 1은 컴퓨터상에서 1이지만 문자 1은 숫자 1이 아니다.

 

그러므로 숫자1은 문자 1보다 크다.

 

비교1 문자1과 숫자0 에셔 숫자 0보다 작다로 나옴

@echo off
set ddd="1"
if %ddd% gtr 0 echo 크다
if %ddd% lss 0 echo 작다
if %ddd% equ 0 echo 같다
pause

결과값 작다

 

비교2 숫자1 과 숫자 0 에서 숫자1 이 크다라고 나옴 (정상)

@echo off
set ddd=1
if %ddd% gtr 0 echo 크다
if %ddd% lss 0 echo 작다
if %ddd% equ 0 echo 같다
pause

 

결과값 크다

 

비교3 문자0 과 숫자 0 에서 숫자 0 보다 작다라고 나옴

@echo off
set ddd="0"
if %ddd% gtr 0 echo 크다
if %ddd% lss 0 echo 작다
if %ddd% equ 0 echo 같다
pause

 

결과값 작다

 

비교4 문자1 과 숫자 1에서 숫자 1보다 작다라고 나옴

@echo off
set ddd="1"
if %ddd% gtr 1 echo 크다
if %ddd% lss 1 echo 작다
if %ddd% equ 1 echo 같다
pause

 

결과값 작다

 

비교5 문자 4 와 숫자 1에서 숫자 1보다 작다라고 나옴

@echo off
set ddd="4"
if %ddd% gtr 1 echo 크다
if %ddd% lss 1 echo 작다
if %ddd% equ 1 echo 같다
pause

 

결과값 작다

 

비교6 문자 abcd 와 숫자 1 에서 숫자 1보다 작다라고 나옴

@echo off
set ddd="abcd"
if %ddd% gtr 1 echo 크다
if %ddd% lss 1 echo 작다
if %ddd% equ 1 echo 같다
pause

결과값 작다

 

문자는 숫자 보다 무조건 작다.. 기본 이다 0 이건 -1 이건 -1213123 이건 작다다.

예외 처리할때 간흑 쓰이는데 간흑..~(__~) 염장 질 할때가 생긴다. 이문제로 소스를 다시 짜야 하는 경우가

생기므로 될수 있으면 숫자와 문자를 비교 하는 처리는 안하는게 바람직.. ( 그러면서 남발 ㅋㅋㅋㅋ)

 

문자는 논리식에서 숫자를 절대 못이긴다..

 

 

4. 배치파일에서도 그릇은 두개의 숫자와 문자

우리는

set var_r=1 과 set var_r="1" , set "var_r=1" 그리고 set "var_r="1"" 의 차이점..

 

@echo off
set var_r[1]=1
set var_r[2]="2"
set "var_r[3]=3"
set "var_r[4]="4""

for /l %%i in (1,1,4) do (
call echo %%var_r[%%i]%%
)
pause

 

하급 수준의 배치파일이라서 이해할러고 하지 마라.. 어차피 (__)a 이것 이해 못하면..

oTL 앞으로 디멘존과 함수의 끊임없는 괴로움에 시달릴것이다.

 

여튼 결과값은

 

1

"2"

3

"4" 다..

 

문제는 여기서 봉착 되는게 안니다.

변수명을 좀 길게 썻더니.. 쓰는게 귀찮아서 배열을 썻다.

여튼간..

4가지로 보이는 그릇이지만 사실 숫자변수와 문자변수의 그릇을 보여주기 위함이다.

숫자 1은 그냥 숫자 1이다.

숫자 2는 문자 다

숫자 3은 숫자 3이다.

숫자 4는 문자 다

 

결론.. ㄱ-)a 문자와 숫자 구별은 "" 로 하며, 이 따옴표가 어디에 있나에 따라 다르다.

 

 

4. 문자는 그럼 그 수치를 비교 못하나요?

 

어의 없게도 한다.

 

=_='

@echo off
set ddd="4"
if %ddd% gtr "1" echo 크다
if %ddd% lss "1" echo 작다
if %ddd% equ "1" echo 같다
pause

 

결과값 크다라고 나온다.

 

@echo off
set ddd="0"
if %ddd% gtr "1" echo 크다
if %ddd% lss "1" echo 작다
if %ddd% equ "1" echo 같다
pause

작다라고 나온다.

 

@echo off
set ddd="a"
if %ddd% gtr "1" echo 크다
if %ddd% lss "1" echo 작다
if %ddd% equ "1" echo 같다
pause

크다라고 나온다.

 

@echo off
set ddd="c"
if %ddd% gtr "b167a" echo 크다
if %ddd% lss "b167a" echo 작다
if %ddd% equ "b167a" echo 같다
pause

 

크다 ㄱ-  여튼간.. 쇼팅해서 값을 선언 하는 것 같은데..일단.. 그렇다..

 

5. 변수의 형변환은?

 

숫자야 숫바상수에 "" 만 치면 되니깐..스킵하고..

문자를 숫자로..

 

@echo off
set ddd="1"
echo %ddd:~1,-1%------
if %ddd:~1,-1% gtr 1 echo 크다
if %ddd:~1,-1% lss 1 echo 작다
if %ddd:~1,-1% equ 1 echo 같다
pause

 

 

6. 근데 내가 집고 넘어가는 것..

 

사람들은..

 

set a=1

set b="1"

에서 a와 b는 같다라고 생각 한다. ㄱ-

아니거든...ㄱ-

 

7. 문자상수 사용시 꼬옥.. "" 로 표현 해야하나요?

물론 아니다. 허나

될수있으면 "" 걸로 표현해라..

가끔..

if [1] == [%aa%]

이런식으로 하시는 분들 있는데..ㄱ-

이런분들 나중에 for 문에 가면 대박 문제 봉착 가능..

결국 for 문에 가면 다 뜯어 고처야 하는 상황 발생한다. 그러니 "" 이걸 표준으로 생각하고 쓰시길.. 겐히

멋적어 보인다고 [] 이것 쓰다가 나중에 형변화 시켜야할 경우 쓰잘떼기 없는 라인수 추가 된다.

 

 

8. 결론

문자 변수 - 문자를 담을 이름

숫자 변수 - 숫자를 담을 이름

문자 상수 - 문자 그자체

숫자 상수 - 숫자 그자체

 

변수 이름을 잘짓자.. (__)a 잘못 지으면 개떡 된다.. 1a 2a 이런식으로 짓다가 나중에..엿 되는 경우도 있고..

= _= 이름 잘못 지으면 사람 미치는 상황이 발생한다라는것.. 숫자를 처넣고 싶다면.. 문자뒤에 넣어라..

 

문자 변수는 문자에 담고

숫자 변수는 숫자를 담아라..

 

끝으로 부족한 부분이 많은것으로 생각 되어지지만..ㄱ-

설명은 여기서 .. 무릅 이정도만 알아도.. set 변수 관련해서 누구보다 많이 안다고 자칭하다가..

전역변수 혹은 광역변수 지역변수 등등에 치명상 입을 수 있으니 조심..

나대다가 맞아 죽는 수가 있음..ㅋㅋ

이건 진짜 기초이자 그 누구도 알려주지 않는 내용임...

정작 초보들은 배워야할 내용인데 너무 초급이자 기본으로 누구도 다루지 않는 내용임..

= _='a

 

왜 냐구? 개발자 출신자들은 좀 짜보면 이게 숫자변수인지 문자 변수인지..

알거든..근데.. 우리같은 개무식쟁이들은 문자나 숫자나 그게 그거거든..;;

OTL =3

 

여튼 사담이 많아졌음.. 나중에 필살기 같은 변수에 대한 글이 있으면 좀 더 내용 증강을.. 먼가 뒤가 구린.. - _-a

여튼 그렇3...

수고들 하이숑..

 

 

아래는 개정 내역이다.

귀찮은 관계로 - _- 결론끝에서 확장한다. ㅋ 이놈의 귀차니즘..

 

9. for 변수 명과 call 변수의 첫자가 같으면 연산 오류..

우리는 종종 - _- 나만 그런가? 치명적인 실수를 하게 된다.

변수와 for문의 변수명을 비슷하게 써서.. 값이 안나오는

 

 

@echo off
setlocal
for /l %%l in (1,1,10) do (
set zz[%%l]=1%%l
)
for /l %%z in (10,-1,1) do (
call set qq=%%zz[%%z]%%
call echo %%qq%%
)
endlocal
pause

 

그리고

 

@echo off
setlocal
for /l %%l in (1,1,10) do (
set zz[%%l]=1%%l
)
for /l %%q in (10,-1,1) do (
call set qq=%%zz[%%q]%%
call echo %%qq%%
)
endlocal
pause

 

위의 내용은 배열 10개에 숫자 1~10 을 넣는데 앞에 1자를 넣고 for문을 써서 한꺼번에 거꾸로 출력 하라.

 

에서의 결과값은

엄청난 연산 오류가 발생하게 된다.

 

call set qq=%%zz[%%z]%%
변수와 for변수와 값이 같으면 qq 값에 = %%z z[ %%z ] 이렇게 들어가게 된다.

for의 z값 z[ for의 z값]%

우리가 원한 것은 이게 아닌데...;;

 

call set qq=%%zz[%%q]%%
이경우는..

10q

9q

8q 이딴식으로..ㄱ-

 

정상은

@echo off
setlocal
for /l %%l in (1,1,10) do (
set zz[%%l]=1%%l
)
for /l %%t in (10,-1,1) do (
call set qq=%%zz[%%t]%%
call echo %%qq%%
)
endlocal
pause

 

이렇게 만들어야 한다.

하단의 for 변수와 call 변수명 첫자와 중복되어 짖지 말아야 한다.

%omega% 이런 경우 for 문의 변수가 o 가 된다면..반드시 연산 오류가 일어나게 된다.

이런경우 for문의 변수명은 형 선언문의 강제력을 띄게 된다.

즉 같은 for문에는 절대 앞자가 같은 변수명을 쓸경우 연산 오류를 일으키는 치명적인 버그가 있다.

 

배열을 쓰면 정말 편할수 있지만... 잘못 쓰면 이렇게 치명적인 연산 오류를 낼수 있는 환경에 처 할수 있게 된다.

cmd에서는 %%변수와 %%변수%% 구분을 못하니..잘 못쓰면 개털림.. 몇 시간 동안 구상한 이론을..

엄청나게 하고 또하고 또하고 안되는 이유.. 이 변수 때문에.. oTL 한적이 한두번이 아닌듯..

알개 모르게 수십개월 걸린 것도 저 것때문에 안된 것 일수도 있다.   

 

아 단순 문자라서 그런다?

 

@echo off
setlocal
for /l %%v in (1,1,10) do (
call set varx=333
call echo %%varx%%
)
endlocal
pause

 

- -)ㅋ  해봐라..

 

 

 

 

 

update 2013.4.6

 

이글에서 그렇게 변수 앞에 숫자 쓰지 말랬거늘..

 

예제가 없어서 그렇게 못 믿는 거냐?

 

그럼 예제를 하나 보여주지..

 

배치파일.cmd 가 있다고 치자..

 

여기에 우리는 파라미터를 이용한 외부 입력을 받는다고 치자..

 

 

c:\>배치파일.cmd 우리 나라 만세

 

 

@echo off
echo 1- %1 2- %2 3- %3 4- %4
pause

 

 

 

1- 우리 2-나라 3-만세 4-

 

결과값이 이렇게 나올거다.

 

이걸 기본이다.

 

 

 

@echo off
echo 1- %1 2- %2 3- %3 4- %4

set 1a=세상
set 2a=살이
set 3a=더불어

echo 1- %1a% 2- %2a% 3- %3a% 4- %4a%
pause

 

약간 소스를 늘러 파라미터 값을 똑같이 해서 넣으면?

 

 

아 외부 파라미터 안쎠서 상관 없다구..

 

=ㅁ=)a

 

경험이 없으니 그런 말이 나오겠지..ㄱ-

 

 

 

뭐 거의 모든 경우의수 를 확인시켜 주리..물론 배열로 작성은 안했지만..

배열도 마찬가지 에러 걸림.. 더 기가막힘.. 거긴..더더더더 욱 정확한 값이 안나옴..

 

@echo off
set 1a=1111111111111
set 2a=3333333333333
set 3a=4444444444444
set 5a=5555555555555
for /l %%z in (1,1,5) do (
call :ddx %%z
)
echo 1a = %1a%  - 2a = %2a% - 3a = %3a% - 4a = %4a% - 5a = %5a% ----x
goto :end

:ddx
set 1a=1111111111111
set 2a=3333333333333
set 3a=4444444444444
set 5a=5555555555555

echo 1a = %1a%  - 2a = %2a% - 3a = %3a% - 4a = %4a% - 5a = %5a%  --- z
goto :eof
:end
pause

 

 

우리 예상은 111111111111 2222222222222 33333333333333 이딴게 나와야 하지?

 

 

 

하지만 절대 배반 하지 않는다. ㄱ-)a

 

좀 말 좀 듣자..뭐 이메뉴얼 쓸때 내가 격이 안나서..ㄱ-a 예제 샘플을 안썻지만.. 인제 왜 그런지 나도 알고..

 

이글을 보는 사람들도 인제 확실한 예제 샘플을 보여줬으니..절대 숫자쓰고 문자쓰는 변수는 배치파일을 값을

 

정확히 주지 않는다라는 것..

 

그러면 엎으면?

 

@echo off
set 1a=1111111111111
set 2a=3333333333333
set 3a=4444444444444
set 5a=5555555555555
for /l %%z in (1,1,5) do (
call :ddx %%z
)
echo 1a = %1a%  - 2a = %2a% - 3a = %3a% - 4a = %4a% - 5a = %5a% ----x
goto :end

:ddx
set a1=1111111111111
set a2=3333333333333
set a3=4444444444444
set a4=5555555555555

echo 1a = %1a%  - 2a = %2a% - 3a = %3a% - 4a = %4a% - 5a = %5a%  --- z
echo a1 = %a1%  - a2 = %a2% - 3a = %a3% - a4 = %a4% - a5 = %a5%  --- y
goto :eof
:end
pause

 

 

 

ㅇㅇ) 우리가 예상하는 111111111 222222222 33333333333 4444444444

 

가 나온다는 거다..

 

거다가 여기만 단순히 그런게 아니다. 변수 잘 못쓰면.. 문법중에서도 엿되는 경우도 종종있다.

현재 그냥 echo 로 찍기만 했지 실지로 연산이 들어가고 그런 곳에서는 완전 오동작..

 

=_= 그 파급 효과는.. 처음부터 다시 짜야 하는..

[출처] cmd 배치파일 기본으로 변수 상수? 정리..~!!|작성자 모꼬모지

 

728x90
반응형