본문 바로가기
기타 활동/영어공부

bash -- Standard Shell

by ★용호★ 2014. 12. 21.

원문 : http://devmanual.gentoo.org/tools-reference/bash/index.html

 

 

bash -- Standard Shell

A thorough understanding of bash programming is vital when working with ebuilds.

bash 프로그래밍을 철저히 이해하는 것은 ebuilds로 작업을 할때 필수적이다. 


* A through : 빈틉없는, 철두철미한

* vital : 필수적인


bash Conditionals


Basic Selection


기본 조건 연산자인 if 문 :

 

 

if something ; then

    do_stuff

fi

 


 

Multiple Selection


Multiple pronged selection can be done using else and elif:

다양한 선택의 분기를 else와 elif를 사용하여 할 수 있다 :

 

* pronged : 가닥이 진, 갈래진

 

 

if something ; then

    do_stuff

elif something_else ; then

    do_other_stuff

elif full_moon ; then

    howl

else

    turn_into_a_newt

fi

 

 

 

주의 : 각각의 블럭 안에 최소한 하나의 문장은 명시를 해야한다. 다음에 오는 작업은 수행되지 않는다.

specify : (구체적으로) 명시하다.


 

 

if some_stuff ; then

    # A statement is required here. a blank or a comment

    # isn't enough!

else

    einfo "Not some stuff"

fi

 


 

If you really don't want to restructure the block, you can use a single colon (:) on its own as a null statement.

정말로 위 블럭 구조를 변경하길 원치 않는 다면 싱글 콜론(:)을 사용할 수도 있다. 

 

 

if some_stuff ; then

    # Do nothing

    :

else

    einfo "Not some stuff"

fi

 

 

 

Selection Tests


To do comparisons or file attribute tests, [ ] or [[ ]] blocks are needed.

비교 또는 파일 속성 테스를 하기 위해서는 [] 또는 [[]] 블럭이 필요하다.

 

 

 

# is $foo zero length?

if [[ -z "${foo}" ]] ; then

    die "Please set foo"

fi


# is $foo equal to "moo"?

if [[ "${foo}" == "moo" ]] ; then

    einfo "Hello Larry"

fi


# does "${ROOT}/etc/deleteme" exist?

if [[ -f "${ROOT}/etc/deleteme" ]] ; then

    einfo "Please delete ${ROOT}/etc/readme manually!"

fi

 


 

Single versus Double Brackets in bash


Important: The [[ ]] form is generally safer than [ ] and should be used in all new code.

중요 : [[]] 형식은 일반적으로 [] 보다 안전하고 모든 새로운 코드에 사용 되어야 한다. 


This is because [[ ]] is a bash syntax construct, whereas [ ] is a program which happens to be implemented as an internal -- as such, cleaner syntax is possible with the former. For a simple illustration, consider:

왜냐하면 [[]]는 bash 문법 구조이고 []는 내부 실행으로 발생되는 하나의 프로그램이다. -- 흔히 말하는 cleaner syntax는 이전에 가능 했다.  

간단한 예를 통해 보자 : 

 

* whereas : 두 가지 사실을 비교/대조 할 때 씀

* implement : 시행하다.

* illustration : 예/보기

 

 

bash$ [ -n $foo ] && [ -z $foo ] && echo "huh?"

huh?

bash$ [[ -n $foo ]] && [[ -z $foo ]] && echo "huh?"

bash$

 



 

String Comparison in bash

bash 에서의 문자열 비교


The general form of a string comparison is string1 operator string2. The following are available:

문자열 비교의 일반적인 형식은 string1 operator string2 이다. 다음을 사용할 수 있다.:


Operator Purpose

== (also =) String equality

!= String inequality

< String lexiographic comparison (before)

> String lexiographic comparison (after)

=~ String regular expression match (bash 3 only, not currently allowed in ebuilds)


String Test in bash

bash에서의 문자열 테스트


The general form of string tests is -operator "string". The following are available:

문자열 테스트의 일반적인 형식은 -operator "string"이다. 다음을 사용할 수 있다.:

Operator Purpose

-z "string" String has zero length

-n "string" String has non-zero length

 

 

Note: To check whether a variable is set and not blank, use -n "${BLAH}" rather than -n $BLAH. The latter will cause problems in some situations if the variable is unset.

노트 : 값이 set 되어 있고 비어있지 않은 지 체크하기 위해서 -n $BLAH 보다는 -n "${BLAH}"를 사용한다.

 


 

Integer Comparison in bash

bash 에서의 정수 비교


The general form of integer comparisons is int1 -operator int2. The following are available:

정수 비교의 일반적인 형식은 int1 -operator int2이다. 다음을 사용할 수 있다.:

Operator Purpose

-eq Integer equality

-ne Integer inequality

-lt Integer less than

-le Integer less than or equal to

-gt Integer greater than

-ge Integer greater than or equal to


File Tests in bash

bash 에서의 File 테스트


The general form of a file test is -operator "filename". The following are available (lifted from man bash):

파일 테스트의 일반적인 형식은 -operator "filename"이다. 


Operator Purpose

-a file Exists (use -e instead)

-b file Exists and is a block special file

-c file Exists and is a character special file

-d file Exists and is a directory

-e file Exists

-f file Exists and is a regular file

-g file Exists and is set-group-id

-h file Exists and is a symbolic link

-k file Exists and its sticky bit is set

-p file Exists and is a named pipe (FIFO)

-r file Exists and is readable

-s file Exists and has a size greater than zero

-t fd Descriptor fd is open and refers to a terminal

-u file Exists and its set-user-id bit is set

-w file Exists and is writable

-x file Exists and is executable

-O file Exists and is owned by the effective user id

-G file Exists and is owned by the effective group id

-L file Exists and is a symbolic link

-S file Exists and is a socket

-N file Exists and has been modified since it was last read


File Comparison in bash

bash 에서의 File 비교


The general form of a file comparison is "file1" -operator "file2". The following are available (lifted from man bash):

file 비교의 일반적인 형식은 "file1" -operator "file2"이다. 


Operator Purpose

file1 -nt file2 file1 is newer (according to modification date) than file2, or if file1 exists and file2 does not.

file1 -ot file2 file1 is older than file2, or if file2 exists and file1 does not.

file1 -ef file2 file1 and file2 refer to the same device and inode numbers.


Boolean Algebra in bash


There are constructs available for boolean algebra ('and', 'or' and 'not'). These are used outside of the [[ ]] blocks. For operator precedence, use ( ).

bool 대수('and', 'or', 'not')를 사용가능한 구조가 있다. [[]] 블럭의 바깥에 사용한다. operator 이전에 () 를 사용한다. 


Construct Effect

first || second first or second (short circuit)

first && second first and second (short circuit)

! condition not condition

 

Note: These will also sometimes work inside [[ ]] constructs, and using ! before a test is fairly common. [[ ! -f foo ]] && bar is fine. However, there are catches -- [[ -f foo && bar ]] will not work properly, since commands cannot be run inside [[ ]] blocks.

노트 : 이는 또한 때때로 [[]] 구조 안쪽에 쓰이고 꽤 흔하게 test 문법 앞에 !를 사용한다. [[ ! -f foo ]] && bar는 적절하다. 그러나 [[ -f foo && bar ]] 는 적절하지 않다. [[]] 블럭 안쪽에서 수행할 수 없다. 

 

 


Inside [ ] blocks, several -test style boolean operators are available. These should be avoided in favour of [[ ]] and the above operators.

[] 블럭 안쪽에는 몇몇의 -test 스타일의 boolean operator들이 유효하다. [[]]의 사용을 선호하고 위의 operator들은 피해야 한다. 


Bash Iterative Structures

Bash 반복 구조


There are a few simple iterative structures available from within bash. The most useful of these is a for loop. This can be used to perform the same task upon multiple items.

bash 내에 사용할 수 있는 몇몇 간단한 반복문들이 있다. 대개 사용하는 것이 for 루프이다.  이것은 여러 항목에 동일한 작업을 수행하는데 사용될 수 있다. 

 

 

for myvar in "the first" "the second" "and the third" ; do

    einfo "This is ${myvar}"

done

 

 


There is a second form of the for loop which can be used for repeating an event a given number of times.

이벤트가 지정된 횟수만큼 반복 사용될 수 있는 for 루프의 두번 째 형태가 있다. 

 

 

for (( i = 1 ; i <= 10 ; i++ )) ; do

    einfo "i is ${i}"

done

 


 

There is also a while loop, although this is usually not useful within ebuilds.

또한 비록 ebuilds내에서 일반적으로 사용하진 않지만 while 루프가 있다. 

 

 

while hungry ; do

    eat_cookies

done

 

 


This is most commonly used to iterate over lines in a file:

이것은 가장 일반적으로 파일의 행을 반복하는데 사용된다. 

 

 

while read myline ; do

    einfo "It says ${myline}"

done < some_file

 

 


See die and Subshells for an explanation of why while read < file should be used over cat file | while read.

왜 while read < file은 cat file | while read 를 사용해야 하는지에 대한 설명을 위해 die and Subshells를 참조해라.


Bash Variable Manipulation

Bash 변수 조작


There are a number of special ${} constructs in bash which either manipulate or return information based upon variables. These can be used instead of expensive (or illegal, if we're in global scope) external calls to sed and friends.

각각의 조작이나 변수들의 기본 정보 반환하는 것으로 bash에서는 약간의 틀별한 ${} 구조가 있다. 

* a number of : 얼마간의(some)

댓글