변수는 다른 프로그래밍 언어와 비슷하게 ‘=’을 사용하여 선언하지만 주의할 것은
space가 없이 선언해야 한다는 점이다.
또한 Shell에서는 변수의 타입은 지정하지 않는다.
** 모두 문자열로 저장됨, 하지만 숫자로도 연산할 수 있는 기능이 있음(expr)
VAR=value(O)
VAR = value(X)
그리고 variable은 하나의 값만 가질 수 있다.
따라서 = 뒤에는 하나의 argument만 와야 한다.
예시를 보자
var.sh
#!/bin/sh
MY_MESSAGE="Hello World"
echo $MY_MESSAGE
실행하면 Hello World가 뜬다.
변수에 저장된 것이 echo 된다.
variable로 연산도 될까?
$ x="hello"
$ expr $x + 1
expr: non-numeric argument
오류가 뜬다. 이는 숫자가 아닌 변수와 숫자 연산을 시도했기 때문이다.
** 만약 정말 예외적인 문자를 입력해야 될 때는 escape character를 이용한다.
우리가 C 언어에서 표준 입력을 받아서 변수에 저장할 수 있듯이
쉘에서도 표준 입력을 받을 수 있다.
“read” 커맨드를 쓰면 MY_NAME에 value를 담을 수 있다.
var2.sh
#!/bin/sh
echo What is your name?
read MY_NAME
echo "Hello $MY_NAME - hope you're well."
그렇다면 선언된 Variable의 scope는 어떻게 될까?
static 같이 프로세스가 종료될 때까지?
Shell 에서는 Variable이 선언이 따로 되지 않는다. 선언과 같이 할당된다.
선언되지 않은 Variable을 불러와도 에러가 발생하진 않는다.
다만 빈 문자열만 value로 얻을 뿐이다.
그래서 여러가지 버그 상황이 나올 수도 있다.
MY_OBFUSCATED_VARIABLE=Hello
echo $MY_OSFUCATED_VARIABLE
당연히 B를 빼먹었으므로 빈 문자열이 나온다.
하지만 Error 나 Warning을 쓰로잉하지 않는다.
그렇기 때문에 간과하고 넘어가는 경우가 있다.
또한 export라는 명령이 있다.
가장 일반적으로 variable의 scope에 영향을 주는 명령이다.
myvar2.sh
#!/bin/sh
echo "MYVAR is: $MYVAR"
MYVAR="hi there"
echo "MYVAR is: $MYVAR"
이 스크립트를 실행해보자
$ ./myvar2.sh
MYVAR is:
MYVAR is: hi there
역시 MYVAR를 선언하지 않아서 빈 문자열이 반환되었고
MYVAR를 선언 이후에는 제대로 반환되었다.
다르게 실행해보자
$ MYVAR=hello
$ ./myvar2.sh
MYVAR is:
MYVAR is: hi there
MYVAR를 할당해줬음에도 제대로 출력되지 않았다.
이는 스크립트의 MYVAR에 변수에 할당한 것이 아니기 때문이다.
스크립트에서 쓰인 MYVAR는 #!/bin/sh 에서 시작했기 때문이다.
만약 전역적으로 변수에 대한 선언을 하고 싶다면 export를 쓸 수 있다.
$ export MYVAR
$ ./myvar2.sh
MYVAR is: hello
MYVAR is: hi there
그렇게 되면 MYVAR라는 variable이 쓰인 모든 곳에서 작동하게 된다.
그럼 MYVAR는 myvar2.sh 에서 마지막으로 할당했으니까
hi there 값을 유지할까??
$ echo $MYVAR
hello
그렇지 않다.
shell 스크립트가 모두 실행되어 종료되었다면(exit) 거기에 있던 environment는 파괴된다.
하지만 MYVAR는 interactive shell 에서 export 했기 때문에 export 이후 할당했던 값 hello로 남아있다.
만약 script에서 조작한 value도 유지하고 싶다면 .(dot) 커맨드를 이용한다.
Shell script를 실행할 때는 대개 다른 shell을 열어서 실행하게 된다.
하지만 export 한 쉘로 실행하고 싶다면 . 명령을 쓰면 된다.
$ MYVAR=hello
$ echo $MYVAR
hello
$ . ./myvar2.sh
MYVAR is: hello
MYVAR is: hi there
$ echo $MYVAR
hi there
쉘에서 export 했던 variable이 스크립트를 실행해서 조작했던 값을 가지고 있다.
user.sh
#!/bin/sh
echo "What is your name?"
read USER_NAME
echo "Hello $USER_NAME"
echo "I will create you a file called $USER_NAME_file"
touch $USER_NAME_file
이렇게 variable을 사용하면 괜찮을까?
Error가 발생한다.
USER_NAME_file 이라는 변수가 없기 때문이다.
변수가 문자열임을 이용해 다른 것과 조합하여 이용하고 싶다면 중괄호, bracket을 이용한다.
user.sh
#!/bin/sh
echo "What is your name?"
read USER_NAME
echo "Hello $USER_NAME"
echo "I will create you a file called ${USER_NAME}_file"
touch "${USER_NAME}_file"
이렇게 하면 의도했던 대로 유저의 이름_file 이 생겨날 것이다.
'DevOps > Shell' 카테고리의 다른 글
Shell Script - 4, escape character (0) | 2022.11.23 |
---|---|
Shell Script - 3, Wildcard (0) | 2022.11.23 |
Shell script 11, Tip (0) | 2022.11.22 |
Shell Script - 1, 작성하기 (1) | 2022.11.21 |
Shell Script, 셸 스크립팅하기 (2) | 2022.09.05 |