본문 바로가기

os/linux

shell script 헷갈리는 arguments, ${}, $(), quotations 정리

기본 출력

  • echo
  • print
echo "Echo Test" # 자동 개행
printf "printf Test" # 자동 개행X
printf "%s %s" print test # 뒤에 오는 문자열들이 전달되는 인자라고 생각하면 됩니다.

스크립트 전달 인자 arguments

  • $# : 스크립트에 전달되는 인자들의 수(C언어에서 args)
  • $0 : 실행하는 스크립트의 파일명으로 실행했을 때 경로를 포함한다면 경로를 포함해서 나옵니다.
  • $1, $2 … : 스크립트로 전달된 인자들(C언어에서 argv[0], argv[1]…)
#!/bin/bash

echo "Echo Test"
printf "printf Test\n"
printf "Name of script : %s\n" $0
printf "%d arguments %s %s\n" $# $1 $2

${}와 $()의 차이

  • $(command) is “command substitution”
  • ${parameter} is “parameter substitution”

변수 선언

  • =를 이용해서 선언하고 $를 이용해서 사용
  • {}는 parameter substitution으로 $와 함께 감싼 부분에 변수를 대입해준다.
  • ""로 감싸서 사용하면 더 안전하다.(문자열에 공백도 포함해서 값을 이용할 수 있기 때문이다.) Ex) $ex -> "${ex}"
  • =는 공백 없이 붙여써야한다.
  • 지역변수에는 local을 붙인다.
#!/bin/bash

test="abc"
num=100

echo "${test}"
echo "${num}"

함수 선언

redirection & pipe

리눅스 리다이렉션 & 파이프(Linux redirection & pipe)

a | b

a < b

a > b

$ ls | grep a > ls-a.txt

logical operation

Simple logical operators in Bash

This is the idiomatic way to write your test in bash:

if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then

If you need portability to other shells, this would be the way (note the additional quoting and the separate sets of brackets around each individual test, and the use of the traditional = operator rather than the ksh/bash/zsh == variant):

if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then

삽질

Command output to variable

Redirecting command output to a variable in bash fails

OUTPUT=$(sudo apache2ctl configtest 2>&1)
echo $OUTPUT

Variable containing quotes in a command

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

Concatenating string variable

foo="Hello"
foo="${foo} World"
echo "${foo}"
> Hello World

# In general to concatenate two variables you can just write them one after another:
a='Hello'
b='World'
c="${a} ${b}"
echo "${c}"
> Hello World

3가지 quotation 차이

"" (double quotation

# $PATH will be expanded
$ echo "Path is $PATH"

# result
**Path is /usr/local/bin:/usr/bin:/usr/local/sbin (...)**

'' (single quotation)

# $PATH will not be expanded
echo 'Path is $PATH'

#result 
**Path is $PATH**

`` (backtick)

억음부호는 앞의 두 인용 기호와는 다른 쓰임새를 보이지만 전혀 다른 기능을 수행. 작은따옴표나 큰 따옴표와 다르게 인용이 아니고 명령어 전환(command substitution)에 쓰인다.

% echo the date is `date`

'os > linux' 카테고리의 다른 글

SSH 포트 포워딩 / 리모트 포트 포워딩 / 주의점  (0) 2021.03.23