그냥 사는 이야기

리눅스 bash 확장과 인용 본문

Development/개발언어

리눅스 bash 확장과 인용

없다캐라 2020. 10. 12. 18:49
반응형

리눅스 커맨드 라인 완벽 입문서의 7. 확장과 인용 챕터를 정리한 내용입니다. 항상 보고 나면 까먹어서 정리를 해보았습니다.

bash 정복의 좋은 길잡이

확장과 인용

echo 명령어만 사용하여 설명함.

확장

$ echo this is a test
this is a test

경로명 확장

$ ls
Playground  cute_dog.txt  ls.txt
$ echo *
Playground cute_dog.txt ls.txt
$ echo *t
cute_dog.txt ls.txt
$ echo [[:upper:]]*
Playground
$ echo /usr/*/share
/usr/local/share

틸드 (~ ) 확장

$ echo ~
/home/ubuntu

산술 확장

산술확장의 형태는 아래와 같다.

$((expression))

$ echo $((2 + 3))
5
$ echo $(($((5**2)) * 3))
75

중괄호 확장

$ echo Front-{A,B,C}-Back
Front-A-Back Front-B-Back Front-C-Back
$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
$ echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b
$ mkdir {2018..2020}-0{1..9} {2018..2020}-{10..12}
$ ls
2018-01  2018-05  2018-09  2019-01  2019-05  2019-09  2020-01  2020-05  2020-09
2018-02  2018-06  2018-10  2019-02  2019-06  2019-10  2020-02  2020-06  2020-10
2018-03  2018-07  2018-11  2019-03  2019-07  2019-11  2020-03  2020-07  2020-11
2018-04  2018-08  2018-12  2019-04  2019-08  2019-12  2020-04  2020-08  2020-12

매개변수 확장

커맨드라인보다 쉘 스크립트에서 더 유용한 기능

$ echo $USER
ubuntu

사용 가능한 변수 목록 보기

printenv | less

명령어 치환

$ echo $(ls)
Playground cute_dog.txt ls.txt pictures
$ ls -l $(which cp)
-rwxr-xr-x 1 root root 153976 Sep  5  2019 /usr/bin/cp

혹은 과거의 bash에서는 backtick을 사용할 수도 있다.

$ ls -l `which cp`
-rwxr-xr-x 1 root root 153976 Sep  5  2019 /usr/bin/cp

따옴표(Quoting) 활용

쌍 따옴표 기호

아래의 2 경우를 살펴보면

$ echo this is a      test
this is a test
$ echo The total is $100.00
The total is 00.00

불필요한 공백이 사라지며 $1이 변수로 처리되어 빈 문자열로 치환되었다. 이럴 때는 쌍따옴표를 사용한다.

$ ls -l "my records.txt"
-rw-r--r-- 1 ubuntu ubuntu 7 Oct 12 16:53 'my records.txt'

쌍따옴표는 특수한 기호들이 가진 의미가 없어지고 일반적인 문자들로 인식된다. 단, $, , ' 기호는 예외

$ echo "$USER $((2+3)) $(cal)"
ubuntu 5     October 2020
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

쌍따옴표 속에서 new line은 그대로 인정된다. 아래의 경우를 비교해 보면 이해가 더욱 잘 될 것이다.

$ echo $(cal)
October 2020 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

$ echo "$(cal)"
    October 2020
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

따옴표 기호 비교

$ echo text ~/*.txt {a,b} $(echo foo) $((2+3)) $USER
text /home/ubuntu/cute_dog.txt /home/ubuntu/ls.txt /home/ubuntu/my records.txt a b foo 5 ubuntu
$ echo "text ~/*.txt {a,b} $(echo foo) $((2+3)) $USER"
text ~/*.txt {a,b} foo 5 ubuntu
$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+3)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+3)) $USER

따옴표가 없는 것에서 쌍따옴표, 홑따옴표로 갈수록 확장이 없어지는 것을 확인할 수 있다.

Escape Character

확장을 피하고 싶다면 이스케이프 문자()를 사용하여 단건에 대해서 사용 가능

$ echo "USER $USER : \$100.00"
USER ubuntu : $100.00

위의 예에서 보면 $USER는 치환되었지만 $100.00 은 그대로 나왔다. 그리고 $,!, &, (공백) 문자를 파일명으로 사용하고 싶을 때 아래처럼 할 수 있다.

$ mv origin_name origin\ name

echo에 -e 옵션은 이스케이프 문자를 해석한다. (혹은 $' ')

$ sleep 10; echo -e "Time's up\a"
Time's up
$ sleep 10; echo -e "Time's up" $'\a'
Time's up
Comments