드디어 리눅스에서 프로그래밍 다운것을 맛볼수 있을것 같은 챕터인 쉘 프로그래밍 챕터로 왔다.
내가 리눅스로 얻고자 하는것은 내가 짜본 가장큰 프로그램을 리눅스로 돌려보는것이다.
솔직히 말하자면 내가 짰던 가장 큰 프로그램이라는게 TCP/IP를 이용해서 유저 서버와 메인서버간에 통신을하고
유저서버를 통해 받은 UTF-8 문자열과 유저 서버의 데이터를 메인서버가 되는 컴퓨터의 mysql서버에 넣고 안드로이드 스마트폰으로 유저서버 데이터와 문자열들을 받아서 출력하고
유저서버와 안드로이드 디바이스와 연결하게끔해서 유저서버의 캠의 영상을 스마트폰으로 보여주는게 전부이고
리눅스에서 구현하고자 하는것은 메인서버가 유일함으로 지금 보고있는 책을 레퍼런스처럼 참조 하고 몇일만 투자한다면 얼마 안걸릴것을 나도 알고 있다.
하지만 리눅스에 대해서 기본이라도 알고 한번 훑어본후에 끄적이는것과 무턱대고 내가 필요한것만 찾아서 만드는것의 차이가 없지 않을것이라고 생각해서 처음부터 보고있었다.
졸업작품도 어느정도 기본 뼈대는 만들어놨고 방학동안 영어공부 말고 딱히 정해놓고 하는것이 없기에 시간에 여유가 조금 있다고 생각하고 급하다고 서둘러 봤자 금방 될겄같은게 없어 급한거 없이 이렇게 능률 없게 하고 있는것인지도 모르겠다.
하지만 책을 보면 본챕터를 제외하면 C, mysql, TCP/IP에 대한 내용이 거의 다이고 파일처리, 프로세스, 스레드, GUI프로그래밍등이 있는데 물론 사용법이 윈도우랑 같을리 없겠지만 이론정도는 비슷할것 같다고 생각된다.
이제 지금 보는 한챕터 빼고는 좀더 빠르게 진행할수 있을것 같은데 진행 방향을 변경하는것도 조금 그래서 쉘 프로그래밍도 마저 하기로 했다.
능률 없이 하는거 처럼보여도 시간이 남아서 그러나 보다라고 생각하시길
쉘 프로그래밍은 앞서 사용했던 명령어들을 연장해서 다양한 명령을 만들수 있지만 더 길고 연속적인 명령을 실행하기 위해 명령들을 프로그래밍화해서 파일에 저장하고 실행할수 있게 한것을 쉘 스크립트 파일 쉘 프로그램이라고 한다.
.bash_profile이나 .hashrc도 일종의 쉘 스크립트 파일이라고 할수있다.
쉘 스크립트의 장점은 컴파일을 할필요가 없다는 것이고 이식하거나 확장하기도 쉽다.
쉘 스크립트를 실행하는 방법은 sh 스크립트파일과 . 스크립트파일이 있다.
sh는 하위 쉘을 생성해서 실행한다 따라서 변경된 변수는 내부에서 설정되고 끝이나면 사라진다.
. 으로 실행하는경우는 현재 쉘에서 실행하기 때문에 변수 값들이 계속 유지하게 된다.
또다른 방법으로 chmod +x 명령어로 실행 가능한 상태로 만들고 직접 실행하는것으로
$chmod +x hello.sh
$./hello.sh
방식으로 하면된다.
책에 이방법은 하위 쉘을 만드는건지 해당쉘에서 실행하는건지 안나와 있어서 해보니 하위 쉘을 만들어서 할때처럼 변경된 변수가 없어졌다.
직접실행과 sh명령은 하위쉘로 "."명령어는 현재 쉘로 실행한다.
쉘 또한 변수를 두고 정보를 저장 연산을 하게된다. 그리고 명령어 인자 등을 가리키는데 주로 쓰이는 특별한 매개변수들이 있다.
$# 인자들의 수
$* 모든 인자들
$@ $*과 유사. 인용부호를 고려한 모든 인자 목록
$0 , $1... 각각 명령 라인 인자를 가리킴. $0은 명령어 자체
$? 이전 수행 명령의 반환값
$$ 쉘의 프로세스 ID
$! 이전 백그라운드 명령의 프로세스 ID
$- set 명령에 의해 할당된 쉘 옵션
이 내용을 이해하기 위해서 예제를 하나 해봐야 되는데 이놈에 책 예제는 한번에 되는게 하나도 없어 망할 저자 ㅠㅠ
인터넷을 검색 결과 인자를 넣어서 실행할때 sh args.sh arg1 arg2처럼 뒤에 인자를 넣어줘야 한다고 한다. 그런데 왜 책에는 아무런 설명이 없이 실행 결과만 보여주는걸까. 인자 넣어서 실행하는거 쯤은 당연히 알고 있다고 생각하는걸까...자세히 살펴보니 프롬프트만 적어놓고 명령어를 안적어 놓은 라인이 두줄있는것으로 보아 명령어 입력 부분이 누락된거 같다.
변수는 보통 문자열로 취급하며 환경 변수를 설정하는 것처럼
변수이름 = 값 으로 대입하여 만들수 있다
만들어진 쉘 변수는 이름 앞에 "$"를 붙여 변수값을 참조할 수 있다.
변수 연산의 종류로는
$변수 변수값을 출력
${변수} 변수를 일부로 번역
${변수:-word} 설정되어 있으면 변수 값을, 그렇지 않으면 word값으로 출력
${변수:=word} 설정되어 있지 않으면 변수에 word를 입력하고 출력
${변수:+word} 변수가 설정되었을때만 word값으로 출력 인자들의 수 //실행해보면 변수가 설정되었을때만 word가 출력되는데 되에 인자들의 수가 뭘뜻하는지 모르겠다
${변수:?메시지} 변수가 설정 되어 있으면 변수 값을 출력하고, 그렇지않다면 표준오류 메세지로 메세지를 출력하고 쉘은 종료. 만일 메시지가 생략되면 그 대신 표준오류 메시지가 표시됨.
12시가 넘으면 자야하는 병에 걸려서 오늘도 짧게 하고 자야겠다. 하는 내용은 쥐똥인데 예제가 막혀서 알아보는데 몇십분이 날라가버려서 안그래도 느린 진행이 꼼지락 꼼지락 거리고 있다.
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.