기본 콘텐츠로 건너뛰기

글

라벨이 bash인 게시물 표시

JQ로 JSON Object 만들기

Bash로 여러 스크립트에서 JSON Object 만들 때, Escape 처리가 꽤나 귀찮다. 이럴 때, JQ를 이용하면, 간편하게 JSON Object를 만들 수 있다. 참조:  https://stackoverflow.com/questions/48470049/build-a-json-string-with-bash-variables PARAM1='Hello, world!' PARAM2='"Double Quotes"' JSON_STRING=$( jq -n \ --arg PARAM1 "${PARAM1}" \ --arg PARAM2 "${PARAM2}" \ '{param1: $PARAM1, param2: $PARAM2}' ) 결과 { "param1": "Hello, world!", "param2": "\"Double Quotes\"" }

Bash 에서 줄 단위로 배열에 대입

Bash에서 여러 줄 데이터를 배열로 대입할 때마다 구글에 물어봤는데, 다시 찾기 귀찮아서 정리... Bash 4.x 이상 # mapfile과 readarray는 정확히 동일한 명령이며, readarray는 mapfile은 별칭(alias)이다. mapfile -t lines <<< ${multiline} # 중간에 띄어 쓰기가 있을 경우, 아래와 같은 형태를 사용한다. mapfile -t files < <(find . -type f) for file in "${files[@]}"; do echo "${file}" done Bash 3.x 이하 IFS=$'\n' read -d '' -r -a lines <<< ${multilines}

Sed 특정 문자열 포함 줄 제외하기

작업을 하다보면 sed를 많이 쓰는데, 특정 문자열을 포함하고 있으면 해당 줄을 넘기고 싶을 때가 있다. 넘기고자 하는 패턴에 명령어를 "n"을 붙이면 넘어간다. #!/bin/sed -Ef /\s?ldap\s?/n s/^(passwd:.*)/\1 ldap/g s/^(group:.*)/\1 ldap/g s/^(shadow:.*)/\1 ldap/g 참조:  https://www.gnu.org/software/sed/manual/sed.html

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=...

Bash에서 동적인 변수이름으로 변수에 접근하기

말이 어렵지만, val=${myval_$i} 형태를 사용하는 방법이다. 간단히는 ${!변수이름}으로 접근할 수 있다. #!/bin/bash val1=haha1 val2=haha2 for i in $(seq 1 2); do vname=val$i echo ${!vname} done 주의할 점은 ${!vname} 에서  vname 앞에는 달러($)가 붙지 않는다.

Bash 에서 프로세스 기다리기

Bash에서 자식 프로세스가 끝날 때까지 기다릴 때는 wait을 사용한다. $ help wait wait: wait [-n] [id ...] Wait for job completion and return exit status. Waits for each process identified by an ID, which may be a process ID or a job specification, and reports its termination status. If ID is not given, waits for all currently active child processes, and the return status is zero. If ID is a a job specification, waits for all processes in that job's pipeline. If the -n option is supplied, waits for the next job to terminate and returns its exit status. Exit Status: Returns the status of the last ID; fails if ID is invalid or an invalid option is given. 만약 기다려야할 프로세스가 여러개라면 for문을 이용해서 처리할 수 있다. #!/usr/bin/env bash pids="" for i in $(seq 1 5) do sleep 5 & pids[$i]=$! echo "pids[$i]="${pids[$i]} done echo "waiting..." for i in ${pids[*]} do echo "waiting... $i" wait $i echo "done... $i...

Bash Aliases

현재 개인적으로 사용하고 있는 ~/.bash_aliases 내용. [ $- != *i* ]] && return export TERM='screen-256color' export PATH=${PATH}:~/.local/bin export CXXFLAGS=-std=c++14 powerline-daemon -q POWERLINE_BASH_CONTINUATION=1 POWERLINE_BASH_SELECT=1 . /usr/share/powerline/bindings/bash/powerline.sh export EDITOR=vim alias apt='sudo apt' alias apt_info='apt-cache show' alias apt_qf='dpkg --search' function apt_instlist () { dpkg --list | tail -n +7 | awk '{print $2}' | sort -u } function apt_list () { apt-cache dumpavail | grep '^Package: ' | awk '{print $2}' | sort -u } function apt_r...

Ubuntu Bash에서 Powerline 적용하기

쉘에 예쁘장하게 보여주는 Powerline 이라는 프로젝트가 있다. <그림> Powerline Vim Screenshot 하악하악 아름다워! ... 하지만 설치는 쉽지 않다. 글꼴도 패치해야하고, 파이썬 모듈도 깔아야하고... RPM/DEB 패키지로 한 방에 설정까지 똑 떨어지지 않으면, 아무래도 차후 OS 업그래이드할 때, 귀찮아진다. 결국 OS 재설치로 이어지겠지만... # Bash에 적용하기!! 먼저 Ubuntu 15.04에 패키지를 살펴보았다. 엇! powerline이 있잖아!! 낼름 apt-get으로 설치해보자. $ sudo apt-get -y install powerline 헤헷... 쉽잖아!...면 블로깅 하지 않았겠지. orz OTL 적당히 계정 홈 디렉토리에 .bash_aliases 파일을 생성하고, 몇가지 명령을 때려 넣어주자. .bash_aliases 파일은 .bashrc를 통해 존재하면, 자동으로 실행하는 쉘 스크립트인데, Ubuntu에만 있으니까, Redhat계열은 적당히 .bashrc 등에 만들어주자. $ vi ~/.bash_aliases powerline-daemon -q POWERLINE_BASH_CONTINUATION=1  POWERLINE_BASH_SELECT=1 . /usr/share/powerline/bindings/bash/powerline.sh 거창하게 powerline-daemon도 띄우고, 스크립트도 실행해야한다. Redhat 계열은 맨 아래 스크립트 위치를 적당히 고쳐주자. 그리고 새 터미널 열면 끝~ # Vim에 적용하기! 많은 길을 걸어왔지만, 결국 vim-addon-manager에게 시키면 간단하다. $ sudo apt-get -y install vim-addon-manager $ sudo vim-addon-manager -w install powerline 다 하고 나서, 상태줄이 표시되지 않으면, ~...

누구 잘못인지 좌시하지 않겠다

풀리지 않던 수수께기가 오늘 풀렸다. 열심히 어떤 I/F를 호출하는데 인자로 'name'이 들어가야 한다. 그러나 오늘 vim으로 내가 짠 소스를 다시 까보니 'nmae'이라고 들어가 있었다. 분명히 난 'name'으로 썼단 말이다! 이것은 음모야! Linux, VIM, GCC, BASH 이 중에 하나야. 누구 잘못인지 좌시하지 않겠다! Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3525106

각종 편리한 BASH shell script 모음

http://bash.cyberciti.biz/ 원본 위치: http://purewell.egloos.com/3431219