개인 열람용 포스팅...
terminal 에서 사용할 시 명령어 정리
쉘 스크립트는
변수, 명령어, 문자열을 구분하지 않고 코드가 쓰여지기 때문에
환경 변수가 들어가는 작업, 파일 관련 작업, 복합적인 작업 등에 쓰일 수 있다.
심지어
bo=Yes
abc="echo Is this possible? $bo"
$abc
라고 쓰면
Is this possible? Yes
라고 출력해준다. ("와 '는 차이가 있으니 주의. 아래에서 찾아볼 것)
입력해준 변수는 실행되고 있는 터미널 내에서 유효하다.
(변수에 값을 할당할 때 "="좌우에 띄어쓰면 안 됨)
1. 입력 문자 지우기
ctrl+w = 단어 단위로 지우기
ctrl+u = 행 단위로 지우기
2. help
man 명령어
ex) man clear
3. 경로
/ = root 절대위치
otherwise 상대위치
. = current
.. = 상위
4. 파일/폴더 명에
공백 문자 사용 불가
대소문자 구분
.로 시작하는 파일/폴더는 숨김파일로 간주
5. 디렉터리 관련
pwd = 현재 경로
ls
-a = all 숨김 파일 볼 때는 이걸로( .*인 파일은 이렇게 해야 보임)
-F = kind, /directory *executable, @symbolic link
-R = 하위까지 보기
-d = information
-l = detail, - general, d directory, l symbolic link,
b block device file, c sector device file, p pipe file, s socket
ex) -rw-rw-r--, -rwx-rwx-r-x, (파일종류)(rwx소유자)(rwx그룹)(rwx기타)
-L = symbolic의 경우 원본으로 출력
-1 = 한 줄 씩 출력
-d */ = 폴더만 출력(하는 편법)
ex) ls -aF
ex) ls -I'*.o' 대문자 i를 이용해서 해당 명칭을 제외하고 출력, 붙여씀에 주의
ex) ls -I*.f90
mkdir _ _ _
mkdir -p _/_/_ = 중간에 없는 폴더는 자동으로 만듦
rmdir = 폴더 삭제
6. 출력
cat -n
more = 화면 단위 출력
less = 화면 단위 출력+스크롤 기능(j, k, ^f=space, ^b)
7. 복사
cp A B
cp -r A B = A가 폴더면 -r이 필요
cp A1 A2 A3 B = B는 폴더, [-i = 덮어쓰기 질문 띄움]
8. 이동
mv A B
9. 삭제
rm A
10. 링크
ln 원본 링크 = 하드링크 추가, rm은 하드링크를 지우는 역할, -s=symbolic link
11. 검색
(1) 파일 검색
find 경로 -name 문자열 = 현재 및 하위 폴더에서 파일 검색
-name : 대소문자 구분
-iname : 대소문자 구분 안 함
ex) find -name bands.*
whereis
which
(2) 파일 내용 검색
grep [] 문자열 파일 = 파일내에 문자열 검색
-n = 행 번호 표시
-v = 매치하지 않는 행 표시
-e = or
-i = ignore case (대소문자 구분 안 함)
-r = 하위 디렉터리 검색
grep ~ | grep ~ = and 기능으로 응용할 시
ex) grep main *.f90 -i
ex) grep -rni bands
단, -r 의 경우 파일명 지정해주기가 어렵다. 지정해주더라도 파일명에 디렉터리가 포함되어야 되기 때문에 별 의미가 없다. ex) grep -r 'bands' ./*/*/*/*.f90 = 현재로부터 3개 디렉터리를 내려가 .f90으로 끝나는 파일 검색.
12. 문서편집
(1) vi와 모드
vi 시작 ----> 명령 모드 --->i(커서 앞), a(커서 뒤),I(칼럼 앞), A(칼럼 뒤),o(행앞),O(행뒤) --입력 모드
esc/ del/...........<-----------------------------------------------
|
zz 저장 종료 | 마지막 행모드(:./.?) (/는 검색)
vi 종료 ------| :q 종료 , :q! 강제 종료, :wq 저장종료, ........
(2) 커서 이동
화살표, H,M,-,+,L hjkl, ew,....................
(3) 수정
r = 글자 수정
cw = 단어 수정, #cw
s = esc까지 수정, #s
cc = 행수정
C = 커서부터 행 수정
(4) 삭제
x = 커서 위치 글자 삭제, #x
dw = 단어, #dw
dd = 행
D = 커서부터 행 끝까지
(5) 취소
u = 취소
U = 행 명령 취소
:e! = 버리고 다시 작업
(6) 복사
yy = 행 복사, #yy
p = 아래쪽에 붙이기
P = 위쪽에 붙이기
dd = 잘라내기
(7) shell로 전환
^z = shell로 전환, 돌아올 때는 fg 입력
:! 명령어 = shell 명령어 실행
:sh = shell로 전환 돌아올 때는 exit 입력
(8) 검색
/문자열 = 아래로 검색
?문자열 = 위로 검색
n = 다음, N = 이전
(9) 바꾸기
:s /문자열1/문자열2/ = 행에서 첫번째를
:%s /문자열1/문자열2/g = 전체에서 모두를
:3,4s /문자열1/문자열2/ = 3,4 행에서 첫번째를
:3,4s /문자열1/문자열2/gc = 3,4 행에서 모두를, 물어가며
(10) 특징
:set nu = 행 번호 띄우기, :set nonu 는 해제
편집모드에서 방향키 작동 안 됨
Del 은 입력모드에서 명령 모드로 전환 및 명령 모드에서 back space 기능
backspace 입력 모드에서 커서를 뒤로 이동 기능, 뒤로 이동 된 후 입력 시 insert 상태로 입력됨
명령모드에서 명령 입력 과정은 화면에 출력되지 않음
(11) 여러창 띄우기
:sp 파일명 = 상하
:vsp 파일명 =좌우
(12) 복잡하게 생각할 것 없이
vim을 설치하고 여러 환경 변수를 설정해준다음에 쓰자...
13. Shell
(1) 출력
echo 문자열 = 문자열 출력, "" 써도 되고 안 써도 되고, -n 행바꿈 안 함
printf 형식 인수 = C언어 printf 기능, echo와 달리 줄바꿈은 수동
ex) printf "abc = %d\n" 100
(2) 특수문자
* = wild card
ex) ls *, cp *.txt ../ch3, ls -l h*d
?, [문자] = 한 문자 의미
ex) ls -l tmp[135].txt, ls -l tmp[1-3].txt, ls [0-9]*, ls[A-Za-z]*[0-9]
~ = 현재 작업중인 home 디렉터리
~user1 = user1의 home 디렉터리
- = cd 명령 이전 디렉터리
ex) cp *.txt ~/ch3, cd -, cp ~user2/linux.txt
; = 차례로 실행, ex) date;ls;pwd
| = 왼쪽 명령의 실행 결과를 오른쪽 명령의 입력으로 전달
ex) ls -al / | more = 루트 디렉터리의 상세정보를 한 화면씩 출력
''는 모든 특수문자를 문자열로 간주
""는 $,``,\를 제외한 특수문자를 문자열로 간주
ex) echo '$SHELL' = $SHELL, echo $SHELL=echo "$SHELL"=/bin/bash
``(back quotation) = `` 안의 문자열을 명령어로 해석, ''와 다르니 주의
ex) echo "Today is `date`"
\+특수문자 = 특수문자를 문자로 인식
(2) 출력 리다이렉션
> = 파일로 출력
>> = 파일로 출력, 뒤에 이어 쓰기
set -o noclobber 파일 덮어 쓰기 금지 모드
set +o noclobber 파일 덮어 쓰기 금지 해제
ex) cat을 이용한 파일 쓰기
cat > out1.txt
ubuntu test
Have a good time
^D
cat out1.txt
ex) ls > ls_out.txt = ls_out.txt를 포함한 결과가 쓰여짐...
2> = 오류 리다이렉션
ex) ls /asdfasdf 2> ls_err.txt
ex) ls /asdfasdf > ls_out.txt 2> ls_err.txt
/dev/null = 리눅스 특수 파일로 전달된 모든 내용은 사라짐
ex) ls /asdfasdf 2> /dev/null = 오류 출력을 하지 않음
2>&1 = 2번 파일 디스크립터를 1번으로 리다이렉션
ex) ls /asdfasfd 1> ls_out.txt 2>&1
< = 입력 리다이렉션
ex) cat out1.txt = cat < out1.txt = cat 0< out1.txt
ex) tr "b" "X" < input1.txt = "b"를 "X"로 바꾸어 출력하는데 이를 input1.txt를 받아 처리
14. Shell 문법
(1) 시동 셸 지정하기
#!/bin/bash = #은 보통 주석이나 이 경우는 시동을 의미, 여러 셸 중 bash를 이용함을 명시
(2) 실행 방법
일반적인 파일의 경우 "./파일명" 으로 실행
셸 스크립트의 경우
source 파일명 = 현재 환경에서
. 파일명 = source
bash 파일명 = 새로운 bash를 이용하여
로 실행(./파일명으로 실행하는 것이 아님)
셸 스크립트를 실행가능하게 만들기
chmod +x mybash1 = mybash1를 ./mybash1로 입력해서 실행 가능하게 변경해 줌
PATH를 추가해서 "mybash1"으로 실행하기
PATH=$PATH:$HOME/mybin
단 이 경우는 bash를 닫으면 사라진다.
계속 적용되게 할 경우는
.bashrc (bash 실행 시)또는
.bash_profile (로그인 시)를 수정 후
source .bashrc
source .bash_profile
를 실행
(3) 인수 받기
받은 인수를 셸에서 처리할 때
$# = 인수의 수
$@ = 모든 인수를 공백으로 구분하여 표기 ($*도 쓰이나 $@가 선호됨)
ex) 어디에 쓰는가 하면 . multiplecat file1 file2 file3 == cat $@ = 이렇게 쓸 수 있음
$1, $2, $3, $(10), $(11) = n 번째 인수값
shift = 인수를 하나 씩 왼쪽으로 밀음.
(4) 제어문
##if##
if 조건문 #=(주의 할 것! 정상 실행이면 0이고 참이다. 이상 종료이면 1이고 거짓이다.)
then
###
elif 조건문; then
###
else
###
fi
조건문에 -test 조건 또는 [ '조건' ]으로 쓸 수 있다.(단 [ ] 은 조건과 띄어 쓸 것)
여기에서 조건은 test가 지원하는 다양한 판정 유형이다.
! = not
-a = and
-o = or
== = equal
-eq, -ne, lt,-le,-gt,ge
명령1 && 명령2 = 명령1을 실행하고 참이면 명령2도 실행하여 판별
명령1 || 명령2 = 명령1을 실행하고 거짓이면 명령2도 실행하고 판별
문법 주의 : then 이 조건문 다음 줄로 가므로 세미 콜론 사용에 유의
문법 주의 : 비교 기호에서 좌우 띄어 쓸 것
##for##
for 변수 in 리스트
do
###
done
break #Abandon the loop.
continue #Go to next iteration of i in the loop and skip following statements
리스트 aa bb cc 와 같은 방식으로
ex)
#!/bin/bash
date
for myvar in $(date)
do
echo $myvar
done
=> date를 이루는 단어별로 출력
시퀀스
bash version 3.0+, {1..5}
bash version 4.0+, {START..END..INCREMENT} #..에 주의
변수 포함해서
(( c=1; c<=5; c++ ))
consisting of an initializer (EXP1), a loop-test or condition (EXP2), and a counting expression (EXP3).
##case##
case word in
경우1)
###
; ;
경우2)
###
; ;
*)
###
; ;
esac
##while##
while 조건문
do
###
done
(5) 수치 계산
expr n1 + n2
expr n1 - n2
expr n1 \* n2
expr n1 / n2
expr n1 % n2
뒤에 이어 써도 됨.
ex) n1 = `expr n1 + n2`, n1 = $(expr n1 + n2)
(6) 널 명령어
: = 널 값으로 참이다.
(7) 인수 받기
read n1 = n1에 넣을 값을 입력하기를 기다린다.
(8) 스크립트 내 데이터 만들기
ex) grep $1 << stop문자열; 01 2; 02 3; 03 5; 04 7; 05 9; 06 11; 07 13; stop문자열
15. shell 변수
(1) array
"$listOfNames" 와 $listOfNames 차이
for databaseName in "$listOfNames"
은 줄 단위로 변수 인식
for databaseName in $listOfNames
공백 및 줄 단위로 변수 인식
(2) assign
${var:=value}
변수에 할당 된 것이 없으면 할당해줌
+--------------------+----------------------+-----------------+-----------------+
| | parameter | parameter | parameter |
| | Set and Not Null | Set But Null | Unset |
+--------------------+----------------------+-----------------+-----------------+
| ${parameter:-word} | substitute parameter | substitute word | substitute word |
| ${parameter-word} | substitute parameter | substitute null | substitute word |
| ${parameter:=word} | substitute parameter | assign word | assign word |
| ${parameter=word} | substitute parameter | substitute null | assign word |
| ${parameter:?word} | substitute parameter | error, exit | error, exit |
| ${parameter?word} | substitute parameter | substitute null | error, exit |
| ${parameter:+word} | substitute word | substitute null | substitute null |
| ${parameter+word} | substitute word | substitute word | substitute null |
+--------------------+----------------------+-----------------+-----------------+
https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash
(3) edit
Remove Pattern (Front of $VAR)
${var#Pattern}
${var##Pattern}
#은 앞에서부터 가장 짧은 패턴을 지움
##은 앞에서부터 가장 긴 패턴을 지움
Remove Pattern (Back of $VAR)
${var%Pattern}
${var%%Pattern
pattern에 * 사용가능
앞부터 또는 뒤부터 같은 문자열이 있을 경우만 잘라낸 값을 반환
var=abcd
echo ${var#b}
#이면 abcd를 반환되어 효과가 없음
(4) Find And Replace
${varName/Pattern/Replacement}
활용
y=/etc/resolv.conf
cp "${y}" "${y/.conf/.conf.bak}"
${varName//Pattern/Replacement}
replace all matches of patterns
(5) substring starting character
${parameter:offset}
${parameter:offset:length}
${parameter:offset}는 앞에서부터 offset 번째까지 제외하고 출력
${parameter:offset:length} 는 앞에서부터 offset 번째까지 제외하고 length 만큼 문자열을 출력
(6) shift
shift
arrary에서 앞쪽 인수 하나를 버림
(7) error
${var:?”Error Message”}
변수 설정이 되어있지 않은 경우 Error Message 부분을 출력함
(8) length
${#var}
변수길이 출력
(9) 조건문
[ ]
http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
-z string
True if the length of string is zero.
-n string
string
True if the length of string is non-zero.
string1 == string2
string1 = string2
True if the strings are equal.
-d file
True if file exists and is a directory.
-e file
True if file exists.
-f file
True if file exists and is a regular file.
(10) 명령줄에서 인수 받기
ex)
makereport -u jsmith -p notebooks -d 10-20-2011 -f pdf
while getopts u:d:p:f: option
do
case "${option}" in
u) USER=${OPTARG};;
d) DATE=${OPTARG};;
p) PRODUCT=${OPTARG};;
f) FORMAT=$OPTARG;;
esac
done
같은 효과를 주도록
#!/bin/bash
# Use -gt 1 to consume two arguments per pass in the loop (e.g. each
# argument has a corresponding value to go with it).
# Use -gt 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
# note: if this is set to -gt 0 the /etc/hosts part is not recognized ( may be a bug )
while [[ $# -gt 1 ]]
do
key="$1"
case $key in
-e|--extension)
EXTENSION="$2"
shift # past argument
;;
-s|--searchpath)
SEARCHPATH="$2"
shift # past argument
;;
-l|--lib)
LIBPATH="$2"
shift # past argument
;;
--default)
DEFAULT=YES
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
echo FILE EXTENSION = "${EXTENSION}"
echo SEARCH PATH = "${SEARCHPATH}"
echo LIBRARY PATH = "${LIBPATH}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
echo "Last line of file specified as non-opt/last argument:"
tail -1 $1
fi
로 짤수도 있음
https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash
(11) unset
unset var
할당되지 않은 것과 값이 없는 것은 다르다.
+++우분투 단축키
ctrl+alt+T : 터미널
ctrl+alt+화살표 : 작업창 이동
ctrl+alt+shift+화살표 : 엑티브된 윈도우를 해당 작업창으로 이동
터미널에서
ctrl+s
를 (실수로) 눌러 터미널이 정지 상태가 되었을 때
ctrl+q
를 눌러 다시 작동 시킬 수 있다.
'etc. > etc. com' 카테고리의 다른 글
크롬 다운로드 버블 끄기 (v 119.0.6045.106) (0) | 2023.11.05 |
---|---|
[fortran 포트란 90/95] 포트란 기본 정리 (0) | 2017.06.27 |
[티스토리 블로그] 줄 바꿈 기준 변경하기 (0) | 2014.05.18 |