dukDukz

[Linux] 조건문(if) / 매개변수 / for문 / find 본문

웹 개발/Linux

[Linux] 조건문(if) / 매개변수 / for문 / find

헤일리_HJ 2021. 8. 31. 14:49

# 쉘 스크립트 IF 문

$ vi practice7.sh
if [ 1 조건 2 ]
then
code block
else
code block
fi      	# if 문 끝났을 때


조건 비교연산자
숫자일때와 문자열일때 다르다
1 === 1
"$A" == "$B"

 

어떤 비교가 가능한가?
1)  숫자비교
2)  해당 폴더에 디렉토리가 있는가. 있다면 파일을 만들어달라 -> 이런식으로.. 파일체크 디렉토리 체크

 


# if 문 옆에 비교연산자가 안들어가도 가능하다

if ls -l
then
echo "디렉토리 보기"
fi

이렇게 저장하고 

$ sh practice7.sh

ls -l 이 실행되고 디렉토리 보기 까지 출력된다.

 

 


# 숫자 비교 / 셸 스크립트 비교 연산자

# 1 < 2

if [ 1 -gt 2 ]
then
        echo "참"
else
        echo "거짓"
fi

exit 0
비교 연산자 비교 연산자
-eq <
-ne <=
-gt >
-ge >=
-lt ==, =
-le !=

외우기보다는 숫자를 이렇게 비교하는구나.. 손의 감각만 익혀놓기

연습은 practice8.sh 에서 했음

 


 

# [ if 문 ] 특정 폴더가 존재 하는지 

scripts 폴더안에 log 라는 폴더가 있는가?

$ vi practice9.sh
if [ -d ~/scripts/log ]
then
echo "폴더가 존재"
else
echo "폴더가 없음"
fi

exit 0

 

-d 를 통해 알아 볼 수 있다.

 

폴더가 없음이 나왔다.

 


# [ if 문 ]특정 폴더가 없는 경우 만들어주기

- d 사용 : 디렉토리가 있는가?

if [ -d ~/scripts/log ]
then
        echo "폴더가 존재합니다"
else
        echo "폴더가 존재하지 않습니다"
        echo "폴더 생성 중.."
        mkdir ~/scripts/log
        echo "폴더 생성 완료..!"
fi

exit 0
$ sh practice9.sh

mkdir /log

하면 그 명령어를 적은 해당 위치에 폴더가 생성된다.

원하는 위치가 따로 있을 경우에는 위에 처럼 정확한 위치를 적어주면 된다.

~ 는 home 이다.

 

 

 

이런게 node js 에서도 가능하긴 하지만
코드 길이나 이런면에서 효율적이지 않다!

 


# [ if 문 ] 파일 찾기 (검색)

-f 사용 : 파일이 있는가?

$ vi practice10.sh
if [ -f ~/scripts/log/test.sh ]
then
        echo "파일이 있습니다"
else
        echo "파일이 없습니다"
fi

exit 0

처음에는 파일이 없습니다. 가 나온다.

 

sh 파일에서는 vi 명령어가 실행이 안되기 때문에

/log 안에 들어가서 $ vi test.sh 만들어주고

다시 scripts 폴더로 돌아와서
$ sh practice10.sh
하면 파일이 있습니다가 나온다.

 

 


# [ if 문 ] sh 파일 안에서 특정 파일 생성하기

if [ -f ~/scripts/log/log.txt ]
then
        echo "파일이 있습니다"
else
        echo "파일이 없습니다"
        echo "파일을 생성중입니다"
        echo "hello" > log.txt				# sh 를 실행한 폴더에 생기게 된다
        echo "log.txt 파일을 생성했습니다"
fi

exit 0

echo 로 hello를 출력한것을 log.txt 로 만들겠다

혹은 파일 위치를 정해줄 수 있다,

echo "hello" > ~/scripts/log/log.txt

# 셸 스크립트 매개변수로 전달 받는 방법

vi practice11.sh 생성하고

 

1) 매개변수 1개

echo $1

매개변수로 전달 받는 방법 : $1

$ sh practice11.sh HELLO

 

하면 HELLO 가 출력됨

 

입력 받을 때 한 칸 띄우면 또 다른 매개변수로 인식하는데 그것도 받아 주고 싶다면?

 


 

2) 매개변수 2개

echo $1
echo $2

저장하고

$ sh practice11.sh HELLO WORLD

 

하면 HELLO WORLD 나옴



하나씩 추가하려면 숫자를 늘려주면 된다 $3 $4 이렇게

 


# [ for 문 ] 문자

$ vi practice12.sh

for v in $list
do
        echo $v
done


어디부터 어디까지 어떤식으로..

do 이후부터 for 문 돌릴거고, 끝났다면 done 으로 표시해줘야함

 

$ sh practice12.sh

하면 문자 요소가 한글자씩 나온다

 

 


# [ for 문 ] 숫자 (배열..?)

array=(1 3 5 7 9)

for item in ${array[@]}
do
        echo $item
done

 

-> 실행할때는 sh 가 아니라
bash practice12.sh 로 해야한다.
zsh practice12.sh

 

$ bash practice12.sh

# 혹은
$ zsh practice12.sh

이렇게 실행시켜야 한다.

 


# [ for 문 ] 기존 for 문

for((i=0; i<=10; i++))
do
        echo $i
done

저장하고 나와서

$ bash practice12.sh

# 혹은
$ zsh practice12.sh

이렇게 실행시켜야 한다.

 


# [ find ] 검색

$ find ./text.txt

현재 위치에서 검색


# [ find ] 모든 디렉토리에서 찾는 명령어

 

$ find / -name node

전체 디렉토리에서 node 라는 애들을 다 찾는다.

 

[옵션]

1) type 이 file 인것만 
find / -type f -name node

2) 특정 확장자
find / -type f -name "*.js"

3) 특정 위치에서
find ~/ -type f -name "*.js"
find ~/ -type f -name "server.js"

 


# [ find ] find 하면서 mv (찾으면서 파일 이동)

$ mv ./log.txt ./log/log.txt
이동시킴

$ mv ./log.txt ../log.txt
이동시킴

이거를 find 로 찾으면서 옮기는 방법이 있다.
어딨는지 모르는 파일을 옮길때 쓰는 방법이라고 할 수 있다.


find ~/ -type f -exec mv ./log.txt ./log/log.txt -name "log.txt"
- 지금 안됨


앞에 - 가 붙게 되면 순서는 상관없음 type을 먼저 쓰든 name 을 먼저 쓰든... 옵션순서는 상관 없음