프로그램언어+/Shell Script&Linux

쉘스크립트 기본명령어들[스크랩 파일모음]

logthink 2018. 8. 15. 23:09
비교 연산자
(참조 : https://m.blog.naver.com/PostView.nhn?blogId=beabeak&logNo=221326956412&targetKeyword=&targetRecommendationCode=1)

[ 정수 비교 ]

 연산자

의미 

표현 

-eq

(같음)

if [ $a -eq $b ]

-ne

(같지 않음)

if [ $a -ne $b ]

-gt

(보다 큼)

if [ $a -gt $b ]

-ge

(크거나 같음)

if [ $a -ge $b ]

-lt

(보다 작음)

if [ $a -lt $b ]

-le

(작거나 같음)

if [ $a -le $b ]

>

(보다 큼)

(($a > $b))

>=

(크거나 같음)

(($a >= $b))

<

(보다 작음)

(($a < $b))

<=

(작거나 같음)

(($a <= $b))


[ 문자열 비교 ]

 연산자

의미 

표현

=

(같음) 

if [ "$a" = "$b" ]

==

(같음)

if [ "$a" == "$b" ]

!= 

(같지 않음)

if [ "$a" != "$b" ]

-z

(문자열이 "null"임. 길이가 0)

if [ -z "$a" ]

! -z

(문자열이 "null"이 아님.)

if [ ! -z "$a" ]

-n

(문자열이 "null"이 아님.) 

if [ -n "$a" ]

>

(ASCII값이 보다 큼.)

if [[ "$a" > "$b" ]]

if [ "$a" \> "$b" ]

<

(ASCII값이 보다 작음.)

if [[ "$a" < "$b" ]]

if [ "$a" \< "$b" ]

참고

 

 

[[ "$a" == a* ]]

$a 가 "a"로 시작하면 참 (패턴 매칭)

[[ "$a" == "a*" ]]

$a 가 "a*" 와 같다면 참

[ "$a" == a* ]

잘못된 표현

[ "$a" == "a*" ]

$a 가 "a*" 와 같다면 참


[ 복합 비교 ]

 연산자

의미 

표현 

-a

(논리 and)

if [ $a -eq 0 -a $b -eq 1 ]

-o

(논리 or)

if [ $a -eq 0 -o $b -eq 1 ]

&&

(논리 and)

if [ $a -eq 0 ] && [ $b -eq 1 ]

if [[ $a -eq 0 && $b -eq 1 ]]

||

(논리 or)

if [ $a -eq 0 ] || [ $b -eq 1 ]

if [[ $a -eq 0 || $b -eq 1 ]]


[ 파일 비교 ]

 연산자

의미 

표현 

-d

Directory

if [ -d FILE ]

-f

File

if [ -f FILE ]

-e

Exist

if [ -e FILE ]

-r

Readable

if [ -r FILE ]

-w

Writable

if [ -w FILE ]

-x

Execuable

if [ -x FILE ]

-s


if [ -s FILE ]

-O

Same Owner

if [ -O FILE ]

-G

Same Group

if [ -G FILE ]

-nt

Newer Than

if [ FILE1 -nt FILE2 ]

-ot

Older Than

if [ FILE1 -ot FILE2 ]




참조 : http://btyy.tistory.com/43?category=608614

※ find & grep



1. find


- 특정 파일을 검색 할 때 사용한다.

( 해당 경로 제일 하위까지 모두 검색한다 )


- 옵션은 여러개 중첩해서 사용 할 수 있다.


find <path> <option> ...



-name <value>

#>find /etc -name "passwd"


-print    검색한 내용을 이름만 보는 방식

#>find /etc -name "passwd" -print

( -print 옵션은 기본값으로 설정 되있어서 적어주지 않아도 똑같이 출력 된다 )


-ls    검색한 내용을 자세히 보는 방식

#>find /etc -name "passwd" -ls


-delete    검색한 내용을 삭제

#>find /etc -name "passwd" -delete


-empty    검색한 내용 중에서 비어있는 파일만 보여주는 방식

#>find /etc -name "passwd" -empty



-type <value> : 해당 타입만 출력한다.

-type d    디렉터리 파일

-type f    일반 파일

-type l    링크 파일

-type b    장치 파일


ex) #>find /root -name "test" -type d -ls

( /root에서 이름이 test인 디렉터리 파일을 자세히 본다 )


* 파일은 이 외에도 종류가 더 있지만 위에는 자주 쓰이는 것들이다.



-exec <command> {} \;

#>mv 찾은파일 /tmp

#>find /root -name "test" -type f -exec mv 찾은파일 /tmp \;


* -exec를 사용할때는 항상 \;로 끝내준다.

{} 안에는 찾은 파일들이 들어간다.



( -type과 -exec 옵션을 이용해서 이름이 test인 파일을 찾아서 삭제한걸 볼 수 있다 )




-size n ( +n | n | -n )

#>find /etc -size 2535c ( c는 바이트 단위를 나타낸다 )


* n에 붙는 +, -는 n보다 크기가 크거나 작은걸 찾을때 사용한다.



( find 명령어에 -size 옵션을 이용해서 /etc 디렉터리 안에 있는 2535바이트 파일을 찾았다 )




-user <user_name>

-group <group_name>




-perm <octal> : 해당 권한을 가지고 있는 모든 파일을 찾는다.



( -perm을 이용해 /home 디렉터리 안에 권한이 700인 파일들을 찾았다 )


* 권한을 표시하는 octal앞에 - 를 붙여주면 해당 설정 권한이 모두 있는 파일들을 전부 출력한다.

ex) #>find /home -perm -700 -ls

( 파일 권한 중에 소유자 권한이 rwx만 만족한다면 

그룹권한과 다른 사용자 권한은 상관하지 않고 모두 출력한다 )




-atime n    :    n일 이전에 접근한 파일

( 하루가 지나거나 내용이 수정 되었을때 접근 시간이 바뀐다 )

-mtime n    :    n일 이전에 내용이 수정된 파일

-ctime n    :    n일 이전에 속성이 수정된 파일



( stat 명령어를 이용해서 파일을 확인하면 atime, mtime, ctime을 확인 할 수 있다 )



* 하루 이전은 n앞에 -를 붙여주고 하루 이후는 부호를 붙이지 않는다.



-inum n    :    아이노드를 이용해서 검색하는 방법



( 위에 stat file1에서 확인 해보면 file1의 아이노드가 위와 같기 때문에 

아이노드를 이용해 file1을 찾았다 )





2. grep


- 파일에서 내용으로 검색한다.


-r <value>    기본값으로 -r을 빼도 똑같은 결과가 나온다.

-c <value>    해당 value 값이 들어간 라인 수를 출력한다.



-i <value>    대소문자 상관없이 검색한다.



-n <value>    해당 value의 줄번호와 같이 출력된다.

-v <value>    해당 value가 들어가있지 않은 라인만 출력한다.


* 옵션을 중첩 사용은 -i -n이나 -in 둘다 사용이 가능하다.



표준에러

(참조 : http://linuxism.tistory.com/367)

shell(#mode)에서 간단하게 명령어를 통해 테스트를 진행하면서 "/dev/null 2>&1"의 의미를 알아본다,

아래 명령어는 표준 출력을 /dev/null로 redirection 하라는 의미로 표준출력을 버리라는 의미다,

# rm test > /dev/null


하지만, test라는 file이 존재하지 않는 경우 아래와 같은 표준에러가 출력된다,

# rm test > /dev/null
rm: cannot remove 'test': No such file or directory


방금 언급했지만, 이것은 "표준출력"이 아닌 "표준에러"이기 때문에 화면에 출력이 된것이다, 
다시 강조하면 /dev/null 로 redirection 을 통해 화면 출력을 하지 않는것은 표준출력에 한해서 해당된다.


자 그렇다면, 표준에러를 버리고 싶다면 아래와 같이 사용하도록 하자,

# rm test > /dev/null 2>&1


2>&1 는 표준에러를 표준출력으로 redirection 하라는 의미다.
(0, 1, 2는 각각 표준입력, 표준출력, 그리고 표준에러를 의미)


정리하면 "rm test"의 표준출력을 /dev/null로 버리는데, 표준에러는 표준출력으로 redirection한다. 

결국 결과는 표준출력이 되기 때문에 /dev/null로 버려지고, 화면에 결과가 뿌려지지 않게 되는 것이다.


/dev/null과 2>&1를 같이 사용하지 않는 경우 위의 예제는 결국 표준출력되기 때문에 화면에 에러 내용이 출력된다,


http://gsk121.tistory.com/248?category=804375