자주 사용하는 Bash 명령어들을 정리해보았다.

Array

Associative Array

 

Loop

Dir

 

grep

grep with string replacement (xargs)

 

find

 

 

sed

 

for loop

  • bash

     
  • cmd

     

Argument (args)

  • bash

     
  • cmd


개인적으로 자주 쓰거나 참조하는 Python Code 를 정리해 보았다.

File

read lines with line separator

 

read lines without line separator

File path concatenation

Get Filename list

Create directory if it doesn’t exist

 

 

String operations

format

 Fast string concatenation

 

파이선 공부중 짧으면서 강력했던 기법들을 하나씩 정리해 보려 한다.


  • Assign each item in array into multiple variables (Warning : the size of array must be the same as the number of variables)


영어 형태소 분석기를 작성하면서 사용하는 스크립트 코드중,
영어 모음인지 체크하는 코드와,
모음 개수 판단하는 스크립트 코드를
간략하게 만들어 공개해본다.



원인 : Python은 기본 8bits char를 가정한다. string내부에 2byte character가 있는경우 에러 발생한다.

해결 : .encode("ENCODE_TYPE") 를 스트링 뒤에 붙이면 된다.
   (ex) fpout.write( str.encode("utf-8") ) 

Commands
  • git status로 나온 결과 리스트 중 특정 문자열 "CVS"를 포함하는 라인에서 파일명을 추출하여 git rm을 하고 싶을때
    $ git st | grep CVS | awk '{print $3}' | xargs git rm -f

  • 현재 경로로 부터 아래 폴더 내 파일까지 반복적으로 dos 형태의 파일을 unix형태로 바끄고 싶을 때.
    $ find . -exec dos2unix {} \;

Bash Shell
  • 파일명에 현재 날짜를 넣어서 생성하고 싶은 경우
    $(date +%Y%m%d)

  • 환경변수가 선언이 되어 있지 않거나 비어있는지 점검
    if [ -n "${VAR+x}" ] : VAR 가 선언되어 있지 않으면 fail
    if [ -n "${VAR:+x}" ] : VAR 가 선언되어 있지 않거나 비어있으면 fail
    if [ -n "${VAR-x}" ] : VAR 가 선언되어 있지 않으면 true
    if [ -n "${VAR:-x}" ] : VAR 가 선언되어 있지 않거나 비어있으면 true

  • 해당 디렉토리가 생성되어 있는지 점검
    if [ -n $CURRENT_DIR ]




1.8 에서 1.9 로 넘어오면서 왜이리 많이 바뀐겨...
레퍼런스에 설명도 잘 안되있어서... 

1.9 로 넘어오면서 ftools 에 있는 내용들이 거의 fileutils 로 통폐합 되었고, 사용법 일부가 바뀌었다.
버전별 require 나 사용 Class 를 바꾸고 싶은경우 RUBY_VERSION 을 이용하면 좋다.

Error : undefined method `copy' for File:Class (NoMethodError)
Version 1.8
 
require 'ftools'
 
File.copy(src, tar)
Version 1.9.1
 
require 'fileutils'
 
FileUtils.copy(src, tar)

bash script 에서 방금 전 수행한 명령의 exit status 를 읽어오는 변수( $? )가 있는데, 이를 이용하면 스크립트 수행중 에러 발견시 그 부분에서 stop 을 할 수 있다.

아래의 예를 보자
#!/bin/bash
echo "Test"
echo "Exit Status : " $?       # Exit Status is 0

;a3ker2l3krjekrjwlk;             #Unrecognized command.
echo "Exit Status : " $?       # Exit Status is Non-zero
0 이 아닌 값이 나오면 에러인데, 이는 사용하고자 하는 커맨드가 다르다. 만약 작성한 2개의 스크립트가 있고 한개의 스크립트(A라 하자)가 다른 한개(B라 하자) 내부에서 호출되는 경우, B 에 A의 exit status 를 알려주기 위해서 A 내부에는 반드시 exit 를 사용해야 한다. 아래의 예제를 보면 간단하게 이해할 수 있다.
<A.sh File>

#!/bin/bash
make
if [ $? -ne 0 ]; then
    exit $?
mkdir test
exit $?

<B.sh File>

#!/bin/bash
./A.sh
if [ $? -ne 0 ]; then
    exit $?
mkdir test2
exit $?


Personal Tag : How to stop in bash script when internal command occurs failure

예제 Script


if 문에서 인자 갯수가 1개 인지 확인하고 인자 값은 $1 으로 이용한다.

Reference Item


  • Argument 사용
  • String class method : gsub() , include? , chop
  • Dir 및 File 클래스 사용법
  • Random shuffle in Array


Senario


지정된 경로의 파일을 모두 읽어와서, 지정된 글자가 발견되면 그에 대응하는 다른 문자로 치환하여 지정된 갯수만큼 파일에 저장함.
 
 Source



Ruby forum의 내용을 인용하자면 ( written by Stefan )

이 알고리즘의 이름은 fisher-yates/knuth shuffle 이라고 하고, 현재의 값으로 다음 값을 예측할 수 없다고 한다.

또한 complexity 가 O(n) 이라서 일반적으로 sort_by { random } 으로 사용할 때의 O(nLogn) 보다 빠르다.




루비 인터프리터는 변수병의 첫글자를 보고 (클래스변수는 두글자)를 보고 변수의 종류를 판단한다.

변수명 표기법


First Charactor Variable type Defalut Value Example
[a-z] or _ Local variable 참조 전에 대입해야 함 localVal = 3
[A-Z] Constant 참조 전에 대입해야 함 Const = "TEST_CONST"
@ Instance variable nil @Instance = "instance"
$ Global variable nil $global += 1
@@ Class Variable 참조 전에 대입해야 함 @@classVal



$ 관련 기본 전역 변수


$! 최근 에러 메세지
$@ 에러 위치
$_ local scope, gets 를 이용해 최근에 읽은 문자열
$. interpreter로 읽은 최근 줄 번호
$& regexp (regular expresstion) 으로 매치된 최근 문자열
$~ local scope, MatchData 객체 (최근 매치에 대한 모든 정보를 담고 있음)
$n n 은 숫자, 최근 match 된 스트링중 패턴의 n번째 부분
$= case-insensitivity flag
$/ input record separator
$\ output record separator
$0 the name of the ruby script file
$* the command line arguments
$$ interpreter's process ID
$? 마지막에 종료한 child process 의 종료 status


+ Recent posts