이번에는 pushd, popd, printf, read, while..do..done, 실행파일 사용 4가지 방법
에 대해서 정리한다.
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 -
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
이 들어가게 된 것이다.
echo, printf
가 화면 출력이라면, read
는 사용자로 부터 입력을 받는다.
read num
그 다음 아무 숫자를 입력해주면 num
이라는 변수에 입력되게 된다.
12345
echo $num
결과로 12345
가 나온다.
-p
옵션으로 설명 추가하기또한, -p
옵션도 사용할 수 있는데, 설명을 덧붙여주는 기능을 한다.
read -p "what is your phone number:" v
what is your phone number:010-1111-1111
echo $v
결과로 010-1111-1111
가 나온다.
-n
옵션으로 사용자가 입력받는 문자 수를 제한하기yes, no
정보를 받고 싶은데, y, n
로 받으려면 문자 수를 제한해야한다.
read -n 1 -p "yes or no (y/n)" ans
echo $ans
결과로 입력받은 문자가 나오는데, 이전처럼 엔터를 쳐서 입력을 끝내는 것이 아니라, 정해진 문자를 받으면 자동으로 종료된다. 여기서는 1개의 문자를 받으니 종료된다.
-s
옵션으로 불필요한 echo 정보 삭제하기-s
는 silent옵션으로 우리가 read
명령어로 정보를 입력받을 때, 자동으로 입력받은 정보를 echo
하는 것을 막는다.
read -s -n 1 -p "Are you over 16?" v
즉, 우리가 입력한 정보를 화면에 보이지 않게한다. 비밀번호 같은 것을 입력하는 것에 굉장히 큰 기능이다.
-t
옵션으로 정해진 시간안에 입력을 받도록 하기-t
옵션으로 입력을 받을 때, 정해진 시간이 끝나면 입력을 종료하도록 한다.
read -s -n 1 -t 3 -p "Are you over 16?" v
다음과 같이 입력한 후 3초 이상을 기다리면, 자동으로 종료된다.
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 평가문
으로 간다.
참고로 (())
는 산술 연산 문으로 대소비교, 산술연산 등이 작동할 때 사용된다.
간단한 스크립트 파일을 작성해보자.
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 등
과 같이 어디서든 편하게 명령어를 사용하려면 어떻게 해야할까??
/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
가장 원시적인 방법으로 전체 경로를 표현해서 적어주면 된다.
가령, helloworld.sh
파일이 /home/user/Desktop/shell_cmd/
안에 있다면
/home/user/Desktop/shell_cmd/helloworld.sh
라고 써주면된다.
환경변수에 추가하여 사용하도록 하는 방법이다. 환경변수 경로에 내가 실행하고자 하는 파일의 경로를 추가하게되면, 위의 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/bin
에 helloworld.sh
파일을 넣었다면 sudo rm /usr/bin/helloworld.sh
을 지우고 나서 실행해보자.
helloworld.sh
잘 실행된다면 성공이다.
단 다음과 같이 경로에 추가하여 사용하는 방식은 영속적이지는 않다. 즉, 매번 로그인하여 접속할 때마다 경로를 추가해야한다. 그렇지 않기 위해서는 bashrc
에 PATH을 추가하여 적어주면 되는데, 이건 다음에 하도록 하자.
가장 간단한 방식으로, 현재 경로에 있다는 것을 알려주기 위해 ./
을 붙여주어야 한다.
./helloworld.sh