|
CS/Shell/Perl/Python 2013. 8. 13. 10:27
원문 : http://unixhelp.ed.ac.uk/scrpt/scrpt2.2.2.html
Name |
Description
|
$1 - $9 |
위치 파라미터의 값
|
$0 |
현재 실행되고 있는 command의 이름
|
$# |
위치 파라미터의 개수
|
$? |
가장 마지막에 실행된 command의 exit status
|
$$ |
현재 shell의 pid
|
$! |
background 에서 가장 마지막에 실행된 pid
|
$-
|
the current options supplied to this invocation of the shell |
$* |
a string containing all the arguments to theshell, starting at $1 |
$@ |
same as above, except when quoted |
CS/Shell/Perl/Python 2011. 6. 8. 16:43
원문 : GNU make
8.4 Functions for Conditionals
조건 표현을 제공하는 세 가지 함수가 있다. 모든 인자가 초기에 확장되지 않는다는 것이 이 세 함수의 중요한 면이다. 인자 중 확장되기를 원하는 인자만이 확장된다.
- $(if condition, then-part [,else-part])
if함수는 함수적 문맥에서 조건적 확장에 대한 지원을 제공한다.
첫 번째 인자인 condition은 먼저 모든 시작과 끝의 공백 문자를 제거하고, 그 이후에 확장된다. 만약 확장이 non-empty 문자열이라면 그 조건은 참으로 간주되며, 그렇지 않은 경우 거짓으로 간주된다.
만약 조건이 참이라면 두 번째 인자인 then-part가 평가되고, 이것이 if 함수 전체 평가의 결과로 사용된다.
만약 조건이 거짓이라면 세 번째 인자인 else-part가 평가되고, 이것이 If 함수 전체 평가의 결과로 사용된다. 만약 세 번째 인자가 없다면, if 함수는 아무것도 평가하지 않는다.
주의할 것은 오직 the-part나 else-part만 평가되고, 두 부분이 모두 평가되지 않는다는 것이다. 따라서 side-effect가 발생할 수 있다.
- $(or condition1 [, condition2 [, condition3 ...]])
or 함수는 "short-circuiting" OR 연산을 제공한다. 각 인자는 순서대로 확장된다. 만약 인자가 non-empty 문자열로 확장된다면 처리는 멈추고 그 확장의 결과가 결과 문자열이 된다. 만약 모든 인자가 확장되었고 모두가 거짓(empty)이라면, 확장의 결과는 빈 문자열이다.
- $(and condition1 [, condition2 [, condition3 ...]])
or 함수는 "short-circuiting" AND 연산을 제공한다. 각 인자는 순서대로 확장된다. 만약 인자가 empty 문자열로 확장된다면 처리는 멈추고 그 확장의 결과가 결과 문자열이 된다. 만약 모든 인자가 non-empty string으로 확장되었다면, 확장의 결과는 마지막 인자의 확장이 된다.
.
CS/Shell/Perl/Python 2011. 6. 8. 15:18
원문 GNU make
7.1 Example of a Conditional
다음 예제는 CC변수가 gcc인 경우에 make가 라이브러리들 중 하나의 셋을 사용하게 하고, gcc가 아닌 경우에는 다른 라이브러리 셋을 사용하게 한다.
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
혹은, 다음과 같이 변수를 조건부로 할당하고, 변수를 명시적으로 사용할 수도 있다
libs_for_gcc = -lgnu
normal_libs =
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
foo: $(objects)
$(CC) -o foo $(objects) $(libs)
7.2 Syntax of Conditionals
syntax는 else가 없는 다음의 가장 간단한 형태부터 else를 포함한 두가지 형태가 있다.
conditional-directive
text-if-true
endif
conditional-directive
text-if-true
else
text-if-false
endif
conditional-directive
text-if-true
else
text-if-false
else
text-if-false
endif
조건을 테스트하는데는 다음의 4가지 지시자가 있다
- ifeq
- iffeq (qrg1, arg2)
- ifeq 'arg1' 'arg2'
- ifeq "arg1" "arg2"
- ifeq "arg1" 'arg2
- 'ifeq 'arg1' "arg2"
arg1과 arg2에 있는 변수의 참조를 모두 확장하여 그들을 비교한다. 만약 일치한다면 text-if-true 가 적용된다.
- ifneq
- ifneq (qrg1, arg2)
- ifneq 'arg1' 'arg2'
- ifneq "arg1" "arg2"
- ifneq "arg1" 'arg2'
- ifneq 'arg1' "arg2"
arg1과 arg2에 있는 변수의 참조를 모두 확장하여 그들을 비교한다. 만약 일치하지 않는다면 text-if-true 가 적용된다.
- ifdef variable-name
name은 변수에 대한 레퍼런스가 아니라 변수의 이름을 나타낸다.
bar = true
foo = bar
ifdef $(foo)
frobozz = yes
endif
$(foo)는 확장되어 bar가 되고, bar는 참조가 아니라 이름으로 간주된다.
만약 variable-name이 non-empty 값이 아니라면 text-if-true 가 적용된다.
ifdef는 변수를 확장하여 그 값이 비어있는지는 확인하지 않는다(그 이름이 정의 되어 있는지만 확인). non-empty인지 확인하기 위해서는 ifeq($(foo),)를 사용한다.
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
sets ‘frobozz’ to ‘yes’, while:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
sets ‘frobozz’ to ‘no’.
- ifndef variable-name
만약 vraiable-name이 empty 값이라면, text-if-true 가 적용된다.
7.3 Conditionals that Test Flags
findstring 함수와 함께 MAKEFLAGS 변수를 사용하여 -t 와 같은 make command flags를 테스트하는 조건을 쓸 수 있다.
이것은 touch가 파일을 갱신하는데 충분하지 않을 때 유용하다.
findstring 함수는 한 문자열이 다른 부분 문자열로 나타나는지 확인한다. 만약 '-t' 플래그에 대해서 테스트하길 원한다면, 첫번째 문자열로 't'를 사용하고 비교할 다른 문자열로 MAKEFLAGS의 값을 사용한다.
다음은 아카이브 파일을 갱신하는 것에대해 마킹하는것을 종료하기 위해 'ranlib -t'를 사용하는것을 어떻게 정리하는지를 보여준다.
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
'+' 접미어는 명령행 라인이 '-t' 플래그를 사용했음에도 불구하고 실행될 수 있게 하기 위해 "recursive" 하다는 것을 표시한다. (Section 5.7 Recursive Use of make 참고)
CS/Shell/Perl/Python 2011. 6. 8. 06:52
원문 : GNU make
6.1 Basics of Variable References
변수 이름에는 대문자를 사용하는 것이 관행이다.
하지만, makefile 안에서 internal purpose 을 수행하는 것은 소문자를 사용하고, 암묵적인 규칙을 제어하는 파라매터나 컴맨드 옵션에서 사용자가 오버라이드 해야만 하는 파라메터에 대해서는 대문자로 예약할 것을 것을 권장 한다.
$(foo) 나 ${foo} 와 같이 변수 이름을 () 나 {}로 감사고 $를 붙여서 참조할 수 있다.
6.2 The Two Flavors of Variables
GNU make 에서는 변수가 값을 갖도로 하는 네 가지 방법이 있다.
- recursive expanded variable
이 종류의 변수는 '='를 통해서 정의하거나(Section 6.5 [Setting Variables] 참고), define 지시자를 통해서 정의될 수 있다.
만약 다른 변수에 대한 참조를 포함하고 있다면, 이 참조는 이 변수가 치환될 때마다 확장된다.
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:;echo $(foo)
에서 $(foo)는 $(bar)로 확장되고, 이것은 다시 $(ugh)로 확장되어, 최종적으로 Huh? 로 확장될 것이다.
이 종류의 변수는 모든 다른 make에서도 지원한다. 하지만
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
CFLAGS = $(CFLAGS) -O
와 같이 한 경우, 변수 확장에 의해 무한 루프를 돌게 된다.
- expanded variable
변수가 정의될 때 어떤 다른 변수나 함수에 대한 참조를 확장하여 한번만 스캔 되고 확장된다. 즉, 이 변수가 정의 되었을 때의 값을 가진다.
x := foo
y := $(x) bar
x := later
는,
y := foo bar
x := later
와 같다.
- ?=를 이용해서 변수가 정의되어 있지 않을때만 정의할 수 있다.
FOO ?= bar 는
ifeq ($(origin FOO), undefined)
FOO = bar
endif
와 동일하다.
만약 bar 가 정의되어 있지 않았을 때 FOO = bar 와 같이 한다면, FOO는 empty value로 정의된 상태가 된다.
- +=를 이용하여 이미 정의된 변수의 값에 추가로 문자를 더할 수 있다.
objects = main.o foo.o bar.o utils.o
objects += another.o
+=를 사용하는 것은 :=를 다음과 같이 사용하는 것과 유사하다.
objects = main.o foo.o bar.o util.o
objects := $(objects) another.o
만약 +=로 덧붙일 변수가 이전에 정의되어 있지 않았다면, +=는 =(recursively-expanded variable)과 동일하게 동작한다.
6.3 Advanced Features for Reference to Variables
- substitution reference
지정한 대치값으로 변수의 값을 치환한다. $(var:a=b) 혹은 ${var:a=b}와 같은 형식으로 사용되며, var 변수에 있는 a로 끝나는(다음에 whitespace가 나오는 a) 모든 a를 b로 치환한다.
foo := a.o b.o c.o
bar := $(foo:.o=.c)
는 bar 를 a.c b.c c.c 로 치환한다.
이는, 사실상 patsubst(Section 8.2 [Functions for String Substitution and Analysis] 참고) 함수 확장의 축약형이다. patsubst 함수의 모든 기능을 사용하기 위해서는 $(var:%a=%b)와 같이 %를 덧붙임 형태를 사용해야 한다.
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
는 $(patsubst .o,.c,$(var))와 동일하다.
- computed variable name (nested variable reference)
변수들은 변수의 안에 있는 이름으로 참조될 수 있다. 이를 computed variable name 혹은 nested variable reference라고 한다. 예를 들어
x = y
y = z
a :=$($(x))
에서 $($(x)는 $(y)가 되어, 결국 z가 된다.
혹은 재귀적으로
x = $(y)
y = z
z = Hello
a := $($(x))
에서 $($(x)) 는 $($(y))가 되고, 이것은 $(z) 가 되어, 결국 Hello가 된다.
Nested variable 참조는 변경된 참조나 함수 실행(Chapter 8 [Functions for Transforming Text] 참고) 등을 포함할 수 있다. 예를 들어 subst 함수를 사용하여
x = variable1
variable2 := Hello
y = $(subst 1,2,$(x))
z = y
a := $($($(z))))
$($($(z)))는 $($(y))가 되고, y는 variable2의 값을 가지게 되기 때문에, $(variable2)가 되어, 결국 Hello를 정의하게 된다.
computed variable name은 하나의 변수 참조로 이루어질 필요는 없다. 예를 들어
a_dirs := dira dirb
1_dirs := dir1 dir2
a_files :=filea fileb
1_files :=file1 file2
ifeq "$(use_a)" "yes"
a1 := a
else
a1 := 1
endif
ifeq "$(use_dirs)" "yes"
df := dirs
else
dif := files
endif
dirs := $($(a1)_$(df))
$(a1) 이 a를 정의하고 $(df)가 dirs를 정의한다면, a_dirs가 되어 dirs 는 $(a_dirs)가 되어 결국,
dirs := dira dirb
를 정의하게 된다.
computed variable name은 치환 참조에서도 사용될 수 있다.
a_objects := a.o b.o c.o
1_objects := 1.o 2.o c.o
sources := $($(a1)_objects:.o=.c)
는 a1이 어떤것을 가리키느냐에 따라
sources := a.c b.c c.c
혹은
sources :=1.c 2.c 3.c
가 될 수 있다.
또한, computed variable name을 변수 대입의 왼편이나 define 지시자에서 사용할 수 있다.
dir = foo
$(dir)_sources := $(wildcard $(dir)/*.c)
define $(dir)_print =
lpr $($(dir)_sources)
endef
이는 foo_sources와 foo_print를 정의한다.
CS/Shell/Perl/Python 2011. 4. 24. 15:50
참고:
http://serverfault.com/questions/72476/clean-way-to-write-complex-multi-line-string-to-a-variable
BASH
cat <<EOF
This is
Multiline
String.
EOF
read -d '' VAL<<EOF
This is
Multiline
String.
EOF
PERL
my $VALUE =<<ENDVALUE;
This is
Multiline
String.
ENDVALUE
my $VALUE = "This is
Multiline
String.
";
CS/Shell/Perl/Python 2011. 4. 15. 13:14
원문: http://www.bayview.com/blog/2003/02/12/non-greedy-regular-expressions/
$src = "www.google.com"
$www = ($src =~ /(.*)\./ && 1);
과 같이 할 경우 기본적으로 greedy matching이 되기 때문에
$www = "www.google" 이 된다.
방법 1.
$www = ($src =~ /([^.]*)\./ && 1);
방법 2.
.*? 혹은 .+? 를 사용하여 Non-greedy matching 시킨다.
$www = ($src =~ /(.*?)\./ && 1);
CS/Shell/Perl/Python 2011. 3. 14. 16:42
원문 : StackOverflow
참고 :
#!/usr/bin/perl
use strict;
use warnings;
my %replace = (
quick => "slow",
lazy => "energetic",
);
my $regex = join "|", keys %replace;
$regex = qr/$regex/;
my $s = "The quick brown fox jumps over the lazy dog";
$s =~ s/($regex)/$replace{$1}/g;
print "$s\n";
/A(dam|nne|ndrew)/
와 같은 정규식이 있다고 할때, $1이 생성되고, 이는 dam, nne, ndrew등의 값을 가지게 된다. 만약 이후에 괄호가 있다면 그에 일치하는 값이 $2, $3, ...의 변수에 할당된다.
/A(?:dam|nne|ndrew)/
와 같이 ?:를 사용할 경우 해상 괄호에 대해서는 그에 일치하는 변수를 생성하지 않는다.
CS/Shell/Perl/Python 2011. 3. 14. 13:42
참고
${#string}
${string:position}
$string에서 position에 있는 substring
만약 $string 파라메터가 "*"나 "@"이면 position에서 시작하는 위치 매개변수를 추출해 낸다.
${string:position:length}
$string에서 position부터 length까지의 substring
stringZ=abcABC123ABCabc
# 0123456789.....
# 0-based indexing.
echo ${stringZ:0} # abcABC123ABCabc
echo ${stringZ:1} # bcABC123ABCabc
echo ${stringZ:7} # 23ABCabc
echo ${stringZ:7:3} # 23A
${string#substring}
$string의 앞 부분에서 가장 짧게 일치하는 $substring을 삭제
${string##substring}
$string의 앞 부분에서 가장 길게 일치하는 $substring을 삭제
stringZ=abcABC123ABCabc
# |------| shortest
# |----------------| longest
echo ${stringZ#a*C} # 123ABCabc
echo ${stringZ##a*C} # abc
${string%substring}
$string의 뒷 부분에서 가장 짧게 일치하는 $substring을 삭제
${string%%substring}
$string의 뒷 부분에서 가장 길게 일치하는 $substring을 삭제
stringZ=abcABC123ABCabc
# || shortest
# |------------------| longest
echo ${stringZ#b*c} # abcABC123ABCa
${string/substring/replacement}
처음 일치하는 $substring을 $replacement로 대치. $string 자체가 변화되지는 않는다.
${string//substring/replacement}
일치하는 모든 $substring을 $replacement로 대치. $string 자체가 변화되지는 않는다.
stringZ=abcABC123ABCabc
echo ${stringZ/abc/xyz} # xyzABC123ABCabc
# Replaces first match of 'abc' with 'xyz'.
echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
# Replaces all matches of 'abc' with # 'xyz'.
# Can the match and replacement strings be parameterized?
match=abc
repl=000
echo ${stringZ/$match/$repl} # 000ABC123ABCabc
# ^ ^ ^^^
echo ${stringZ//$match/$repl} # 000ABC123ABC000
# ^ ^ ^^^ ^^^
# What happens if no $replacement string is supplied?
echo ${stringZ/abc} # ABC123ABCabc
echo ${stringZ//abc} # ABC123ABC
${string/#substring/replacement}
$substring이 $string의 맨 앞에서 일치하면 $replacement로 대치.
${string/%substring/replacement}
$substring이 $string의 맨 뒤에서 일치하면 $replacement로 대치.
stringZ=abcABC123ABCabc
echo ${stringZ/#abc/XYZ} # XYZABC123ABCabc
# Replaces front-end match of 'abc' with 'XYZ'.
echo ${stringZ/%abc/XYZ} # abcABC123ABCXYZ
# Replaces back-end match of 'abc' with 'XYZ'.
CS/Shell/Perl/Python 2010. 8. 29. 23:58
원문 : Perl 프로그래밍 (2nd Ed)
$_
: 기본 입력 및 패턴 일치 공간. 다음 각 쌍은 동일한 효과를 갖는다.
while (<>) { ... }
while (defined($_ = <>)) { ...}
/^Subject:/
$_ =~ /^Subject:/
chop
chop($_)
$.
: 가장 최근에 읽은 파일 핸들의 현재 입력 행 번호.
: 명시적으로 파일 핸들을 닫으면 이 값을 리셋하는 효과가 있다.
: <>는 명시적으로 파일 핸들을 닫지 않으므로, ARGV로 지정된 파일에 대해서는 행 번호는 계속 증가한다.
: $.를 지역화하는 것은 Perl이 최근에 읽어 들인 파일 핸들을 지역화하는 효과가 있다.
$/
: 입력 레코드 구분자로 기본값은 개행 문자이다.
: 만약 널 문자열로 지정되면 빈 줄(blank line)을 구획문자로 취급한다.
: 여러 개의 글자를 구획문자로 사용하기 위해서 여러 개의 글자로 이루어진 문자열을 지정할 수도 있다.
undef $/;
$_ = <FH>; # whole file now here
$,
: print 연산자에 적용되는 출력 필드 구분자이다.
: 보통 print 연산자는 쉼표로 구분된 필드를 출력한다.
: awk에서와 비슷하게 동작하도록 하려면, awk의 OFS 변수를 지정해서 출력될 필드를 구분하는 것과 마찬가지 방법으로 이 변수를 지정하면 된다.
$\
: print 연산자에 적용되는 출력 레코드 구분자이다.
: 보통 print 연산자는 쉼표로 구분된 필드를 출력하며, 뒤에는 개행 문자나 레코드 구분자가 없다고 가정한다.
: awk에서와 비슷하게 동작하도록 하려면, awk의 ORS 변수를 지정해서 print의 마지막 부분에 출력될 내용을 지정하는 것과 같이 이 변수를 지정하면 된다.
$*
: 이 변수는 겹 따옴표 문자열에서 치환되는 리스트 값에 적용된다는 점만 제외하고는 $,와 동일하다.
: 기본값은 스페이스 이다.
$;
: 다차원 배열 연산에서의 첨자 구분자이다.
: 만약 다음과 같이 해쉬 요소를 참조하는 경우
실제로는 다음을 의미한다.
$foo{join($;, $a, $b, $c)}
: 그러나 다음과 같이 할 경우
실제로는 다음을 의미하게 되므로 주의하여야 한다.
($foo{$a}, $foo{$b}, $foo{$c})
$^L
: 쪽 넘김시 출력될 내용을 지정한다.
: 기본값은 "\f" 이다.
$:
: 문자열이 나뉘어 질 때 출력서식문에서 ^로 시작하는 연속 필드를 채우는데 사용되는 문자의 세트를 지정한다.
: 기본값은 "\n-" 이다.
$^A
: format 행에 대한 write accumulator의 현재값을 나타낸다.
: formline을 포함하는 출력서식문을 사용하여 결과를 $^A에 넣도록 할 수 있다.
: 출력서식을 알아낸 다음 write는 $^A의 내용을 출력한 다음 $^A를 비운다. 따라서 formline을 사용하지 않고서는 $^A의 값을 알아낼 수 없다.
$?
: 가장 최근에 닫은 파이프, 백틱(`) 명령, 혹은 system 연산자 등에서 반환된 결과를 담고 있다.
: 실제로 이 값은 wait(2) 시스템 호출에 의해 반환된 상태이므로, 서브프로세스의 종료값은 실제로 ($? >> 8)에 해당한다.
: 따라서 많은 시스템에서 $? & 255 하면 프로세스로부터 어떤 시그널이나 코어 덤프의 발생 여부를 알 수 있다.
$!
: 숫자 구문에서 사용될 경우 현재 실행중인 Perl에서 errno변수의 현재 값을 재공한다.
: 문자열 구문에서 사용될 경우, 해당되는 시스템 오류 문자열을 제공한다.
$@
: 가장 최근의 eval 명령어를 수행한 결과 발생한 문법 오류 메세지를 담고 있다.
: 최근 eval 명령어가 정상적으로 수행되어 오류가 발생하지 않았다면 널 값을 갖는다.
$$
: Perl이 현재 스크립트를 수행하는 프로세스 번호
$<
: 현재 프로세스의 실 user ID (uid)
: set-id 루틴을 지원할 때만 지정할 수 있다.
$>
: 현재 프로세스의 유효 uid
: set-id 루틴을 지원할 때만 지정할 수 있다.
$(
: 현재 프로세스의 실 GID
: set-id 루틴을 지원할 때만 지정할 수 있다.
$)
: 현재 프로세스의 유효 GID
: set-id 루틴을 지원할 때만 지정할 수 있다.
$0
: 현재 수행 중인 Perl 스크립트를 포함하고 있는 파일의 이름.
: $0에 값을 대입하여 ps 프로그램이 참조하는 영역을 변경할 수 있다.
: 이것은 현재 수행중인 프로그램을 숨기는 것보다 현재 프로그램의 상태를 나타내는 방법으로 유용하게 쓰인다. 그러나 모든 시스템에서 이처럼 동작하지는 않는다.
$]
: 현재 Perl의 버전 + 패치레벨/1000을 반환한다.
$^D
: 디버깅 플래그의 현재 값
$^F
: 시스템 파일 기술자(system file descriptor)의 최대값으로, 기본적으로 2 이다.
$^H
: 특정 pragmatic 모듈에 의해 활성화 되는 내부 컴파일러 힌트값 (이 값은 무시하고 pragma문을 사용하라)
$^I
: inplace_edit 확장의 현재 값. inplace 편집을 활성화하려면 undef를 사용한다.
$^O
: 현재 Perl 바이너리가 컴파일된 시스템 운영체제 이름. Config 모듈 대신 사용할 수 있는 간단한 방법이다.
$^P
: 디버거가 자기 자신을 디버그하지 않도록 클리어하는 내부 플래그.
: 사용자가 이 값을 클리어하여 확실하게 디버그를 하지 않도록 할 수 있다.
$^T
: 1970년부터 시작하여 해당 스크립트가 실행된 시간을 초 단위로 환산한 값.
: -M, -A, -C와 같은 파일 테스트 연산자는 이 값에 근거한다.
$^W
: 현재 경고 스위치의 값
$^X
: 실행된 Perl 바이너리 자신의 이름. C엑서의 argv[0]에 해당
$ARGV
: <ARGV>로부터 읽어 들일 때 현재 파일의 이름
@ARGV
: 해당 스크립트에 대한 명령어 행 파라미터를 담고 있는 배열.
: $#ARGV는 파라미터의 수-1 을 담고 있고, $ARGV[0]는 프로그램의 이름이 아니라 전달된 첫 번째 파라미터를 담고 있다는 것을 주의.
: 프로그램의 이름은 $0을 참조 하라.
@INC
: Perl 스크립트가 do EXPR, require, use 구조를 사용할 때 참조해야 하는 위치 리스트를 담은 배열.
: 초기에는 -I 명령어 행 스위치에 해당하는 값과, 기본 Perl 라이브러리의 위치를 포함하고 있다.
: 현재 디렉토리를 참조하려면 "."를 추가하면 된다.
: 실행시 @INC 리스트를 변경할 필요가 있을 때는, 시스템과 관련된 라이브러리 모듈을 제대로 불러 들이기 위해 다음과 같이 lib모듈을 사용해야만 한다.
use lib '/mypath/libdir/';
use SomeMod;
@F
: -a 스위치가 사용되얼을 때 입력 행이 split되어 입력되는 배열.
: -a 스위치가 사용되지 않으면 이 배열은 특별한 의미가 없다.
%INC
: do나 require를 통해 포함된 각 파일의 파일명을 담고 있는 해쉬.
: 키는 사용자가 지정하는 파일명이고, 값은 실제로 해당 파일을 찾은 위치를 갖고 있다.
: require 명령을 사용할 때, 이 값을 참조하여 주어진 파일의 포함 여부를 결정한다.
%ENV
: 현재 환경 변수의 값.
: %ENV의 값을 변경하면 자식 프로세스의 환경을 바꾸게 된다.
: 환경 변수에서 특정한 값을 없애려면 undef 대신 delete를 사용해야 한다.
%SIG
: 다양한 시그널을 처리하기 위한 시그널 핸들러에 의해 사용되는 해쉬.
sub handler {
local($sig) = @_;
print "Caught a SIG$sig--shutting down\n";
close(LOG);
exit(0);
}
$SIG{INT} = 'handler';
$SIG{QUIT} = 'handler';
$SIG{INT} = 'DEFAULT'; # restore default action
$SIG{QUIT} = 'IGNORE'; # ignore SIGQUIT
: $SIG{__WARN__} 로 지정된 루틴은 경고 메세지가 출력될 때 호출된다. 경고 메세지는 첫 번째 파라메터로 전달된다.
- 후크가 존재하면 일반적으로 STDERR로 출력되던 경고 메세지가 출력되지 않게 된다.
: $SIG{__DIE__} 로 지정된 루틴은 치명적 예외 처리가 수행될 때 호출된다. 오류 메세지는 첫 번째 파라메터로 전달된다.
- 후크 루틴에서 반환될 때, 후크 루틴 자신이 goto나 루프 종료, die등에 의해 종료되지 않는 경우, 예외 처리 루틴은 마치 해당 후크가 없었던 것처럼 동작한다.
- __DIE__ 핸들러는 호출된 동안 명시적으로 비활성되어, __DIE__ 핸들러에서 실제 die를 호출할 수 있게 된다.
ARGV
: @ARGV에 포함된 명령어 행 파일명에 대해 반복적으로 수행되는 특수한 파일 핸들.
: 보통 널 파일 핸들 <>로 표히된다.
STDERR
: 임의의 패키지에서 표준 오류를 위한 특수 파일 핸들.
STDIN
: 임의의 패키지에서 표준 입력을 위한 특수 파일 핸들.
STDOUT
: 임의의 패키지에서 표준 출력을 위한 특수 파일 핸들.
DATA
: 스크립트를 포함하는 파일에서 __END__ 토큰 다음에 나타나는 임의의 내용을 참조하는 특수 파일 핸들.
: 혹은, __DATA__ 를 찾는 같은 패키지에서 데이터를 읽는 동안 필요로 하는 파일 내에 __DATA__ 토큰 바로 다음에 나타나는 임의의 내용을 위한 파일 핸들.
_
: 가장 최근의 stat, lstat, 파일 테스트 연산 결과에 관한 정보를 캐쉬하기 위해 사용되는 특수 파일 핸들.
$digit
: 가장 최근에 일치된 순서대로 괄호에 해당하는 일치된 문자열을 포함하고 있다. (\digit 와 같은 형태로도 사용된다.)
$&
: 가장 최근에 성공적으로 일치된 문자열이며, 블록 내에서 감추어져 일치된 내용이나 현재 블록에서 eval로 둘러 싸여 있는 내용은 포함하지 않는다.
$`
: 가장 최근에 성공적으로 일치된 문자열의 앞부분에 해당하는 문자열이며, 블록 내에서 감추어져 일치된 내용이나 현재 블록에서 eval로 둘러 싸여 있는 내용은 포함하지 않는다.
$'
: 가장 최근에 성공적으로 일치된 문자열의 뒷부분에 해당하는 문자열이며, 블록내에서 감추어져 일치된 내용이나 현재 블록에서 eval로 둘러 싸여 있는 내용은 포함하지 않는다.
$+
: 가장 최근의 일치 패턴에 의해 마지막 괄호로 일치된 문자열이며, 실제로 어떤 교대 문자열이 일치되었는지를 모를 경우에 유용하다.
$|
: 0이 아닌 값으로 지정하면 핸재 선택된 출력 채널로 매번 write 나 print가 행해질 때마다 fflush을 수행하도록 한다.
: 기본값은 0이며, 이것은 많은 시스템에서 터미널로 출력을 의미하는 경우 STDOUT은 기본적으로 라인 버퍼링으로, 그 밖의 경우 블록 버퍼링으로 처리되는 것을 의미한다.
: 이 변수의 값을 지정하는 것은 rsh에서 Perl 스크립트를 실행하면서 그 출력 결과를 보고 싶을 때와 같은 경우 유용하다.
$%
: 현재 선택된 출력 채널의 현재 쪽 번호
$=
: 현재 선택된 출력 채널의 출력 가능한 줄의 수. 기본값은 60
$-
: 현재 선택된 출력 채널의 쪽에서 남아 있는 줄 수
$~
: 현재 선택된 출력 채널에 적용될 출력서식의 이름. 기본값은 파일 핸들의 이름
$^
: 현재 선택된 출력 채널에 적용될 머리글 출력서식의 이름. 기본값은 파일 핸들에 _TOP을 붙인 것
CS/Shell/Perl/Python 2010. 8. 18. 00:11
원문 : Perl 프로그래밍 (2nd Ed)
참고 : http://gypark.pe.kr/wiki/Perl/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D
m/PATTERN/gimosx
/PATTERN/gimosx
n. /를 구분자로 사용할 경우 패턴 앞에 위치하는 m은 지정하지 않아도 된다. m을 사용하는 경우, 영문자나 공백 문자가 아닌 임의의 문자를 구분자로 사용할 수 있다.
n. 주어진 문자열에서 패턴을 검색하고, 그 결과로 스칼라 구문에서 참(1)이나 거짓("")을 반환한다.
n. 스칼라가 아니라 리스트 값을 필요로 하는 구문에 사용될 경우, 일치된 결과는 패턴 내에서 괄호로 지정된 재참조 문자열의 리스트를 반환한다.
만약, 패턴 일치가 실패하면, 널 리스트가 반환된다. 패턴이 일치했더라도 패턴 내에 괄호로 지정된 재참조 문자열이 없으면 리스트값 (1) 이 반환된다.
if (($F1, $F2, $F3) = ($foo =~ /^\s*(\S+)\s+(\S+)\s*(.*)/))
n. =~ 나 =!에 문자열을 지정하지 않았을 경우에는 기본 문자열 변수 $_를 검색한다.
변환자 g
: 전역 패턴 일치(global pattern matching)를 지정한다. 즉, 주어진 문자열 내에서 가능한 여러 번 패턴 일치를 찾게 된다.
: 만약, 괄호가 하나도 없는 경우는 마치 전체 패턴을 괄호로 둘러싼 것과 같이 일치된 문자열 모두로 이루어진 리스트를 반환하다.
: 스칼라 구문에서 사용하면 매번 주어진 문자열과 일치할 때마다 참을 반환하고, 일치가 모두 끝나면 거짓을 반환한다.
($one, $five, $fifteen) = (`uptime` =~ /(\d+\.\d+)/g);
변환자 i
: 대소문자를 구별 없이 패턴 일치
변환자 m
: 문자열을 여러 줄로 취급(^와 $는 \n과 일치)
변환자 s
: 문자열을 한 줄로 취급(^와 $는 \n을 무시, 그러나 .는 \n과 일치)
변환자 x
: 정규 표현식을 분석할 때 역슬래쉬가 붙지 않은 공백 문자나, 문자 클래스 내에 들어있는 공백 문자를 무시하도록 한다.
: 공백문자와 주석문을 이용해 패턴의 가독성을 늘릴 때 사용
s/PATTERN/REPLACEMENT/egimosx
n. 주어진 문자열에서 PATTERN을 찾으면, 일치된 것을 REPLACEMENT와 바꾸고 실제 교환된 것의 개수를 반환한다.
/g 변환자를 사용할 경우에는 교환된 개수가 1 보다 클 수 있다.
일치되지 않은 경우에는 거짓(0)을 반환한다.
n. 임의의 비 알파벳 문자, 비 공백 문자를 / 대신 구분자로 사용할 수 있다.
만약, PATTERN을 괄호 등과 같이 한 쌍으로 이루어진 구분자로 묶을 경우, REPLACEMENT는 PATERN에서 사용한 것과 다른 구분자를 사용할 수 있다.
s(foo)(bar)
혹은
s<foo>/bar/
n. 만약 구분자로 홑 따옴표를 사용하면, PATTERN이나 REPLACEMENT에 해당하는 부분에서 변수 치환은 일어나지 않는다.
홑 따옴표 이외의 문자를 구분자로 사용하는 경우에는 $를 문자열의 마지막 여부를 판단하는 문자가 아니라 변수로 생각하여, 패턴 검색시마다 변수 치환이 일어난다.
$_ = 'abc123xyz';
s/d+/$&*2/e; # yields 'abc246xyz'
s/\d+/sprintf("%5d", $&)/e; # yields 'abc 246xyz'
s/\w/$& x 2/eg; # yields aabbcc112233xxyyzz'
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
n. y는 tr과 같은 표현이다.
n. SEARCHLIST에 주어진 문자별로 하나씩 살펴보면서, SEARCHLIST에 속하는 문자가 발견되면 해당 문자를 REPLACEMENTLISTd에 해당하는 문자와 바꾼다.
n. 실제로 교환되거나 지워진 글자의 숫자를 반환한다.
n. 한 글자에 대해 여러 가지로 변환될 수 있을 경우에는 가장 처음 것만이 사용된다.
$_ = "AAABCAADEFS";
tr/AAA/XYZ/; # $_ 는 'XXXBCXXDEFS'
변환자 c
: SEARCHLIST의 문자 세트가 반전된다.
: 즉, 실제로는 SEARCHLIST에 포함되지 않은 문자에 대해서 검색이 이루어진다.
변환자 d
:
SEARCHLIST에 지정되어있으나 REPLACEMENTLIST에 주어지지 않은 글자(즉, 찾았으나 교환되지 않은 문자)는 삭제된다.
: 만약 d 변환자를 사용하지 않은 경우, 만일 REPLACEMENTLIST가 SEARCHLIST 보다 짧으면 REPLACEMENTLIST의 마지막 글자가 필요한 숫자만큼 반복된다.
$_ = "abc123";
tr/ab/A/; # $_ 는 "AAc123"
tr/ab/A/d; # $_ 는 "Ac123"
변환자 s
: 같은 글자로 변환되는 일련의(연속되는) 문자는 한 글자로 압축된다.
^
: 문자열의 시작에서 일치 (/m 사용시 행의 시작에서 일치)
$
: 문자열의 끝에서 일치 (/m 사용시 행의 끝에서 일치)
\b
: 단어의 경계에서 일치 (\w 와 \W 사이)
\B
: 단어 경계를 제외한 곳에서 일치
\A
: 문자열의 시작에서 일치
\Z
: 문자열의 끝에서 일치
\G
: 이전의 m//g가 남긴 부분에서 일치
(?:...)
: (...)와 같은 기능을 하나 재참조 문자열을 만들지는 않는다.
(?=...)
: ...부분과 미리 일치(패턴에는 포함되지 않음)
(?!...)
: ...부분과 미리 불일치 (패턴에는 포함되지 않음)
: /foo(?!bar)/는 "bar"가 바로 뒤에 오지 않는 임의의 "foo"와 일치한다.
: 하지만 /(?!foo)bar/ 와 같이 하여 "bar"앞에 "foo"가 아닌 것이 오는 것과 일치하도록 할 수는 없다.
: 위의 예는 다음과 같이 처리할 수 있다.
if (/foo/ and $` !~ /bar$/)
\a : 알람(비프 음)
\n : 개행 문자
\r : carriage return
\f : formfeed
\t : 탭 문자
\e : 이스케이프 문자
\d : [0-9]
\D : [^0-9]
\w : [a-zA-Z_0-9]
\W : [^a-zA-Z_0-9]
\s : [ \t\n\r\f]
\S : [^ \t\n\r\f]
$+
: 맨 마지막 괄호와 일치한 것을 반환한다.
$&
: 일치된 전체 문자열을 반환한다.
$`
: 일치된 문자열 앞의 모든 것을 반환한다.
CS/Shell/Perl/Python 2010. 8. 17. 01:30
참고
open(FILE, ">:encoding(UTF-8)", "data");
CS/Shell/Perl/Python 2010. 8. 16. 12:44
#!/usr/bin/perl
use Time::HiRes qw(ITIMER_REAL setitimer);
$SIG{ALRM} = sub {
print "Alarm\n";
};
setitimer(ITIMER_REAL, 0.1, 5);
while (1)
{
sleep ;
print "Main Loop\n";
}
CS/Shell/Perl/Python 2010. 8. 13. 21:57
참조 : http://www.computing.net/answers/unix/sed-newline/5640.html
리눅스에서는
$ echo Hello_World | sed 's/_/\n/'
Hello
World
로 정상적으로 동작한다.
그러나 Mac OSX의 sed(GNU sed 가 아닌 전통적인 sed - OSF1) 에서는 new line을 직접 quote시켜 주면 된다고 한다. 워~
$ echo Hello_World | sed 's/_/\
> /'
CS/Shell/Perl/Python 2010. 8. 12. 14:46
find manpage
-regex pattern
: True if the whole path of the file matches pattern using regular expression.
: To match a file named "./foo/xyzzy", you can use the regular expression ".*/[xyz]*" or ".*/foo/.*", but not "xyzzy" or "/foo/".
manpage에 잘 나와있는데, 제대로 읽어보지도 않고 고생만 했다.
find 시 항상 하던데로 매칭을 "*.html" 과 같이 한것이 원인이었다.
-name과 같이 명시적으로 파일 이름만을 매칭 시키는 것이 아니기 때문에, 전체 패스를 매칭 시켜야 한다.
다음은, html, htm, xhtml, xhtm 파일을 매칭시키는 구문
HTML_FILES=$(find "$SOURCE_WWW_PATH" -iregex ".*\.x\{0,1\}html\{0,1\}")
혹은 -E(extended regular expression)을 사용하여
HTML_FILES=$(find -E "$SOURCE_WWW_PATH" -iregex ".*\.x?html?")
CS/Shell/Perl/Python 2010. 8. 12. 14:09
FILES=$(find path -name "*.gz")
으로 파일을 찾아 루프로 넘기는 경우
for file in "$FILES"
do
...
done
FILES에 공백 문자가 포함된 경우("/root/some path/somefile")
file에는 /root/some 과 path/somefile 이 넘어오게 된다.
이런 경우, find는 \n으로 각 파일패스를 구분하므로, 구분자를 바꾸어 준다.
FILES=$(find path -name "*.gz")
IFS=$'\n"
for file in "$FILES"
do
...
done
CS/Shell/Perl/Python 2010. 8. 12. 14:02
path/to/delete 폴더 밑의 모든 파일,폴더를 삭제할 경우
#!/bin/bash
$folders="/path/to/delete"
rm -rf "$folder/*"
과 같이 /* 까지 quote 시키면 삭제되지 않는다.
(*이 재해석 되는 것인지... 그렇다고 rm -rf '/path/to/delete/*' 로 quote를 해주어도 동작하지 않는것을 보면 globbing 문제 때문인것 같지는 않은데...)
#!/bin/bash
$folders="/path/to/delete"
rm -rf "$folder"/*
* 부분을 quote시키지 않은 경우 정상적으로 동작한다.
CS/Shell/Perl/Python 2010. 8. 11. 16:20
man page:
-i extension
: Edit files in-place, saving backups with the specified extension.
: If a zero-length extension is given, nobackup will be saved. It is not recommended to give a zero-length extension when in-place editing files, asyou risk corruption or partial content in situations where disk space is exhausted, etc.
-i 를 사용할 경우 extension이 지정되어야 하므로
$ sed -i -e 's/string/sub/' file
과 같이 사용할 경우 extension이 없어 error가 발생한다.
따라서, 다음과 같이
$ sed -i '' -e 's/string/sub/' file
zero-length extension을 지정하여 백업 파일을 생성하지 않고 in place editing을 할 수 있다.
CS/Shell/Perl/Python 2010. 8. 5. 09:58
참조
Evaluate a conditional expression expr. Each operator and operand must be a separate argument. Expressions are composed of the primaries described below in Bash Conditional Expressions. test does not accept any options, nor does it accept and ignore an argument of -- as signifying the end of options.
When the [ form is used, the last argument to the command must be a ].
Expressions may be combined using the following operators, listed in decreasing order of precedence. The evaluation depends on the number of arguments; see below.
! expr
: True if expr is false.
( expr )
: Returns the value of expr. This may be used to override the normal precedence of operators.
expr1 -a expr2
: True if both expr1 and expr2 are true.
expr1 -o expr2
: True if either expr1 or expr2 is true.
산술 비교
val1 -eq val2
: 변수 val1과 변수 val2 같은 경우 true
val1 -ne val2
: 변수 val1과 변수 val2 다른 경우 true
val1 -qt val2
: 변수 val1이 변수 val2 보다 큰 경우 true
val1 -lt val2
: 변수 val1이 변수 val2 보다 작은 경우 true
val1 -ge val2
: 변수 val1이 변수 val2 보다 크거나 같은 경우 true
val1 -le val2
: 변수 val1이 변수 val2 보다 작거나 가은 경우 true
파일 검사
-b
: 파일이 존재하고 블록장치(플로피, 시디롬, ...)인 경우 true
-c
: 파일이 존재하고 캐릭터 장치 파일인 경우 true
-d
: 파일이 존재하고 디렉토리인 경우 true
-h
: 파일이 심볼릭 링크
-L
: 파일이 심볼릭 링크
-S
:파일이 소켓
-t
: 파일 디스크립터가 터미널 디바이스와 연관이 있음
: 스크립트의 표준입력([ -t 0 ])이나 표준출력([ -t 1 ])이 터미널인지 아닌지를 확인하는데 쓸 수 있습니다.
-f
: 파일이 존재하고 보통 파일(디렉토리나 디바이스 파일이 아님)인 경우 true
-h
: 파일이 존재하고 한 개 이상의 심볼릭 링크가 설정된 경우 true
-p
: 파일이 존재하고 파이프인 경우 true
-s
: 파일이 존재하고 0보다 큰 경우 true
-g
: 파일이 존재하고 SetGID가 설정된 경우 true
-u
: 파일이 존재하고 SetUID가 설정된 경우 true
-k
: 파일이 존재하고 Sticky bit가 설정된 경우 true
-r
: 파일이 존재하고 읽기 가능한 경우 true
-w
: 파일이 존재하고 쓰기가 가능한 경우 true
-x
: 파일이 존재하고 실행 가능한 경우 true
-O
: 자신이 소유자임
-G
: 그룹 아이디가 자신과 같음
-N
: 마지막으로 읽힌 후에 변경 됐음
file1 -nt file2
: file1 파일이 file2 파일보다 최신임
file1 -ot file2
: file1 파일이 file2 파일보다 예전것임
file1 -ef file2
: file1 파일과 file2 파일이 같은 파일을 하드 링크하고 있음
문자열 비교
-z string
: 문자열의 길이가 0인 경우 true
-n string
: 문자열의 길이가 0이 아닌 경우 true
string1 = string2
: 문자열 string1과 string2가 일치하는 경우
string1 != string2
: 문자열 string1과 string2가 일치하지 않는 경우
string : 문자열이 NULL이 아닌 경우
CS/Shell/Perl/Python 2010. 7. 27. 14:42
원문 : 고급 Bash 스크립팅 가이드
1. 위치 매개 변수
$0, $1, $2, etc.
: 위치 매개변수로서, 명령어줄에서 스크립트로 넘겨지거나 함수로 넘겨지거나 set 명령어로 강제로 설정됨.
$#
: 명령어줄 인자의 갯수나 위치 매개변수들
$*
: 한 낱말로 표시되는 위치 매개변수들 모두
$@
: $*과 똑같지만 각 매개변수는 쿼우트된 문자열로 취급됩니다. 즉, 해석되거나 확장없이 있는 그대로 넘겨집니다. 그 결과로 각 인자는 각각이 서로 다른 낱말로 구분돼서 표시됩니다.
2. 내장 변수
$GROUPS
: 현재 사용자가 속해 있는 그룹. /etc/passwd에 적혀 있는 현재 사용자의 그룹 아이디 값을 보여줍니다.
$HOME
: 사용자의 홈 디렉토리로, 보통은 /home/username (예 9-10 참고)
$IFS
: 입력 필드 구분자
: 디폴트는 공백문자(빈칸, 탭, 뉴라인)지만 콤마로 구분된 데이타 파일을 파싱하려는 경우처럼 변경이 가능. $*는 $IFS의 첫번째 문자를 사용하는 것에 주의
ex)
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
$PATH
:실행 파일의 경로, 보통은 /usr/bin/, /usr/X11R6/bin/, /usr/local/bin, 등등.
$PPID
: 어떤 프로세스의 부모 프로세스의 프로세스 아이디(pid)
$UID
: 사용자 아이디 값. /etc/passwd에 저장되어 있는 현재 사용자의 사용자 식별 숫자
$PS1
: 명령어줄에서 볼 수 있는 메인 프롬프트.
$PS2
: 2차 프롬프트로, 추가적인 입력이 필요할 때 ">" 로 표시됨.
$PS3
: 3차 프롬프트로 select 루프문에서 표시됨.
$PS4
: 4차 프롬프트로, 스크립트에 -x 옵션이 걸려서 실행될 때 스크립트의 매 줄마다 "+"로 표시됨.
$PWD
: 작업 디렉토리(현재 있는 디렉토리)
3. 특수 매개변수
$-
: 스크립트로 넘겨진 플래그들
$!
: 백그라운드로 돌고 있는 가장 최근 작업의 PID (process id)
$_
: 바로 이전에 실행된 명령어의 제일 마지막 인자로 설정되는 특수 변수.
$?
: 명령어나 함수, 스크립트 자신의 종료 상태.
$$
: 스크립트 자신의 프로세스 아이디로 보통 임시 파일 이름을 만들 때 사용.
CS/Shell/Perl/Python 2010. 6. 4. 10:29
Internal Macro
$*
: 확장자가 없는 현재의 목표 파일(Target)
$@
: 현재의 목표 파일(Target)
$<
: 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일 이름
$?
:현재의 목표 파일(Target)보다 더 최근에 갱신된 파일이름
|