리눅스 shell을 배워보자 2일차 - pushd, popd, printf, read, while..do..done, 실행파일 사용 4가지 방법

0

linux_shell

목록 보기
2/3

이번에는 pushd, popd, printf, read, while..do..done, 실행파일 사용 4가지 방법에 대해서 정리한다.

1. pushd, popd 명령어

pushd명령어는 파리미터로 입력된 경로를 스택에 저장한다. popd는 스택에서 예전 경로를 꺼내 이 경로로 이동한다.

가령 다음과 같은 예시를 보도록 하자.

cd /usr/local/bin

현재의 경로는 /usr/local/bin이다. 그런데, /bin폴더로 가야한다고 하자, 갔다가 다시 /usr/local/bin으로 돌아와야 하는데, 다시 cd명령어를 반복하는 것은 불필요한 일이다. 따라서, 우리는 pushd/usr/local/bin 경로를 스택에 저장하고, popd로 되돌아 가보도록 해보자.

현재 경로, /usr/local/bin

pushd .
cd /bin/

이제 다시 /usr/local/bin폴더로 돌아와 보자.

popd

결과로 /usr/local/bin가 나오고 아주 간단하게 이전의 경로로 돌아왔음을 알 수 있다.

또한, 스택이기 때문에 여러가지 경로를 저장하고, 꺼내쓸 수 있다.

이것뿐만 아니라, cd -도 사용할 수 있다. cd -는 리모컨의 이전 채널로 돌리기 기능과 같다. 이전의 경로로 이동하고, 계속 왔다갔다 할 수 있다.

cd -

2. printf

echo명령과는 달리 printf는 형식화된 출력이 가능하다.

printf "%05d\n" 1

이러한 printf의 기능을 이용하여, 변수들을 조합해 하나의 문자열을 만들 수 있다.

name=michael
printf -v legend "%s jackson" $name
echo $legend

name=michael은 변수의 선언이다. 공백 문자없이 넣어야하는 것이 포인트이다. 단, 변수를 선언할 때는 $을 쓰지 않아도 되지만, 변수르 사용할 때는 $을 붙여야 한다. 안쓰면 문자취급이 된다.

결과로 michael jackson이 나온다. printf-v옵션은 변수를 선언하겠다는 것이고, 변수가 legend이다. legend변수에 "%s jackson"라는 형식화된 문자열이 들어가는데, %s가 바로 이전에 선언한 $name이 되는 것이다.

그래서, legend라는 변수에 michael jackson이 들어가게 된 것이다.

3. read

echo, printf가 화면 출력이라면, read는 사용자로 부터 입력을 받는다.

read num

그 다음 아무 숫자를 입력해주면 num이라는 변수에 입력되게 된다.

12345
echo $num

결과로 12345가 나온다.

1. -p옵션으로 설명 추가하기

또한, -p옵션도 사용할 수 있는데, 설명을 덧붙여주는 기능을 한다.

read -p "what is your phone number:" v
what is your phone number:010-1111-1111
echo $v

결과로 010-1111-1111가 나온다.

2. -n옵션으로 사용자가 입력받는 문자 수를 제한하기

yes, no정보를 받고 싶은데, y, n로 받으려면 문자 수를 제한해야한다.

read -n 1 -p "yes or no (y/n)" ans
echo $ans

결과로 입력받은 문자가 나오는데, 이전처럼 엔터를 쳐서 입력을 끝내는 것이 아니라, 정해진 문자를 받으면 자동으로 종료된다. 여기서는 1개의 문자를 받으니 종료된다.

3. -s옵션으로 불필요한 echo 정보 삭제하기

-s는 silent옵션으로 우리가 read명령어로 정보를 입력받을 때, 자동으로 입력받은 정보를 echo하는 것을 막는다.

read -s -n 1 -p "Are you over 16?" v

즉, 우리가 입력한 정보를 화면에 보이지 않게한다. 비밀번호 같은 것을 입력하는 것에 굉장히 큰 기능이다.

4. -t옵션으로 정해진 시간안에 입력을 받도록 하기

-t옵션으로 입력을 받을 때, 정해진 시간이 끝나면 입력을 종료하도록 한다.

read -s -n 1 -t 3 -p "Are you over 16?" v

다음과 같이 입력한 후 3초 이상을 기다리면, 자동으로 종료된다.

4. while..do..done

shell에서도 loop문을 구현할 수 있다.

먼저 예제를 보고 명령어를 분석해보자

no=1; while (( no < 10 )); do printf "%02d\n" $no; ((no++)); done

결과

01
02
03
04
05
06
07
08
09

숫자들이 화면에 출력된다.

no=1; while (( no < 10 )); do printf "%02d\n" $no; ((no++)); done

no라는 변수가 1로 선언되고, while에서 루프를 돌게된다.

while의 기본 문법은 while ... do ... done으로 되어있다.

while (( test )); do 반복; done

test에서 평가가 먼저 이루어진다. 평가가 참인 경우에 한해서 do, done이 작동한다. do아래에 있는 반복 명령어를 실행한다. done을 만나면 반복이 끝나서 다시 test 평가문으로 간다.

참고로 (())는 산술 연산 문으로 대소비교, 산술연산 등이 작동할 때 사용된다.

5. 실행파일 사용 4가지 방법

간단한 스크립트 파일을 작성해보자.

echo 'echo hello world' > helloworld.sh
chmod +x helloworld.sh
./helloworld.sh

결과로 다음과 같이 나온다.

hello world

echo 'echo hello world' > helloworld.sh 명령어를 통해서, 'echo hello world' 명령어가 담긴 helloworld.sh 파일을 만들었다.

만들어진 파일은 실행 속성이 없기 때문에 chmod +x helloworld.sh을 해주어야 한다.

./helloworld.sh을 하면 실행이 자동으로되며, 입력된 명령어를 순차적으로 실행하게 된다.

지금은 helloworld.sh 파일이 현재 경로에 있기 때문에 사용할 수 있는 것이지만, echo, read, printf 등과 같이 어디서든 편하게 명령어를 사용하려면 어떻게 해야할까??

1. /usr/bin에서 실행하기

/usr/bin에 해당 파일을 복사하도록 한다. 참고로 /usr/bin은 시스템 관리 영역이기 때문에 root권한을 받아야 한다. 따라서 sudo를 통해서 루트 권한을 받아야 복사가 된다.

복사 명령어 cp 는 다음과 같다.

cp 원본 사본

원본, 사본앞에 경로를 붙여서 사용할 수 있음을 알아두자.

sudo cp helloworld.sh /usr/bin

비밀번호를 묻게되고, root비밀번호를 제대로 입력했다면 문제없이 복사되었을 것이다.

그리고 이제는 ./helloworld.sh 처럼 현재 폴더에 해당 파일이 있을 때만 실행되는 것이 아니라, helloworld.sh라고 입력하면 실행된다.

그냥, hello정도 입력하고 tab누르면 자동으로 입력된다.

helloworld.sh

2. 실행파일의 전체 경로를 표현하기

가장 원시적인 방법으로 전체 경로를 표현해서 적어주면 된다.

가령, helloworld.sh파일이 /home/user/Desktop/shell_cmd/안에 있다면

/home/user/Desktop/shell_cmd/helloworld.sh

라고 써주면된다.

3. 실행파일의 경로를 환경변수에 추가히기

환경변수에 추가하여 사용하도록 하는 방법이다. 환경변수 경로에 내가 실행하고자 하는 파일의 경로를 추가하게되면, 위의 2번과 같이 전체 path를 다 적어줄 필요없이 파일이름만 적어도 실행이 된다.

현재 환경변수의 PATH가 어딘 지 확인하기 위해서는 echo를 해주면 된다.

echo $PATH

다음처럼 결과가 나올 것이다.

/home/user/bin:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/bin

이 경로들 모두 환경변수들로 설정된 경로들이다. 이제 이 경로에 우리의 파일이 있는 폴더의 경로를 넣어주면 된다. 경로들이 :로 분리되어 있으므로, 우리도 기존 PATH:을 추가하여 우리가 실행할 실행파일의 경로를 넣어주면 된다.

현재 hellowordl.sh 파일이 Desktop/shell_cmd/폴더 아래에 있다면, 다음과 같이 써준다.

PATH=$PATH:~/Desktop/shell_md

PATH는 굉장히 조심히 다루어야 하므로 잘 적어주자. 만약 이전에 /usr/binhelloworld.sh 파일을 넣었다면 sudo rm /usr/bin/helloworld.sh을 지우고 나서 실행해보자.

helloworld.sh

잘 실행된다면 성공이다.

단 다음과 같이 경로에 추가하여 사용하는 방식은 영속적이지는 않다. 즉, 매번 로그인하여 접속할 때마다 경로를 추가해야한다. 그렇지 않기 위해서는 bashrc에 PATH을 추가하여 적어주면 되는데, 이건 다음에 하도록 하자.

4. 현재 경로에 있을 때 사용하는 방식

가장 간단한 방식으로, 현재 경로에 있다는 것을 알려주기 위해 ./을 붙여주어야 한다.

./helloworld.sh

0개의 댓글